gpt4 book ai didi

php - 加密库冲突(MCrypt、libgcrypt)

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:36:35 29 4
gpt4 key购买 nike

我正在尝试在两个不同的组件中执行加密和解密(Rijndael 256,ecb 模式):
1. PHP - 服务器端(使用 mcrypt)
2. C++ - 客户端(使用 gcrypt)

当客户端无法正确解密(由服务器端生成的)加密数据时,我遇到了一个问题
所以...我检查了:
1.初始 vector -same same(32长度)
2. key - 两边同样的 key ..

所以我用 C++ 编写了一些代码来加密数据(使用与 php 中相同的参数)
我发现加密数据包含不同的字节(可能是编码问题??)

我很乐意得到一些帮助

PHP-MCrypt


// Encrypt Function
function mc_encrypt($encrypt, $mc_key) {
$iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB);
$iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
$iv = "static_init_vector_static_init_v";
echo "IV-Size: " . $iv_size . "\n";
echo "IV: " . $iv . "\n";
$passcrypt = mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $mc_key, $encrypt, MCRYPT_MODE_ECB, $iv);
print_hex($passcrypt);
return $encode;
}

mc_encrypt("Some text which should be encrypted...","keykeykeykeykeykeykeykeykeykeyke");

我会在评论中发布 C++ 代码

谢谢,约翰尼德普

最佳答案

好的。我会将我的评论作为答案:

ECB 模式不使用初始化 vector (IV)。如果提供,不同的实现可能会有所不同。

如果您想确保实现能够正常工作,请使用 IV 0(零)。即使您提供了 IV,两种实现都应该忽略它,但人们永远无法确定这一点。在 ECB 模式下不提供 IV 应该也可以,但同样,这完全取决于实现。

根据 PHP documentation MCrypt 将忽略它。 GCrypt 我不确定。

mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB) 实际上应该返回 0,因为您指定了 ECB 模式。

编辑:

不要调用mcrypt_get_iv_sizemcrypt_create_iv
而是在没有 IV 的情况下调用 mcrypt_encrypt。根据 PHP documentation IV 中的所有字节都将设置为“\0”。

C++ 代码也是如此。根本不需要设置任何 IV。 libgcrypt 代码很复杂,但从 1.4.5 版本的源代码来看,然后在 ECB 模式下,似乎根本没有使用 IV。

如果生成的密文仍然不同,则问题出在其他地方。
我想到了几种可能性:

  • 编码 - 服务器和客户端使用的编码相同吗?
  • 字节顺序——服务器和客户端是什么类型的系统?大端还是小端?

关于php - 加密库冲突(MCrypt、libgcrypt),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3148896/

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