MCRYPT函数返回错误的结果

时间:2013-01-27 17:07:29

标签: php encryption mcrypt

我正在尝试对我使用MCRYPT制作的一些随机字符串进行编码和解码,但它们无法正确解码。

这是我用来编码字符串的函数:

function m_encrypt($key, $text, $iv) {
    return mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key, $text, MCRYPT_MODE_CBC, $iv);
}

正如您所看到的,它需要我编写的预定义“密钥”,要编码的文本以及在单独文件中创建的iv。然后它会加密数据并将其返回。

这是将字符串插入数据库的函数:

$sth = $dbh->prepare('INSERT INTO randomStrings(random_string, iv) VALUES (:random_string, :iv)');
$iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC);

$rows = 50;

for($i = 0; $i < $rows; $i++) {
    $iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
    $randString = get_random_string($chars, 20);
    $randString = m_encrypt($key, $randString, $iv);
    $sth->bindParam(':random_string', $randString);
    $sth->bindParam(':iv', $iv);
    $sth->execute();    
}

我只是将字符串和iv插入数据库。

接下来,我尝试使用以下方法读取编码的字符串:

function m_decrypt($key, $text, $iv) {
    return mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $key, $text, MCRYPT_MODE_CBC, $iv);
}

与编码功能类似,但相反。

最后,尝试解密字符串的文件如下所示:

$sth = $dbh->prepare('SELECT * FROM randomStrings');
$sth->execute();    

while($result = $sth->fetch(PDO::FETCH_ASSOC)) {
    echo m_decrypt($key, $result['random_string'], $result['iv']);
    echo '<br/>';
}

结果总是一些任意字符集,如

í,eHGxC•z»@”“§``

我知道这不可能是正确的,因为我将随机字符串生成中使用的字符限制为简单的a-z和0-9所以这不可能是正确的解码,任何帮助都是值得赞赏的。

1 个答案:

答案 0 :(得分:0)

加密字符串和/或IV可能会被您的数据库损坏。要测试是否是这种情况,您可以将它们保存在数据库中,立即将它们取回并将结果与​​原始数据进行比较。

您尚未指定要使用的数据库软件,但如果是MySQL,则用于存储加密数据的相应列类型可以是VARBINARYBLOB。 (对于IV应该具有恒定长度,BINARY也可以工作。实际上,通常存储IV的方法是简单地将它们添加到加密字符串中。)