iOS 中的 AES

AES 加密算法

AES 的全称是 Advanced Encryption Standard ,意为高级加密标砖。它的出现主要是为了取代 被证明是不安全 DES 加密算法的。AES 加密算法和 DES 一样,都是 分组加密

分组加密: 又称为 分块加密块密码,是一种对称秘钥算法。它将 明文 分成多个等长的区块(block),使用确定的算法和对称秘钥对每组分别加密解密。

​ --- 维基百科 <分组密码 >

AES 规定明文的区块长度为 128 位,对于 AES 来说这个是固定的。而秘钥是长度可以是 128 位、 192 位和 256 位,分别对应 16、24 和 32 的长度。

对于 128 位、192 位和 256 位的秘钥长度来说,本质上是没有区别的,只在于加密轮数的不同,128 位 会加密 10 轮,每增加 64 位,就多加密 2 轮。

如果想要了解更多关于 AES 中的细节,可以看这个 视频 ,解释了加密的基本流程:字节代换、行移位、列混合、轮秘钥加。

iOS 中的 AES 加密

CCCryptorStatus CCCrypt(
    CCOperation op,         /* 加密: kCCEncrypt; 解密: kCCDecrypt*/
    CCAlgorithm alg,        /* AES使用 kCCAlgorithmAES. */
    CCOptions options,      /* 填充方式和加密模式 */
    const void *key,				/* 秘钥 */
    size_t keyLength,				/* 秘钥长度*/		
    const void *iv,         /* 初始向量 */
    const void *dataIn,     
    size_t dataInLength,
    void *dataOut,         
    size_t dataOutAvailable,
    size_t *dataOutMoved)
    API_AVAILABLE(macos(10.4), ios(2.0));

下面对于比较模糊的入参解释一下

CCOptions options

这个参数决定了是使用何种加密模式和填充方式

填充方式

由于 AES 的区块大小固定为 16 位,所以当加密的内容长度不是 16 字节的整数倍时就需要填充,使得最后一块变成一个完整的 16 字节的块,所以对于加密和解密两端要使用统一的 PADDING 模式,常用填充模式有 PKCS5、PKCS7 和 NOPADDING。在 iOS 中 PKCS7 是向下兼容 PKCS5 的,直接使用 PKCS7 即可

加密模式

在 iOS 开发中用到的有 2 中加密方式: ECB 和 CBC,默认为 CBC 模式

这两种方式的加密方式大致相同,CBC 相对于 ECB 来说多一个初始向量的入参,在进行字节代换之前会将明文和初始向量做异或操作。初始向量的只有在第一个分组块加密时才会用到,后续的分组块会将上一次得到的密文作为初始向量。

小结

options 传值固定模式:

  • ECB 模式: kCCOptionPKCS7Padding | kCCOptionECBMode
  • CBC 模式: kCCOptionPKCS7Padding

在 iOS 中 CBC 加密模式是默认值,不需要显示指明

keyLength

这个参数主要是指明秘钥的长度,决定了加密的轮数

keyLength 密钥长度 加密轮数
kCCKeySizeAES128 16 10
kCCKeySizeAES192 24 12
kCCKeySizeAES256 32 14

对于 AES 来说,秘钥长度是固定的,必须是 16、24 或者 32 中的一个。

注意点

在实际的开发过程中,有一些 Java 程序员会使用网上找的代码片段来重新生成秘钥

KeyGenerator kgen = KeyGenerator.getInstance("AES");
SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG");
secureRandom.setSeed(key.getBytes());
kgen.init(128, secureRandom);

 // 根据字节数组生成AES密钥
SecretKey secretKey = new SecretKeySpec(kgen.generateKey().getEncoded(), "AES");

需要注意的是对于 iOS 来说,这样是并不可行的,无法解密由此产生的密文

AES 在线验证

posted @ 2022-06-01 16:21  小小个子大个头  阅读(363)  评论(0编辑  收藏  举报