这个就是常用的3DES加密,百度有很多,我就直接截图了
这里说一下之前做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)对数据进行判断,然后自行补位
这里我随便写了一个自定义的补位:不满8位,第一位补0x60,其余补0x003.确定好密钥转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;
}
网友评论