PHP:Mcrypt - 哪种模式?
Posted
技术标签:
【中文标题】PHP:Mcrypt - 哪种模式?【英文标题】:PHP: Mcrypt - which mode? 【发布时间】:2011-07-03 18:21:29 【问题描述】:我一直在测试 php 的 mcrypt
函数中提供的各种 modes。 ECB 是大多数教程中使用的模式,但不被刚刚链接的页面和some users 推荐,所以我认为 CBC 或 CFB 应该可以解决问题。
PHP 文档在比较mcrypt
可用的不同模式方面并不太丰富,而是参考了“Schneier 的应用密码学”一书,我不太热衷暂时购买。
那么我想使用mcrypt
-mode 中的哪一个,为什么?
【问题讨论】:
不重复但有帮助的帖子***.com/questions/2809855/…hi kevin ;) 是的,我知道那个帖子,它是我自己的,但我仍然错过了mcrypt
可用的不同模式的任何优点/缺点。为什么选择 CBC 而不是 CFC?
【参考方案1】:
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 来形成消息的每个块)。
更多信息请关注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 - 哪种模式?的主要内容,如果未能解决你的问题,请参考以下文章
CryptoJS 中 CFB 模式中的 mcrypt_encrypt 函数