AES加解密以及示例

来源:互联网 发布:单片机烟雾报警器 编辑:程序博客网 时间:2024/05/21 11:32

网上AES加解密的代码很多,其基本原理都差不多,很多都是直接将明文通过AES加密生成含有特殊的密文,而这些密文可能需要添加到url,这样就有可能被解析错了,所以有事需要将密文转化为ascii码,本文就是转化为ascii码,这样可以直接加在url后面直接请求接口了。当然里面还有很多的配置参数要适合自己了,要不然,呵呵?
很多时候发现在iOS端加完密之后和Java端加密结果甚为不一样,那么该怎么办呢?
看下文喽:

AES加解密的代码如下:

- (NSData *)AES256ParmEncryptWithKey:(NSString *)key   //加密{        char keyPtr[kCCKeySizeAES256+1];    bzero(keyPtr, sizeof(keyPtr));    [key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];    NSUInteger dataLength = [self length];    size_t bufferSize = dataLength + kCCBlockSizeAES128;    void *buffer = malloc(bufferSize);    size_t numBytesEncrypted = 0;    CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt, kCCAlgorithmAES128,                                          kCCOptionPKCS7Padding | kCCOptionECBMode,                                          keyPtr, kCCBlockSizeAES128,                                          NULL,                                          [self bytes], dataLength,                                          buffer, bufferSize,                                          &numBytesEncrypted);    if (cryptStatus == kCCSuccess) {        return [NSData dataWithBytesNoCopy:buffer length:numBytesEncrypted];    }    free(buffer);    return nil;}- (NSData *)AES256ParmDecryptWithKey:(NSString *)key   //解密{        char keyPtr[kCCKeySizeAES256+1];    bzero(keyPtr, sizeof(keyPtr));    [key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];    NSUInteger dataLength = [self length];    size_t bufferSize = dataLength + kCCBlockSizeAES128;    void *buffer = malloc(bufferSize);    size_t numBytesDecrypted = 0;    CCCryptorStatus cryptStatus = CCCrypt(kCCDecrypt, kCCAlgorithmAES128,                                          kCCOptionPKCS7Padding | kCCOptionECBMode,                                          keyPtr, kCCBlockSizeAES128,                                          NULL,                                          [self bytes], dataLength,                                          buffer, bufferSize,                                          &numBytesDecrypted);    if (cryptStatus == kCCSuccess) {        return [NSData dataWithBytesNoCopy:buffer length:numBytesDecrypted];    }    free(buffer);    return nil;}

以下示例:

- (void)secretAdd {    NSString *Token = @"CHINAPAPER#@$%";    NSData *mi = [[@"chinapaper:1234567890" dataUsingEncoding:NSUTF8StringEncoding] AES256ParmEncryptWithKey:Token];    NSString *s1 = [[NSString alloc]initWithData:mi encoding:NSUTF8StringEncoding];    LILog(@"%@", s1);    NSMutableString *stttt = [NSMutableString string];    Byte *plainTextByte1 = (Byte *)[mi bytes];    printf("%s", plainTextByte1);    for (int i = 0; i < [mi length]; i++){        [stttt appendString:[NSString stringWithFormat:@"%02x", plainTextByte1[i]]];    }    LILog(@"====%@====", stttt);    [self unlock:mi andByte:plainTextByte1 andStr:stttt];}- (void)unlock:(NSData *)mii andByte:(Byte *)s andStr:(NSString *)cdcd{    NSString *Token = @"CHINAPAPER#@$%";    NSData *data = [self _16ToByte:cdcd];    NSData *mi = [data AES256ParmDecryptWithKey:Token];    NSMutableString *stttt = [NSMutableString string];    Byte *plainTextByte1 = (Byte *)[mi bytes];    for (int i = 0; i < [mi length]; i++){        [stttt appendString:[NSString stringWithFormat:@"%02x", plainTextByte1[i]]];    }    NSString *str = [[NSString alloc]initWithData:mi encoding:NSUTF8StringEncoding];    LILog(@"====%@====", str);}- (NSData *)_16ToByte:(NSString *)hexString {    int j=0;    Byte bytes[[hexString length] / 2];    ///3ds key的Byte 数组, 128位    for(int i=0;i<[hexString length];i++)    {        int int_ch;  /// 两位16进制数转化后的10进制数        unichar hex_char1 = [hexString characterAtIndex:i]; ////两位16进制数中的第一位(高位*16)        int int_ch1;        if(hex_char1 >= '0' && hex_char1 <='9')            int_ch1 = (hex_char1-48)*16;   //// 0 的Ascll - 48        else if(hex_char1 >= 'A' && hex_char1 <='F')            int_ch1 = (hex_char1-55)*16; //// A 的Ascll - 65        else            int_ch1 = (hex_char1-87)*16; //// a 的Ascll - 97        i++;        unichar hex_char2 = [hexString characterAtIndex:i]; ///两位16进制数中的第二位(低位)        int int_ch2;        if(hex_char2 >= '0' && hex_char2 <='9')            int_ch2 = (hex_char2-48); //// 0 的Ascll - 48        else if(hex_char1 >= 'A' && hex_char1 <='F')            int_ch2 = hex_char2-55; //// A 的Ascll - 65        else            int_ch2 = hex_char2-87; //// a 的Ascll - 97        int_ch = int_ch1+int_ch2;        NSLog(@"int_ch=%d",int_ch);        bytes[j] = int_ch;  ///将转化后的数放入Byte数组里        j++;    }    NSData *newData = [[NSData alloc] initWithBytes:bytes length:[hexString length] / 2];    return newData;}

例子有点乱,但是基本实现了加解密,可以参考,对于加解密的原理,有机会再解释吧~

0 0
原创粉丝点击