如何使用之前使用 mcrypt 加密的 OpenSSL 解密字符串?

Posted

技术标签:

【中文标题】如何使用之前使用 mcrypt 加密的 OpenSSL 解密字符串?【英文标题】:How to decrypt a string with OpenSSL which was previously encrypted with mcrypt? 【发布时间】:2017-07-05 01:08:17 【问题描述】:

由于 mcrypt 在 php 7.1 中已被弃用,并且我在现有项目中有大量使用 mcrypt 加密/解密的数据,如何将我的 PHP 代码从 mcrypt 迁移到 OpenSSL?我有以下代码要加密:

$encoded = base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, 'salt', 'source string', MCRYPT_MODE_ECB));

而解密码是:

$source = mcrypt_decrypt(MCRYPT_RIJNDAEL_256, 'salt', base64_decode('encoded string'), MCRYPT_MODE_ECB);

我应该在上面的示例中使用哪些openssl_ 函数来获得相同的结果而无需编码数据转换?

或者唯一的方法是运行一个脚本,该脚本将使用 mcrypt 解密我存储的所有加密数据并使用 openssl 进行编码?

谢谢

【问题讨论】:

不要使用 ECB 模式,它不安全,请参阅ECB mode,向下滚动到企鹅。 PHP replace mcrypt with openssl? 【参考方案1】:

OpenSSL 没有 Rijndael-256 密码;没有等价物 - 您必须解密并重新加密所有内容。

还有:

您缺少填充和身份验证。 不要使用 ECB 模式。 “salt”不是正确的加密密钥,也不是任何常规字符串。使用random_bytes() 生成您的密钥,具有适合所选算法的密钥长度

以上所有内容都可以这样总结:不要自己做,使用经过严格审查的库,例如defuse/php-encryption。

密码学不是一件简单的事情,你不能只用 5 行代码就可以正确地做到这一点。

【讨论】:

感谢您的回答。你能建议一个合适的 random_bytes() 长度吗?您能否建议一个类似于或优于 Rijndael-256 的 openssl 算法用于常规网站使用,例如密码加密?我的实际任务不是用户密码加密,而是类似的。 没有普遍适用的长度……这取决于算法。至于算法本身 - 只需使用一个库。

以上是关于如何使用之前使用 mcrypt 加密的 OpenSSL 解密字符串?的主要内容,如果未能解决你的问题,请参考以下文章

PHP的Mcrypt加密扩展知识了解

PHP的Mcrypt加密扩展知识了解

使用 codeiginter 加密库对数据进行编码并使用 js-mcrypt 进行解密

如何在 armv7 架构中构建 mcrypt 库?

mcrypt 如何加/解密 ?

使用php mcrypt加密解密