AES高级加密标准

版权声明:知识版权是属于全人类的! 欢迎评论与转载!!! 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模式

  • 优点
    • 隐藏了明文模式;
    • 分组密码转化为流模式;
    • 可以及时加密传送小于分组的数据;
  • 缺点
    • 不利于并行计算;
    • 对明文的主动攻击是可能的;
    • 误差传送:一个明文单元损坏影响多个单元;

猜你喜欢

转载自blog.csdn.net/zhuge1127/article/details/82055071