我一直在测试PHP函数中可用的各种模式。ECB 是大多数教程中使用的模式,但不被刚刚链接的页面和一些用户推荐,所以我认为CBC或CFB应该可以解决问题。mcrypt
PHP 文档在比较可用的不同模式时并不太厚mcrypt
,而是参考了“Schneier 的应用密码学”一书,我目前不太热衷于购买。
那么mcrypt
我想使用哪种模式,为什么?
mcrypt
实际上实现了比列出更多的模式,您可以使用字符串名称来访问它们:
cbc
– CBC模式cfb
– 8 位CFB模式;ncfb
– 块大小CFB模式;nofb
– OFB模式(不是ofb
);ctr
–点击率模式。这些模式在实现细节上有所不同,因此它们的适用性取决于您的数据和环境。
填充:
CBC模式只加密完整的块,所以mcrypt
用零字节填充你的明文,除非你实现自己的填充。
CFB、OFB和CTR模式加密任意长度的消息。
初始化向量:
CBC和CFB模式需要随机 IV(不要使用MCRYPT_RAND
)。
OFB模式只需要一个唯一的 IV(例如,一个全局计数器,如果从不修改或删除行,则可能是数据库主键)。
CTR要求每个计数器块是唯一的(不仅仅是消息的 IV,它是第一个计数器块,还有其余的,由消息的每个块的计数器块增加 1 形成)。
NIST 建议中的更多信息。
在 PHP 中应该不重要的性能差异,例如加密或解密是否可以并行化以及每个块使用多少密码迭代(通常为 1,但在 8 位CFB模式下为 16)。
它们的安全性可能存在差异,但为此您应该咨询密码学家。