php mcrypt函数错误--- wamp中的解密失败

时间:2015-03-28 08:43:14

标签: php encryption

我使用php mcrypt函数来解密我的文本文件。

的1.txt

1
2
3

我使用file()函数将值放入数组并在d.php中设置解密函数。

d.php

<?php
function encryptData($array){
$key = "secret key";
$noenarray = $array;
$iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB);
$iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
foreach ($noenarray as $k => $value) {
    $cryptarray[$k] = mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $key,$noenarray[$value], MCRYPT_MODE_ECB, $iv);
}
return $cryptarray;
}

function decryptData($array){
$key = "secret key";
$cryptarray = $array;
$iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB);
$iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
foreach ($cryptarray as $k => $value) {
    $decryptarray[$k] = mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $key,$cryptarray[$value], MCRYPT_MODE_ECB, $iv);
}
return $decryptarray;
}

function test($name){
$path = "$name.txt";
$i = file($path);
$di = decryptData($i);
$ei=encryptData($di);
echo "1.txt";
echo "<br>";
print_r($i);
echo "<br>";
echo "decrypt 1.txt";
echo "<br>";
print_r($di);
echo "<br>";
echo "encrypt 1.txt";
echo "<br>";
print_r($ei);
}

test(1);
?>

我尝试运行代码,但1,2,3的解密输出是相同的。

更新 我也尝试加密解密的数组,然后输出不正确。

输出1.php

1.txt
Array ( [0] => 1 [1] => 2 [2] => 3 ) 
decrypt 1.txt
Array ( [0] => ÆÃ5oj¨K ¯«^yäô½ô‘+Çk2äwâÔ [1] => ÆÃ5oj¨K ¯«^yäô½ô‘+Çk2äwâÔ [2] => ÆÃ5oj¨K ¯«^yäô½ô‘+Çk2äwâÔ )
encrypt 1.txt
Array ( [0] => NÉ™ "hI†¢'„Ÿ]6ŸU9óþ¸ÃÝgo¯è [1] => NÉ™ "hI†¢'„Ÿ]6ŸU9óþ¸ÃÝgo¯è [2] => NÉ™ "hI†¢'„Ÿ]6ŸU9óþ¸ÃÝgo¯è )

我的代码有什么问题?

1 个答案:

答案 0 :(得分:0)

在ECB模式下,

1不是Rijndael-256的有效密文。密文长度必须是块大小的倍数,即n * 32字节。

也许您打算首先加密并然后解密您的文件。请注意,加密数据可能包含每个可能的字节,因为它是二进制的。因此它可能每个都包含\n个字节。这意味着您无法读取数据线以进行解密。您需要在一次传递中加密整个文件,或者在加密后对文件部分进行编码,以使其不能包含换行符。

另一个问题是你的密钥。它必须是16,24或32字节长。 mcrypt很乐意接受一个不完整的密钥,但是你会遇到其他期望密钥具有一定大小的良好实现的问题。 AFAIK,mcrypt用0x00字节填充给定的密钥,直到达到有效的密钥大小。

此外,ECB模式不支持IV,因此无需创建IV。但欧洲央行在语义上也不安全。您应该至少使用CBC模式,如果可能,请使用mcrypt不提供的身份验证模式。