【发布时间】:2017-05-02 02:28:43
【问题描述】:
我有这个mcrypt_encrypt 电话,对于给定的$key、$message 和$iv:
$string = mcrypt_encrypt(MCRYPT_3DES, $key, $message, MCRYPT_MODE_CBC, $iv);
我想将 mcrypt_encrypt 调用更改为 openssl_encrypt 调用,以保证未来的发展。
通过$mode = 'des-ede3-cbc' 或$mode = '3DES'; 和$options = true 我得到更相似的响应,但不完全相同。有没有其他方法可以称之为完美匹配?
我正在为 lorem-ipsum $message+$key 组合得到这个(base64_encoded),所以我开始相信一个函数或另一个函数在加密之前填充了一些消息......
对于 mcrypt:
"Y+JgMBdfI7ZYY3M9lJXCtb5Vgu+rWvLBfjug2GLX7uo="
对于openssl:
"Y+JgMBdfI7ZYY3M9lJXCtb5Vgu+rWvLBvte4swdttHY="
尝试使用 $options 传递 OPENSSL_ZERO_PADDING,但传递了除 1(OPENSSL_RAW_DATA 或 true 之外的任何内容) 产生一个空字符串 ...
既不使用OPENSSL_ZERO_PADDING 也不使用OPENSSL_RAW_DATA | OPENSSL_ZERO_PADDING 工作... :(
我正在使用“OpenSSL 1.0.2g 2016 年 3 月 1 日”。
已经阅读this q&a,但对我没有帮助。不是有填充问题的onlyone,但到目前为止还没有解决方案。第二个答案谈到 adding 填充到 mcrypt 调用,我真的很想从 openssl 加密调用中删除填充...
【问题讨论】:
-
你永远不应该得到完美的匹配,永远。这就是初始化向量的用途。每次使用 same 算法和 same 密钥加密 same 有效负载时,如果您想要安全,您应该得到完全不同的输出。如果您为相同的输入获得相同的输出,则您的加密很弱。这就是加密中 IV 的意义所在。加密后,您将带有 IV 的加密有效负载传送到另一端。
-
如果我使用相同的有效载荷,相同的算法,相同的 IV;我认为我应该得到相同的输出。没关系,我应该为每个调用使用不同的 IV:对两个调用(mcrypt 和 openssl)使用相同的 IV,我认为我应该得到相同的输出,对吗?我开始相信这与消息填充有关,因为输出的乞求是相同的。
-
如果一切都一样,那么你应该得到相同的输出,对。
openssl_encrypt的第四个参数控制填充。您可以使用$encrypted = openssl_encrypt($data, $alg, $key, OPENSSL_ZERO_PADDING, $iv);加密并检查是否得到相同的输出。在www.php.net/openssl_encrypt,您可以阅读 cmets 了解如何使用第 4 个参数。 -
OPENSSL_ZERO_PADDING不起作用,至少对我来说……但是是的 - 填充是您无法获得相同结果的原因。但是,您的加密方案有很多错误,您不妨将其替换为新的 - 请为此使用库,不要自行滚动。 -
现在即将了解如何进行此调用并获得与使用 mcrypt 相同的结果。感谢您的 cmets 加密。这既不是完整的解决方案,我也无权更改此代码库中我想要的所有内容。
标签: php openssl mcrypt 3des php-openssl