PHP:Mcrypt - 哪种模式?

Ind*_*ial 17 php encryption mcrypt

我一直在测试PHP 功能中可用的各种模式mcrypt.ECB 是大多数教程中使用的模式,但是刚刚链接的页面和一些用户都不推荐使用,因此我认为CBCCFB都应该这样做.

PHP的文档并不是太多,因为它可以比较不同的模式mcrypt,而是指的是"Schneier的应用密码学"这本书,我现在不太热衷于购买.

那么mcrypt我想使用哪种模式?为什么?

aaz*_*aaz 22

mcrypt实际上实现的模式多于列出的模式,您可以使用字符串名称来访问它们:

  • cbc- CBC模式
  • cfb- 8位CFB模式;
  • ncfb- 块大小的CFB模式;
  • nofb- OFB模式(不ofb);
  • ctr- 点击率模式.

这些模式的实现细节不同,因此它们的适用性取决于您的数据和环境.

填充:

  • CBC模式仅加密完整的块,因此mcrypt除非您实现自己的填充,否则将明文填充为零字节.

  • CFB,OFBCTR模式可以加密任何长度的消息.

初始化向量:

  • CBCCFB模式需要随机IV(不要使用MCRYPT_RAND).

  • OFB模式仅需要唯一的IV(例如,全局计数器,如果从不修改或删除行,则可能是数据库主键).

  • CTR要求每个计数器块都是唯一的(不仅仅是消息的IV,它是第一个计数器块,但其余的是通过为消息的每个块递增计数器块1而形成的).

NIST建议中的更多信息.

每块有(通常是一个,但在16 8位被用于在性能上的差异应该是不重要在PHP,如是否加密或解密可以并行和多少密码迭代CFB模式).

由于您应用MAC,因此可塑性存在差异,这应该是不重要的.

并且它们的安全性可能存在差异,但为此您应该咨询密码学家.

  • @buggedcom - 这些模式的安全性取决于IV是不可预测的.`MCRYPT_RAND`使用PHP随机数生成器,它可能满足也可能不满足此要求.它可能连接到硬件RNG,或者它可能返回π的数字.但你可以在系统上检查[`man 4 random`](http://linux.die.net/man/4/random),看看`/ dev/random`是用于生成加密材料,默认情况下`MCRYPT_DEV_RANDOM`使用它. (2认同)