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 的字节。