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;
}