【问题标题】:PHP: Mcrypt - which mode?PHP:Mcrypt - 哪种模式?
【发布时间】:2011-07-03 18:21:29
【问题描述】:

我一直在测试 PHP 的 mcrypt 函数中提供的各种 modesECB 是大多数教程中使用的模式,但不被刚刚链接的页面和some users 推荐,所以我认为 CBCCFB 应该可以解决问题。

PHP 文档在比较mcrypt 可用的不同模式方面并不太丰富,而是参考了“Schneier 的应用密码学”一书,我不太热衷暂时购买。

那么我想使用mcrypt-mode 中的哪一个,为什么?

【问题讨论】:

  • 不重复但有帮助的帖子stackoverflow.com/questions/2809855/…hi kevin ;)
  • 是的,我知道那个帖子,它是我自己的,但我仍然错过了 mcrypt 可用的不同模式的任何优点/缺点。为什么选择 CBC 而不是 CFC

标签: php encryption mcrypt


【解决方案1】:

mcrypt实际上实现了比listed更多的模式,你可以使用字符串名称来访问它们:

  • cbc - CBC 模式
  • cfb – 8 位 CFB 模式;
  • ncfb – 块大小 CFB 模式;
  • nofbOFB 模式(不是ofb);
  • ctr - 点击率 模式。

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

填充

  • CBC 模式只加密完整的块,因此mcrypt 用零字节填充您的明文,除非您实现自己的填充。

  • CFBOFBCTR 模式可加密任意长度的消息。

初始化向量

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

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

  • CTR 要求每个计数器块是唯一的(不仅仅是消息的 IV,它是第一个计数器块,而是其余的,通过将计数器块增加 1 来形成消息的每个块)。

更多信息请关注NIST recommendations

在 PHP 中应该不重要的性能差异,例如加密或解密是否可以并行化以及每个块使用多少次密码迭代(通常为 1,但在 8 位中为 16CFB 模式)。

malleability 存在差异,这应该不重要,因为您应用MAC

它们的安全性可能存在差异,但为此您应该咨询cryptographer

【讨论】:

  • 感谢@aaz 的广泛回复!
  • @aaz - 你说“(不要使用 MCRYPT_RAND)”我能问为什么吗?
  • @buggedcom – 这些模式的安全性取决于 IV 的不可预测性。 MCRYPT_RAND 使用 PHP 随机数生成器,它可能满足也可能不满足此要求。它可能连接到硬件 RNG,或者它可能返回 π 的数字。但是您可以检查系统上的 man 4 random 以查看 /dev/random 用于生成加密材料,而默认的 MCRYPT_DEV_RANDOM 使用它。
  • 我知道这是一个老问题/答案,但是用 ecb 填充呢?它是如何工作的?
  • @greggles 您无需担心,在 ECB 模式下。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-23
相关资源
最近更新 更多