【问题标题】:Using PHP mcrypt with Rijndael/AES将 PHP mcrypt 与 Rijndael/AES 一起使用
【发布时间】:2011-09-18 00:24:03
【问题描述】:

我正在尝试使用来自 php 的 mcrypt 和密码 Rijndael 加密一些文本消息,但我不确定 MCRYPT_MODE_modename(根据 PHP 的手册,这些是可用的“ecb”、“cbc”、“cfb”、“ofb "、"nofb" 或 "stream" 但我读到实际上还有更多)。我不知道每个人做什么或如何使用它们。

我读了两件事,不应该使用 ECB 模式,也不应该使用 MCRYPT_RAND。他们没有解释原因。对于 ECB 模式,我猜这是因为它总是为相同的纯文本生成相同的加密输出(也许这可能用于攻击),不知道 MCRYPT_RAND(@azz here 提到)。

我的问题是,我应该使用什么 mcrypt 模式,很高兴看到一个使用它的 php 代码示例,因为我发现的所有示例都使用 ECB。我要加密的字符串将仅包含 ascii 文本和可变长度,不大于 500 个字符。

【问题讨论】:

标签: php encryption cryptography aes mcrypt


【解决方案1】:

ecb 是最简单的,也有弱点,所以不推荐(http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation)。 cbc 被认为明显强于 ecb。其他一些可能比 cbc 更强大,但它们都与流相关,因此 cbc 应该适合您的需求。

来自...http://us.php.net/manual/en/mcrypt.constants.php...

  • MCRYPT_MODE_ECB(电子密码本)适用于随机数据,例如加密其他密钥。由于数据较短且随机,ECB的缺点具有良好的负面影响。
  • MCRYPT_MODE_CBC(密码块链接)特别适用于加密安全性比 ECB 显着提高的文件。
  • MCRYPT_MODE_CFB(密码反馈)是加密必须加密单个字节的字节流的最佳模式。
  • MCRYPT_MODE_OFB(输出反馈,8 位)与 CFB 相当,但可用于不能容忍错误传播的应用。它不安全(因为它在 8 位模式下运行),因此不建议使用它。
  • MCRYPT_MODE_NOFB(输出反馈,以 nbit 为单位)与 OFB 相当,但更安全,因为它对算法的块大小进行操作。
  • MCRYPT_MODE_STREAM 是一种额外模式,包含一些流算法,例如“WAKE”或“RC4”。

我不确定为什么不推荐使用 MCRYPT_RAND,但这可能是因为许多系统上的系统随机数生成器不被认为是真正随机的。只有两种选择,根据您的系统和 PHP 版本,它们可能不可用。来自...http://php.net/manual/en/function.mcrypt-create-iv.php...

  • IV 源可以是 MCRYPT_RAND(系统随机数生成器)、MCRYPT_DEV_RANDOM(从 /dev/random 读取数据)和 MCRYPT_DEV_URANDOM(从 /dev/urandom 读取数据)。在 5.3.0 之前,MCRYPT_RAND 是 Windows 上唯一支持的。

下面的代码只是一个简单的示例。它有效,但我无法证明它的强度。


"; $encryptedData = $objEncManager->mcryptEncryptString( $sensitiveData ); 回声“编码数据:_”。 $加密数据。 "_

"; echo "Enc 数据长度:" . strlen($encryptedData) 。 "

"; $decryptedData = $objEncManager->mcryptDecryptString($encryptedData, $objEncManager->lastIv); 回声“D-enc 数据:_”。 $解密数据。 "_

"; 回声“IV:_”。 $objEncManager->lastIv 。 "_

"; /* * 注意:这些函数不能准确处理数据 *被加密有尾随空格,所以数据 * 由他们加密的不能有任何。前导空格是可以的。 * * 注意:如果您的数据需要通过非二进制安全介质传递,您应该 * base64_encode 但这会使数据大 33%。 * * 注意:解密IV必须与加密IV相同所以加密 * IV 必须与加密数据一起存储或传输。 * 来自 (http://php.net/manual/en/function.mcrypt-create-iv.php)... *“IV 只是为了给加密例程提供一个替代种子。 * 这个 IV 根本不需要保密,尽管它可能是可取的。 *您甚至可以将其与您的密文一起发送而不会失去安全性。” * * 注意:这些方法不会对各种 mcrypt 函数的成功进行任何错误检查 */ 类数据加密器 { 常量 MY_MCRYPT_CIPHER = MCRYPT_RIJNDAEL_256; 常量 MY_MCRYPT_MODE = MCRYPT_MODE_CBC; const MY_MCRYPT_KEY_STRING = "1234567890-abcDEFGHUzyxwvutsrqpo"; // 这应该是一个随机字符串,推荐32字节 公共 $lastIv = ''; 公共函数 __construct() { // 没做什么 } /** * 接受明文字符串并返回加密版本 */ 公共函数 mcryptEncryptString( $stringToEncrypt, $base64encoded = true ) { // 设置初始化向量 $iv_size = mcrypt_get_iv_size(self::MY_MCRYPT_CIPHER, self::MY_MCRYPT_MODE); $iv = mcrypt_create_iv($iv_size, MCRYPT_RAND); $this->lastIv = $iv; // 加密数据 $encryptedData = mcrypt_encrypt(self::MY_MCRYPT_CIPHER, self::MY_MCRYPT_KEY_STRING, $stringToEncrypt, self::MY_MCRYPT_MODE, $iv); // 数据可能需要通过非二进制安全介质传递,因此如有必要,请对其进行 base64_encode。 (使数据大 33%) if ( $base64encoded ) { $encryptedData = base64_encode($encryptedData); $this->lastIv = base64_encode($iv); } 别的 { $this->lastIv = $iv; } // 返回加密数据 返回$加密数据; } /** * 接受明文字符串并返回加密版本 */ 公共函数 mcryptDecryptString( $stringToDecrypt, $iv, $base64encoded = true ) { // 注意:解密IV必须与加密IV相同,所以加密时必须存储加密IV // 数据可能已经过base64_encoded,因此如有必要,请对其进行解码(必须在解密之前) if ( $base64encoded ) { $stringToDecrypt = base64_decode( $stringToDecrypt ); $iv = base64_decode($iv); } //解密数据 $decryptedData = mcrypt_decrypt(self::MY_MCRYPT_CIPHER, self::MY_MCRYPT_KEY_STRING, $stringToDecrypt, self::MY_MCRYPT_MODE, $iv); // 返回解密后的数据 返回 rtrim($decryptedData); // 需要 rtrim 来删除加密期间添加的填充 } } ?>

【讨论】:

  • 警告:MCRYPT_RIJNDAEL_256 是 Rijndael 密码,块大小为 256 位,换句话说,它与 AES 不同。另请注意,PHP 不使用 PKCS#7 填充的事实标准,并且它不会非常优雅地处理键(在需要时扩展和切割)。再一次,随机生成器得到了改进。
【解决方案2】:

ECB 模式并不安全,因为它不会在加密数据中引入随机性。这基本上意味着您将在输出中看到相同的输入模式(即查看报告的图像here,它是 Tux 的“加密”版本,Linux 的徽标)。

MT_RAND 不被认为是安全的,因为它使用操作系统的随机数生成器(PHP 的rand() 函数)。

出于加密目的,最好使用MCRYPT_DEV_RANDOM(从/dev/random 读取数据)或MCRYPT_DEV_URANDOM(从/dev/urandom 读取数据)。

Mcrypt 提供的最常用和最安全的加密模式是 CBC 和 CTR 模式,适用于一般用例。最好使用加密 + 身份验证(即使用 HMAC 加密然后进行身份验证)。比如没有认证的CBC模式会受到Padding Oracle attack的影响。

【讨论】:

    猜你喜欢
    • 2017-12-26
    • 2018-10-04
    • 2014-09-12
    • 2016-02-21
    • 2013-10-21
    • 2011-10-15
    • 2011-04-04
    • 2011-11-12
    • 2013-06-06
    相关资源
    最近更新 更多