我尝试在两个不同的组件中执行加密和解密(Rijndael 256,ecb模式):
当客户端无法正确解密加密数据(由服务器端生成)时,我遇到了一个问题
所以..。我检查了:
因此,我用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++代码
谢谢,约翰尼·戴普
发布于 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_size或mcrypt_create_iv。
取而代之的是调用不带IV的mcrypt_encrypt。根据PHP documentation,IV中的所有字节都将被设置为'\0‘。
C++代码也是如此。根本不需要设置任何IV。libgcrypt代码很复杂,但从1.4.5版的源代码来看,在ECB模式下,似乎根本没有使用IV。
如果生成的密文仍然不同,那么问题出在别的地方。
脑海中浮现出几种可能性:
https://stackoverflow.com/questions/3148896
复制相似问题