仅加解密
需要填充
ECB:不需要 IV 或 Nonce 值,安全性很弱,同一密钥仅能加密一块数据。
CBC:需要一个 IV 值,不能重复使用该值,但是相对于 CTR 危险度没有那么高,即使使用不正确,也是相对安全的。
流模式
CTR:需要一个 IV 或 Nonce 值,不能重复使用该值,否则攻击者可以对其进行完全破解。
认证加解密(可以保证数据的保密性、完整性、真实性)
OCB:仅需要一个随机数,速度更快,最推荐的认证加密方式,但有专利限制。
GCM:需要一个 IV 值,不能重复使用该值,否则攻击者可以对其进行完全破解,因为它是 CTR 和 GMAC(GHASH) 的复杂组合。
填充方法
ZeroPadding:填充 0 值,会丢失原数据末尾的 '\0'(如果有),不推荐使用。
Pkcs7Padding:冗余填充,即长度不对齐 BlockSize(AES 是 16 字节)时,将不够的部分填充不够的长度,如果刚好对齐 BlockSize,则新增一个 Block 填充 BlockSize。
填充是指按字节填充明文中不够对齐 BlockSize 的部分。填充方法之间没有安全性区别,但推荐用 Pkcs7Padding 填充方法,因为 ZeroPadding 可能会丢失数据。
名词解释
IV
初始向量(initialization vector),是一个固定长度的输入值。
一般的使用上会要求它是随机数或伪随机数(pseudorandom)。
使用随机数产生的初始向量才能达到语义安全(消息验证码也可能用到初始向量),并让攻击者难以对原文一致且使用同一把密钥生成的密文进行破解。
在区块加密中,使用了初始向量的加密模式被称为区块加密模式。
有些密码运算只要求初始向量不要重复,并只要求它用是内部求出的随机数值(这类随机数实际上不够乱,即不够真正随机)。在这类应用下,初始向量通常被称为 nonce(临时使用的数值),是可控制的(stateful)而不是随机数。
这种作法是因为初始向量不会被寄送到密文的接收方,而是收发两方透过事前约定的机制自行计算出对应的初始向量(不过,实现上还是经常会把 nonce 送过去以便检查消息的遗漏)。计数器模式中使用序列的方式来作为初始向量,它就是一种可控制之初始向量的加密模式。
Nonce
是一个在加密通信中只能使用一次的数字。它可以不随机或伪随机,但一定不能重复。
例如用计数器实现 Nonce,初始化一个随机值,每次使用后对其自增 1,下一次使用 Nonce 就不会是重复的。
在认证协议中,它往往是一个随机或伪随机数,以避免重放攻击。
Nonce 相对于 IV 实现起来更简单,更不容易出错。
参考资料
https://stackoverflow.com/questions/1220751/how-to-choose-an-aes-encryption-mode-cbc-ecb-ctr-ocb-cfb
https://stackoverflow.com/questions/51124995/aes-ctr-without-iv-same-key-for-multiple-messages-safe
如果发现文章内容有任何不正之处,欢迎评论指出。
如果该文对你有帮助,请在下方为我点个赞。
谢谢!