iOS中AES192 CBC PKCS7Padding 解码

1 篇文章 0 订阅
1 篇文章 0 订阅

1.什么是AES?

AES(Advanced Encryption Standard,AES)高级加密标准,是美国联邦政府采用的一种区块加密标准。这个标准用来替换原来的DES,该算法为比利时密码学家Joan Daemen和Vincent Rijmen所设计,所以又称高级加密标准Rijndael加密法。

2.什么是AES128,AES192,AES256?

AES采用的是对称加密,密钥长度支持128位,192位,256位,也即AES128密钥长度为128/8=16,AES192密钥长度为192/8=24,AES256密钥长度为256/8=32。

3.什么是ECB,CBC加密模式?

ECB(Electronic Code Book电子密码本)模式,是将加密的数据分成若干组,每组的长度和密钥长度相等,每组都用相同的密钥进行加密,各个组可以进行并行加密。 CBC(Cipher Block Chaining,加密块链)模式,是一种循环模式,前一个分组的密文和当前分组的明文异或操作后再加密,增强了密文被破解的难度。CBC模式涉及两个东西,一个是密钥,一个密钥偏移量,具体可以参考后面的例子。

4.什么是PKCS5Padding,PKCS7Padding?

PKCS5Padding和PKCS7Padding都是密钥的一种填充方式,即当密钥长度不足时的一种密钥填充方式。PKCS5Padding的填充方式为当密钥长度不足时,缺几位补几个0,eg.针对AES128,如果密钥为“1234567890”一共10位,缺6位,采用PKCS5Padding方式填充之后的密钥为“1234567890000000”,补了6个0.PKCS7Padding的填充方式为当密钥长度不足时,缺几位补几个几,eg.对于AES128,如果密钥为”1234567890”一共10位,缺6位,采用PKCS7Padding方式填充之后的密钥为“1234567890666666”。

下面给出一个iOS上AES192采用CBC,PKCS7Padding的解密算法:

/**
 AES解密
 
 @param rawData 原始未解密数据
 @param key 密钥
 @return 解密完的数据
 */
+ (NSData *)decryptData:(NSData *)rawData aes256DecryptKey:(NSString *)key   //解密
{
    //密钥长度加1
    char keyPtr[kCCKeySizeAES192+1];
    
    //AES iv向量必须先Base64 decode一下,和后台保持一致(实际使用中要看后台如何处理)
    NSData *ivDecodedData = [[NSData alloc] initWithBase64EncodedString:ELIMPlayBackAESIV options:1];
    
    bzero(keyPtr, sizeof(keyPtr));
    [key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];
    NSUInteger dataLength = [rawData length];
    size_t bufferSize = dataLength + kCCBlockSizeAES128;
    void *buffer = malloc(bufferSize);
    size_t numBytesDecrypted = 0;
    CCCryptorStatus cryptStatus = CCCrypt(kCCDecrypt, kCCAlgorithmAES128,
                                          kCCOptionPKCS7Padding,
                                          keyPtr, strlen(keyPtr),
                                          [ivDecodedData bytes],
                                          [rawData bytes], dataLength,
                                          buffer, bufferSize,
                                          &numBytesDecrypted
                                          );
    if (cryptStatus == kCCSuccess) {
        return [NSData dataWithBytesNoCopy:buffer length:numBytesDecrypted];
        
    }
    free(buffer);
    return nil;
}



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值