AES加解密以及示例

网上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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值