gpt4 book ai didi

php - 使用 Blowfish 和 ECB 将 mcrypt 迁移到 OpenSSL

转载 作者:可可西里 更新时间:2023-11-01 00:39:11 25 4
gpt4 key购买 nike

我一辈子都想不出如何将我遗留的 mcrypt 代码迁移到 OpenSSL。我用 CBC 为 Blowfish 和 CBC 为 Rijndael 工作,但是 Blowfish 和 ECB 却让我望而却步。

是的,我读了Moving from mcrypt with Blowfish & ECB to OpenSSL我尝试对数据进行零填充,而不是对数据进行零填充,对 key 进行零填充,循环遍历 key 以及它们的任意组合,但似乎没有任何效果。

这是我的代码:

<?php
function encrypt_with_mcrypt($data, $key) {
return mcrypt_encrypt(MCRYPT_BLOWFISH, $key, $data, MCRYPT_MODE_ECB);
}

function encrypt_with_openssl($data, $key) {
return openssl_encrypt($data, 'BF-ECB', $key, OPENSSL_RAW_DATA | OPENSSL_DONT_ZERO_PAD_KEY);
}

$data = 'foobar';
$key = 'supersecretkey';

var_dump(base64_encode(encrypt_with_mcrypt($data, $key)));
var_dump(base64_encode(encrypt_with_openssl($data, $key)));

这是输出:

test.php:13:
string(12) "5z0q3xNnokw="
test.php:14:
string(12) "1zyqavq7sCk="

最佳答案

mcrypt 库/包装器默认为零字节填充(仅在需要时),而 OpenSSL 库/包装器默认为 PKCS#5 填充。这意味着单个 block 的填充方式不同,因此会显示不同的密文 block 。


一个常见的技巧是解密生成的密文而不任何去填充,然后通过查看明文 + 十六进制填充来检查填充字节。

这会告诉你:

5z0q3xNnokw=
666f6f6261720000

对于 mcrypt 和

1zyqavq7sCk=
666f6f6261720202

用于 OpenSSL。

使用需要加密多个 block 的更大明文消息也会向您表明,除了最后一个 block , 加密没有问题。


首先对数据进行零填充当且仅当 mcrypt 输入不是 8 字节的倍数(Blowfish 的 block 大小),然后使用 OPENSSL_ZERO_PADDING 作为填充模式。

请注意,查看源代码表明 OPENSSL_ZERO_PADDING 由于某些未指明的原因似乎意味着包装器的“无填充”并且 OPENSSL_NO_PADDING 似乎与其他设置冲突- 我认为这是 PHP OpenSSL 包装器 API 开发人员的一个相当糟糕的设计和实现错误。

更多信息可以通过the great research performed by Reinier找到显示 API 如何填充/取消填充(或忘记填充/取消填充,具体取决于您所处的位置)。

关于php - 使用 Blowfish 和 ECB 将 mcrypt 迁移到 OpenSSL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52537909/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com