這個(gè)就是常用的3DES加密烙常,百度有很多,我就直接截圖了
這里說(shuō)一下之前做3DES加密和解密中與后臺(tái)配合的一些坑。
1. 確定好加密的方式是 ECB還是CBC
2.確定好補(bǔ)位方式
這里用的是kCCOptionPKCS7Padding補(bǔ)位方式蚕脏,它的特點(diǎn)就是對(duì)加密的內(nèi)容不滿(mǎn)8位進(jìn)行缺幾位侦副,用所缺位數(shù)進(jìn)行補(bǔ)位。eg:原始數(shù)據(jù)為 FF FF FF FF FF FF FF FF FF FF FF FF FF驼鞭,缺少3位秦驯,所以補(bǔ)位后為FF FF FF FF FF FF FF FF FF FF FF FF FF 03 03 03。但是如果后臺(tái)的補(bǔ)位方式是自己定義的挣棕,那這個(gè)時(shí)候坑就來(lái)了译隘。(1)把kCCOptionPKCS7Padding補(bǔ)位方式去掉!(2)對(duì)數(shù)據(jù)進(jìn)行判斷洛心,然后自行補(bǔ)位
3.確定好密鑰轉(zhuǎn)NSData的方式
這塊我就碰到了坑,后臺(tái)給的是一個(gè)十六進(jìn)制的字符串词身,它是直接用的這個(gè)16進(jìn)制厅目。而我按照百度直接拿這個(gè)字符傳進(jìn)行了utf8轉(zhuǎn)成data,結(jié)果悲劇了法严。所以問(wèn)清楚后臺(tái)給你的密鑰應(yīng)該怎樣轉(zhuǎn)化為data损敷。
最后粘一下我加解密中用到的一些方法
//int 轉(zhuǎn) 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進(jìn)制字符串轉(zhuǎn)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轉(zhuǎn)16進(jìn)制字符串
+ (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;
}