首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >密码库冲突(MCrypt、libgcrypt)

密码库冲突(MCrypt、libgcrypt)
EN

Stack Overflow用户
提问于 2010-06-30 19:46:04
回答 1查看 1.4K关注 0票数 2

我尝试在两个不同的组件中执行加密和解密(Rijndael 256,ecb模式):

  1. PHP -服务器端(使用mcrypt)
  2. C ++-客户端(使用gcrypt)

当客户端无法正确解密加密数据(由服务器端生成)时,我遇到了一个问题

所以..。我检查了:

  1. initial vector - same same (32 length)
  2. key (初始向量-相同(32个长度))
  3. 密钥-两边也是相同的密钥..

因此,我用C++编写了一些代码来加密数据(使用与php中相同的参数)

我发现加密的数据包含不同的字节(可能是编码问题??)

如果能得到一些帮助我会很高兴的

PHP - MCrypt

代码语言:javascript
复制
// 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++代码

谢谢,约翰尼·戴普

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-06-30 20:16:52

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

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

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

根据PHP documentation的说法,MCrypt将忽略它。GCrypt我不太确定。

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

编辑:

请勿调用mcrypt_get_iv_sizemcrypt_create_iv

取而代之的是调用不带IV的mcrypt_encrypt。根据PHP documentation,IV中的所有字节都将被设置为'\0‘。

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

如果生成的密文仍然不同,那么问题出在别的地方。

脑海中浮现出几种可能性:

  • 编码-在服务器和client?
  • Endianness中使用相同的编码-服务器和客户端是哪种类型的系统?Big- vs Little-endian?
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3148896

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档