PHP:Mcrypt - 哪种模式?

Posted

技术标签:

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

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

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

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

【问题讨论】:

不重复但有帮助的帖子***.com/questions/2809855/…hi kevin ;) 是的,我知道那个帖子,它是我自己的,但我仍然错过了 mcrypt 可用的不同模式的任何优点/缺点。为什么选择 CBC 而不是 CFC 【参考方案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 模式下。

以上是关于PHP:Mcrypt - 哪种模式?的主要内容,如果未能解决你的问题,请参考以下文章

PHP 加密扩展 mcrypt 的基本使用

CryptoJS 中 CFB 模式中的 mcrypt_encrypt 函数

利用php的mcrypt模块加密解密(AESDES等等)

mcrypt“ncfb”模式的Java等价物是啥?

使用 mcrypt 在 php 和 c 中进行 AES 加密

用 OpenSSL 替换 Mcrypt