2

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

当客户端无法正确解密加密数据(由服务器端制作)时,我遇到了问题,
所以...我检查了:
1.初始向量 - 相同(32长度)
2.密钥 - 再次相同两边的钥匙。。

所以我用 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++ 代码

谢谢,约翰尼德普

4

1 回答 1

1

好的。我会让我的评论成为答案:

在 ECB 模式下不使用初始化向量 (IV)。如果提供了不同的实现,可能会有不同的工作方式。

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

根据 PHP文档,MCrypt 会忽略它。GCrypt 我不确定。

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

编辑:

不要打电话mcrypt_get_iv_sizemcrypt_create_iv
而是mcrypt_encrypt在没有 IV 的情况下调用。根据 PHP文档,IV 中的所有字节都将设置为 '\0'。

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

如果生成的密文仍然不同,那么问题是别的。
我想到了几种可能性:

  • 编码 - 服务器和客户端是否使用相同的编码?
  • Endianness - 服务器和客户端是什么类型的系统?大端 vs 小端?
于 2010-06-30T12:16:51.520 回答