gpt4 book ai didi

php - 使用 OpenSSL/C++ 和 PHP/Mcrypt : the 1st block is decrypted only 的 AES-128-CBC 加密

转载 作者:太空宇宙 更新时间:2023-11-04 04:46:43 24 4
gpt4 key购买 nike

我编写的程序必须与基于 PHP 的 Web 服务交换加密数据。我使用带有 OpenSSL 的 C++ 在 CBC 模式下使用 AES-128 加密数据。我将 base64 编码的数据(IV 和密文)发送到 HTTP 服务器,PHP 必须使用 Mcrypt 解密数据。然而,只有第一个 block 被解密成功,其他 block 变成垃圾。我完全不明白:我们如何才能仅在 CBC 模式下解密第一个 block ?如果IV、 key 或 key 大小/ block 大小/轮数等算法设置错误,我们将无法收到正确解密的第一个 block ;如果解密参数没问题,怎么可能其他 block 没有解密呢?当我用 OpenSSL/C++ 解密 PHP 无法解密的相同密文时,解密成功。 PHP也是一样:我可以用CBC方式加密解密数据。但出于任何原因,OpenSSL EVP_aes_128_cbc 和 mcrypt 'rijndael-128' 不兼容。我的解密代码如下:

$chipher = mcrypt_module_open('rijndael-128', '', 'cbc', '');  
mcrypt_generic_init($chipher, $key, $iv);
$decrypted_data = mdecrypt_generic($chipher, $encrypted_data);

是mcrypt的错误还是有什么方法可以用OpenSSL AES-128-CBC加密数据并用PHP mcrypt解密?

最佳答案

嗯,错误出在 C++ 方面。我加密的数据是分段的,所以我不得不多次调用 EVP_CipherUpdate;因为在重复调用 EVP_CipherUpdate 时复制到输出缓冲区的数据太多,而且只有最后一个 block ,所以我不得不重复调用 EVP_CipherInit_ex 来清理 OpenSSL 上下文中的内部缓冲区。当我调用 EVP_CipherInit_ex 时,它重置了 IV,所以在某个点之后解密变得不可能。解决方案是在每次 EVP_CipherUpdate 调用后将最后版本的 IV(context.iv 指向最后一个 IV,context.oiv 指向原始版本)保存在缓冲区中,并将其传递给 EVP_CipherInit_ex 以允许 OpenSSL 对数据进行分段加密。当我这样做时,mcrypt 能够解密整个数据甚至删除填充。所以,mcrypt 非常好,我看到的问题是我的程序错误,而不是 mcrypt。

关于php - 使用 OpenSSL/C++ 和 PHP/Mcrypt : the 1st block is decrypted only 的 AES-128-CBC 加密,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20146808/

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