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 来说,这样是并不可行的,无法解密由此产生的密文
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· 因为Apifox不支持离线,我果断选择了Apipost!