iOS AES 加密

iOS AES 加密

下面的方法可以指定操作方式对文本进行加密或解密,还可以指定密钥的长度。这里 AES 加解密指定的是 ECB 模式,kCCOptionPKCS7Padding 填充方式。

当然,实际上 iOS 只支持 kCCOptionPKCS7Padding 一种填充方式,或者不填充,并且 CCCrypt(...) 函数默认的是 CBC 模式。

+ (NSData *)crypt:(NSData *)data operation:(CCOperation)operation 
		   passowrd:(NSString *)password keySize:(NSInteger)keySize
{
    NSInteger keylength = password.length+1;
    char *key = malloc(keylength);
    bzero(key, keylength);
    [password getCString:key maxLength:keylength encoding:NSUTF8StringEncoding];
    
    NSUInteger dataLength = [data length];
    size_t bufferSize = dataLength + keySize;
    void *buffer = malloc(bufferSize);
    bzero(buffer, bufferSize);
    
    CCCryptorStatus status = CCCrypt(operation,
                                     kCCAlgorithmAES,
                                     kCCOptionPKCS7Padding | kCCOptionECBMode,
                                     key, keySize,
                                     NULL,
                                     [data bytes], dataLength,
                                     buffer, bufferSize,
                                     &bufferSize);
    NSData *result;
    if (status == kCCSuccess){
        result = [NSData dataWithBytes:buffer length:bufferSize];
    }
    if (buffer) free(buffer);
    if (key) free(key);
    
    return result;
}

函数 CCCrypt(...) 进行了一次加解密操作,实际上进行了一系列操作,这些操作可以通过 CCCrytorCreate()CCCryptorUpdate()CCCryptorFinal()CCCryptorRelease() 函数分别进行。

另外,如果需要使用除 CBC 和 ECB 外的加解密模式,可以使用 CCCryptorCreateWithMode() 函数获取一个 CCCryptorRef 变量,而后再进行加解密操作。

PKCS7Padding:对于 AES 而言,加密时需要先将明文分割为 128 位的明文块,所以需要对明文进行填充使其能够整除 16 字节,
而填充的值就是真实填充的字节个数,如果明文字节长度刚好是 16 的整数倍,那么则需要填充 16 个值为 0x10 的字节。

发布了129 篇原创文章 · 获赞 23 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/u011374318/article/details/104561651