php - PHP 的 mcrypt 扩展是否符合 FIPS 197 标准?

标签 php cryptography mcrypt fips

我正在使用以下加密代码,它非常有用,但我必须验证它是否符合 FIPS 197 标准,否则法律会杀了我。

mcrypt_encrypt(MCRYPT_RIJNDAEL_256, SALT, $plaintext, MCRYPT_MODE_ECB,
               mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB),
                                MCRYPT_RAND))

mcrypt_decrypt(MCRYPT_RIJNDAEL_256, SALT, $plaintext, MCRYPT_MODE_ECB,
               mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB),
                                MCRYPT_RAND))

最佳答案

Mcrypt 的 RIJNDAEL_256 算法是 Rijndael 算法的版本, block 大小为 256 位。 AES(这是 FIPS 197 定义的)只有 128 位 block 大小(和三种不同的 key 大小)的版本。

所以不,您在这里没有使用 AES。改用 RIJNDAEL_128,这与 AES 相同。

您的代码还有其他问题:

  • 如果您使用同一 key 加密多个 block ,则切勿使用 ECB。所以,从来没有。请改用安全的操作模式,例如 CBC 或 CTR。

  • 正如 CodeInChaos 评论的那样,您通常希望确保您还具有真实性,而不仅仅是保密性(并且根据您的协议(protocol),您甚至可能需要身份验证才能保密)。因此,将 MAC 添加到您的消息中,或使用一种同时提供身份验证和 secret 性的操作模式(如 CCM 或 GCM)——不确定 mcrypt 中包含哪些。

  • 您生成一个关于加密(好)和解密(坏)的随机初始化向量。这对 ECB 来说无关紧要,因为它不使用初始化向量,但在任何其他模式下,您都会为两个操作获得不同的初始化向量,这意味着解密会得到不同的结果。对于 CBC,只有第一个 block 是垃圾,而对于 CTR,所有内容都是垃圾(CCM/GCM 将简单地报告“失败”)。

    由于初始化向量不需要保密(只是不可预测或不可重复,具体取决于模式),习惯上将它与消息一起发送(作为前缀),或者派生它(在两侧)来自一个共同的 secret (就像 SSL/TLS 中的第一个初始化向量,它从主 secret 派生,就像加密 key 和 MAC key 一样)。

关于php - PHP 的 mcrypt 扩展是否符合 FIPS 197 标准?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8053208/

相关文章:

PHP boolean 值到带有修改和条件的字符串

php - 无法在 PHP 中运行 bash 脚本

mysql - 散列密码字段使用什么数据类型和长度?

javascript - 使用 Web 加密 API 验证 JavaScript 中的 Browserid 断言

PHP crypt 和 salt - 请详细说明

php - 无法向数据库插入MCRYPT加密数据

php - 什么是 Chrome 数据压缩代理?

php - 正则表达式是否足够或我需要更多检查?

java - 解码来自 X500Name 的 DER 编码值

php - Laravel 需要 Mcrypt PHP 扩展