将 PHP mcrypt 与 Rijndael/AES 结合使用
我正在尝试使用 php 中的 mcrypt 和密码 Rijndael 加密一些文本消息,但我不确定 MCRYPT_MODE_modename (根据 PHP 手册,这些可用“ecb”、“cbc”、“cfb”、“ofb”、“ nofb”或“stream”,但我读到实际上还有更多)。我不知道每个人做什么或如何使用它们。
我读到两件事,即不应使用 ECB 模式,也不应使用 MCRYPT_RAND 模式。他们没有解释原因。对于 ECB 模式,我想这是因为它总是为相同的纯文本生成相同的加密输出(也许这可以用于攻击),不知道 MCRYPT_RAND (由 @azz 此处)。
我的问题是,我应该使用什么 mcrypt 模式,如果能看到使用它的 php 代码示例就太好了,因为我发现的所有示例都使用 ECB。我尝试加密的字符串将仅包含 ascii 文本和可变长度,不超过 500 个字符。
I am trying to encrypt some text messages using mcrypt from php and the cipher Rijndael, but I am not sure about the MCRYPT_MODE_modename (according to PHP's manual these are available "ecb", "cbc", "cfb", "ofb", "nofb" or "stream" but I read there are actually a few more). I have no idea what each one do or how to use them.
I read two things, that ECB mode should not be used and MCRYPT_RAND neither. They didn't explain why. For the ECB mode I guess it's because it always generate the same encrypted output for the same plain text (maybe this could be used for an attack), no idea about MCRYPT_RAND (mentioned by @azz here).
My question is, what mcrypt mode should I use, and it would be great to see an example of php code using it because all the examples I found use ECB. The strings I am trying to encrypt will contain only ascii text, and variable length, not bigger than 500 chars.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
ecb 是最简单的,并且有弱点,因此不推荐(http://en.wikipedia.org/wiki/块_cipher_modes_of_operation)。加拿大央行被认为明显强于欧洲央行。其他一些可能比 cbc 更强,但它们都与流相关,因此 cbc 应该适合您的需求。
来自... http://us.php.net/manual/en/mcrypt .constants.php...
我不确定为什么建议不要使用 MCRYPT_RAND,但这可能是因为许多系统上的系统随机数生成器不被认为是真正随机的。只有两种选择,并且根据您的系统和 PHP 版本,它们可能不可用。来自... http://php.net/manual/en/function .mcrypt-create-iv.php...
下面的代码只是一个快速示例。它有效,但我无法证明它的强度。
ecb is the simplest and has weaknesses so it is not recommended (http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation). cbc is considered significantly stronger than ecb. Some of the others may be even stronger than cbc but they are all stream related so cbc should suit your needs.
From... http://us.php.net/manual/en/mcrypt.constants.php...
I'm not sure why MCRYPT_RAND is recommended against but it may be because the system random number generator on many systems is not considered to be truely random. There are only two alternatives and they may not be available depending on your system and PHP version. From... http://php.net/manual/en/function.mcrypt-create-iv.php...
The code below is just a quick sample. It works but I can't attest to it's strength.
ECB 模式并不安全,因为它不会在加密数据中引入随机性。这基本上意味着您将在输出中看到相同的输入模式(即查看报告的图像 这里是Tux的“加密”版本,Linux的标志)。
MT_RAND 不被认为是安全的,因为它使用操作系统的随机数生成器(PHP 的
rand()
函数)。出于加密目的,最好使用
MCRYPT_DEV_RANDOM
(从 /dev/random 读取数据)或MCRYPT_DEV_URANDOM
(从 /dev/urandom 读取数据)。Mcrypt 提供的最常用且安全的加密模式是 CBC 和 CTR 模式,适用于一般用例。使用加密+身份验证(即使用 HMAC 进行加密然后身份验证)总是更好。例如,无需认证的CBC模式就受到Padding Oracle攻击的影响。
The ECB mode is not secure because it doesn't introduce randomness in the encrypted data. That basically means you will see the same patterns of the input in the output (i.e. see the image reported here, it's an "encrypted" version of Tux, the logo of Linux).
The MT_RAND is not considered secure because it uses the random number generator of the operating system (the
rand()
function of PHP).For cryptography purposes it's better to use
MCRYPT_DEV_RANDOM
(read data from /dev/random) orMCRYPT_DEV_URANDOM
(read data from /dev/urandom).The most used and secure encryption modes, available with Mcrypt, are CBC and CTR mode and are fine for general use cases. It's always better to use encryption + authentication (i.e. encrypt-then-authenticate using HMAC). For instance, the CBC mode without authentication is affected by the Padding Oracle attack.