我一直在测试PHP的mcrypt
函数中提供的各种modes。 ECB 是大多数教程中使用的模式,但刚刚链接的页面和some users都不推荐使用,因此我认为 CBC 或 CFB 应该可以解决问题。
PHP文档不是太胖了,它与mcrypt
可用的不同模式的比较相反,而是指的是'施奈尔应用密码学'的书,我不是现在太热衷于购买了。
那么我想使用哪种mcrypt
模式?为什么?
答案 0 :(得分:22)
mcrypt
实际上实现的模式多于listed,您可以使用字符串名称来访问它们:
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来形成的消息的每个块)。
在PHP中性能上的差异应该是不重要的,例如加密或解密是否可以并行化以及每个块使用多少次密码迭代(通常是一次,但在8位 CFB 模式)。
malleability存在差异,这些差异应该不重要,因为将应用MAC。
他们的安全性可能存在差异,但为此你应该咨询cryptographer。