微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

我正在使用以下加密代码,它就像一个魅力,但我必须验证它符合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算法是具有256位块大小的Rijndael算法的版本. AES(这是FIPS 197定义的)仅具有128位块大小(以及三种不同的密钥大小)的版本.

所以不,你这里没有使用AES.请改用RIJNDAEL_128,它与AES相同.

您的代码还有其他问题:

>如果使用相同的密钥加密多个块,则不应使用ECB.所以,永远不要.使用安全操作模式,如CBC或CTR.
>正如CodeInChaos评论的那样,您通常希望确保您也具有真实性,而不仅仅是机密性(根据您的协议,您甚至可能需要进行身份验证以进行保密).因此,在您的消息中添加MAC,或使用一种操作模式,该操作模式还提供身份验证以及机密性(如CCM或GCM) – 不确定mcrypt中包含哪些.
>您在加密(好)和解密(坏)上生成随机初始化向量.这对于ECB无关紧要,因为它不使用初始化向量,但是对于任何其他模式,您将为这两个操作获得不同的初始化向量,这意味着解密将获得不同的结果.对于CBC,只有第一个块是垃圾,而CTR一切都是垃圾(而CCM / GCM只会报告“失败”).

由于初始化向量不需要是秘密的(只是不可预测或不重复,取决于模式),因此可以将其与消息(作为前缀)一起发送,或者派生它(在双方)来自一个共同的秘密(就像SSL / TLS中的第一个初始化向量,它们来自主密钥,就像加密密钥和MAC密钥一样).

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐