XXTEA加密算法OC代码

头文件

########################################################################################################################

#import <Foundation/Foundation.h>

@interface NIPXXTEAUtil : NSObject


+(NSString *)encryptXXTEA:(NSString *)data withKey:(NSString *)key;

@end

########################################################################################################################

#import "NIPXXTEAUtil.h"

static int DELTA = 0x9E3779B9;

@interface NIPXXTEAUtil ()

@end

@implementation NIPXXTEAUtil

int MX(int sum, int y, int z, int p, int e, NSArray *k) {
    return ((unsigned int)z >> 5 ^ (unsigned int)y << 2) + ((unsigned int)y >> 3 ^ (unsigned int)z << 4) ^ (sum ^ y) + ([k[(p & 3) ^ e] intValue] ^ z);

}

+(NSString *)encryptXXTEA:(NSString *)data withKey:(NSString *)key
{
    NSString *md5_data = data;	//这里按需求做处理
    NSString *md5_key = [[key md5Digest] lowercaseString];
    NSData *result = [self encryptString:md5_data andKey:md5_key];
    NSString *resultStr = [result nip_Base64EncodedString];
    
    return resultStr;
}

+ (NSData *)encryptString:(NSString *)data andKey:(NSString *)key {
    NSData *dataByte = [data dataUsingEncoding:NSUTF8StringEncoding];
    NSData *keyByte = [key dataUsingEncoding:NSUTF8StringEncoding];
    return [self encryptDataByte:dataByte andKeyByte:keyByte];
}

+ (NSData *)encryptDataByte:(NSData *)dataByte andKeyByte:(NSData *)keyByte {
    if (dataByte.length == 0) {
        return dataByte;
    }
    NSArray *intDataArray = [self toIntArray:dataByte includeLength:YES];
    NSArray *intKeyArray = [self toIntArray:[self getFixedKey:keyByte] includeLength:NO];
    NSArray *result = [self encryptDataIntArray:intDataArray andKeyIntArray:intKeyArray];
    return [self toByteArray:result includeLength:NO];
}

+ (NSArray *)toIntArray:(NSData *)data includeLength:(BOOL)includeLength {
    int n = (int)(((data.length & 3) == 0) ? (data.length >> 2) : ((data.length >> 2) + 1));
    NSMutableArray *result;
    
    if (includeLength) {
        result = [NSMutableArray arrayWithCapacity:n + 1];
        for (int idx = 0; idx < n; idx ++) {
            [result addObject:@0];
        }
        [result addObject:@(data.length)];
    } else {
        result = [NSMutableArray arrayWithCapacity:n + 1];
        for (int idx = 0; idx < n; idx ++) {
            [result addObject:@0];
        }
    }
    n = (int)data.length;
    Byte *dataByte = (Byte *)[data bytes];
    for (int index = 0; index < n; ++index) {
        NSInteger elem = [result[index >> 2] integerValue];
        elem |= (0x000000ff & dataByte[index]) << (( index & 3 ) << 3);
        result[index >> 2] = @(elem);
    }
    return [result copy];
}

+ (NSData *)toByteArray:(NSArray *)dataArray includeLength:(BOOL)includeLength {
    int n = (int)dataArray.count << 2;
    
    if (includeLength) {
        int m = [dataArray[dataArray.count -1] intValue];
        n -= 4;
        if ((m < n - 3) || (m > n)) {
            return nil;
        }
        n = m;
    }
    Byte bytes[n];;
    for (int32_t idx = 0; idx < n; ++idx) {
        int temp = [dataArray[idx >> 2] intValue] >> ((idx & 3) << 3);
        bytes[idx] = (Byte)temp;
    }
    NSData *data = [NSData dataWithBytes:bytes length:n];
    
    return data;
}

+ (NSArray *)encryptDataIntArray:(NSArray *)intDataArray andKeyIntArray:(NSArray *)intKeyArray {
    int n = (int)intDataArray.count - 1;
    if (n < 1) {
        return intDataArray;
    }
    int p = 0;
    int q = 6 + 52 / (n + 1);
    int z = [intDataArray[n] intValue];
    int y = 0;
    int e = 0;
    int sum = 0;
    NSMutableArray *result = [NSMutableArray arrayWithArray:intDataArray];
    while (q-- > 0) {
        sum = sum + DELTA;
        e = (unsigned int)sum >> 2 & 3;
        for (p = 0; p < n; p++) {
            y = [result[p + 1] intValue];
            int temp = [result[p] intValue];
            z = temp + MX(sum, y, z, p, e, intKeyArray);
            result[p] = @(z);
        }
        y = [result[0] intValue];
        int temp = [result[n] intValue];
        z = temp + MX(sum, y, z, p, e, intKeyArray);
        result[n] = @(z);
    }
    return [result copy];
}

+ (NSData *)getFixedKey:(NSData *)orignalKey {
    if (orignalKey.length == 16) {
        return orignalKey;
    }
    Byte *byte = (Byte *)[orignalKey bytes];
    if (orignalKey.length < 16) {
        NSMutableData *data = [NSMutableData dataWithBytes:byte length:orignalKey.length];
        Byte *nullByte;
        [data appendData:[NSData dataWithBytes:nullByte length:16 - orignalKey.length]];
        return data;
    } else {
        return [NSData dataWithBytes:byte length:16];
    }
}


@end






猜你喜欢

转载自blog.csdn.net/zramals/article/details/70243371
今日推荐