iOS 3DES加密和解密的一些坑

这个就是常用的3DES加密,百度有很多,我就直接截图了

iOS 3DES加密和解密的一些坑_第1张图片

这里说一下之前做3DES加密和解密中与后台配合的一些坑。

1. 确定好加密的方式是 ECB还是CBC

2.确定好补位方式

这里用的是kCCOptionPKCS7Padding补位方式,它的特点就是对加密的内容不满8位进行缺几位,用所缺位数进行补位。eg:原始数据为 FF FF FF FF FF FF FF FF FF FF FF FF FF,缺少3位,所以补位后为FF FF FF FF FF FF FF FF FF FF FF FF FF 03 03 03。但是如果后台的补位方式是自己定义的,那这个时候坑就来了。(1)把kCCOptionPKCS7Padding补位方式去掉!(2)对数据进行判断,然后自行补位

iOS 3DES加密和解密的一些坑_第2张图片
这里我随便写了一个自定义的补位:不满8位,第一位补0x60,其余补0x00

3.确定好密钥转NSData的方式

这块我就碰到了坑,后台给的是一个十六进制的字符串,它是直接用的这个16进制。而我按照百度直接拿这个字符传进行了utf8转成data,结果悲剧了。所以问清楚后台给你的密钥应该怎样转化为data。


最后粘一下我加解密中用到的一些方法

//int 转 data

+ (NSData*)little_intToByteWithData:(int)i andLength:(int)len{

Byte abyte[len];

if(len ==1) {

abyte[0] = (Byte) (0xff& i);

}else if(len ==2) {

abyte[1] = (Byte) (0xff& i);

abyte[0] = (Byte) ((0xff00& i) >>8);

}else{

abyte[3] = (Byte) (0xff& i);

abyte[2] = (Byte) ((0xff00& i) >>8);

abyte[1] = (Byte) ((0xff0000& i) >>16);

abyte[0] = (Byte) ((0xff000000& i) >>24);

}

NSData*adata = [NSData dataWithBytes:abytelength:len];

return adata;

}

//取反

+(NSData*)getFanByte:(NSData*)data{

NSInteger length = data.length;

Byte res[length];

Byte*src = (Byte*)[data bytes];

for(int i =0; i

res[i] = ~(src[i]);

}

NSData*resultData = [NSData dataWithBytes:res length:length];

return resultData;

}

//16进制字符串转data

+ (NSData*)convertHexStrToData:(NSString*)str {

if(!str || [strlength] ==0) {

return nil;

}

NSMutableData*hexData = [[NSMutableData alloc]initWithCapacity:8];

NSRange range;

if([strlength] %2==0) {

range =NSMakeRange(0,2);

}else{

range =NSMakeRange(0,1);

}

for(NSIntegeri = range.location; i < [strlength]; i +=2) {

unsigned int anInt;

NSString*hexCharStr = [str substringWithRange:range];

NSScanner*scanner = [[NSScanner alloc]initWithString:hexCharStr];

[scanner scanHexInt:&anInt];

NSData*entity = [[NSData alloc]initWithBytes:&anIntlength:1];

[hexData appendData:entity];

range.location+= range.length;

range.length=2;

}

return hexData;

}

//data转16进制字符串

+ (NSString*)convertDataToHexStr:(NSData*)data {

if(!data || [data length] ==0) {

return@"";

}

NSMutableString*string = [[NSMutableString alloc]initWithCapacity:[data length]];

[data enumerateByteRangesUsingBlock:^(constvoid*bytes,NSRange byteRange,BOOL*stop) {

unsigned char*dataBytes = (unsigned char*)bytes;

for(NSIntegeri =0; i < byteRange.length; i++) {

NSString*hexStr = [NSString stringWithFormat:@"%x", (dataBytes[i]) &0xff];

if([hexStr length] ==2) {

[string appendString:hexStr];

}else{

[string appendFormat:@"0%@", hexStr];

}

}

}];

return string;

}

你可能感兴趣的:(iOS 3DES加密和解密的一些坑)