美文网首页
iOS 3DES加密和解密的一些坑

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

作者: 东北小小猿 | 来源:发表于2017-09-30 15:02 被阅读62次

    这个就是常用的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,其余补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加密和解密的一些坑

          本文链接:https://www.haomeiwen.com/subject/beggextx.html