版权声明:知识版权是属于全人类的! 欢迎评论与转载!!! https://blog.csdn.net/zhuge1127/article/details/82055071
什么是AES?
高级加密标准(英语:Advanced Encryption Standard,缩写:AES),是美国联邦政府采用的一种区块加密标准。
这个标准用来替代原先的DES,已经被多方分析且广为全世界所使用。
2006年,高级加密标准已然成为对称密钥加密中最流行的算法之一。
加密原理
AES算法基于排列和置换运算。
排列是对数据重新进行安排,置换是将一个数据单元替换为另一个。
AES 使用几种不同的方法来执行排列和置换运算。
AES是一个迭代的、对称密钥分组的密码,它可以使用128、192 和 256 位密钥,并且用 128 位(16字节)分组加密和解密数据。
与公共密钥密码使用密钥对不同,对称密钥密码使用相同的密钥加密和解密数据。
通过分组密码返回的加密数据的位数与输入数据相同。
迭代加密使用一个循环结构,在该循环中重复置换和替换输入数据。
实现 FBEncryptorAES
加密数据
+ (NSData*)encryptData:(NSData*)data key:(NSData*)key iv:(NSData*)iv {
NSData* result = nil;
NSInteger keySize = [key length];
// setup key
unsigned char cKey[keySize];
bzero(cKey, sizeof(cKey));
[key getBytes:cKey length:keySize];
// setup iv
char cIv[FBENCRYPT_BLOCK_SIZE];
bzero(cIv, FBENCRYPT_BLOCK_SIZE);
if (iv) {
[iv getBytes:cIv length:FBENCRYPT_BLOCK_SIZE];
}
// setup output buffer
size_t bufferSize = [data length] + FBENCRYPT_BLOCK_SIZE;
void *buffer = malloc(bufferSize);
// do encrypt
size_t encryptedSize = 0;
CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt,
FBENCRYPT_ALGORITHM,
kCCOptionPKCS7Padding,
cKey,
keySize,
cIv,
[data bytes],
[data length],
buffer,
bufferSize,
&encryptedSize);
if (cryptStatus == kCCSuccess) {
result = [NSData dataWithBytesNoCopy:buffer length:encryptedSize];
} else {
free(buffer);
NSLog(@"[ERROR] failed to encrypt|CCCryptoStatus: %d", cryptStatus);
}
return result;
}
解密数据
+ (NSData*)decryptData:(NSData*)data key:(NSData*)key iv:(NSData*)iv;
{
NSData* result = nil;
NSInteger keySize = [key length];
// setup key
unsigned char cKey[keySize];
bzero(cKey, sizeof(cKey));
[key getBytes:cKey length:keySize];
// setup iv
char cIv[FBENCRYPT_BLOCK_SIZE];
bzero(cIv, FBENCRYPT_BLOCK_SIZE);
if (iv) {
[iv getBytes:cIv length:FBENCRYPT_BLOCK_SIZE];
}
// setup output buffer
size_t bufferSize = [data length] + FBENCRYPT_BLOCK_SIZE;
void *buffer = malloc(bufferSize);
// do decrypt
size_t decryptedSize = 0;
CCCryptorStatus cryptStatus = CCCrypt(kCCDecrypt,
FBENCRYPT_ALGORITHM,
kCCOptionPKCS7Padding,
cKey,
keySize,
cIv,
[data bytes],
[data length],
buffer,
bufferSize,
&decryptedSize);
if (cryptStatus == kCCSuccess) {
result = [NSData dataWithBytesNoCopy:buffer length:decryptedSize];
} else {
free(buffer);
NSLog(@"[ERROR] failed to decrypt| CCCryptoStatus: %d", cryptStatus);
}
return result;
}
AES设置
1、模式 模式有ECB/CBC等,iOS默认的是CBC
2、Padding iOS默认的是PKCS7 等价于PKCS5
3、初始向量 iv iOS默认是00000000000
4、keySize 有 128/192/256等。
加密模式
ECB模式
- 优点:
- 简单;
- 有利于并行计算;
- 误差不会被传送;
- 缺点:
- 不能隐藏明文的模式;
- 可能对明文进行主动攻击;
CBC模式
- 优点:
- 不容易主动攻击,安全性好于ECB,适合传输长度长的报文,是SSL、IPSec的标准。
- 缺点:
- 不利于并行计算;
- 误差传递;
- 需要初始化向量IV
CFB模式
- 优点:
- 隐藏了明文模式;
- 分组密码转化为流模式;
- 可以及时加密传送小于分组的数据;
- 缺点
- 不利于并行计算;
- 误差传送:一个明文单元损坏影响多个单元;
- 唯一的IV;
OFB模式
- 优点
- 隐藏了明文模式;
- 分组密码转化为流模式;
- 可以及时加密传送小于分组的数据;
- 缺点
- 不利于并行计算;
- 对明文的主动攻击是可能的;
- 误差传送:一个明文单元损坏影响多个单元;