PHP - mcrypt在加密字符串上使用什么编码?

时间:2010-02-01 04:26:09

标签: php binary mcrypt

使用PHP我试图将mcrypt生成的密文转换为二进制文件,但是当我尝试将其转换回密文时,它不会被正确转换回来,因此无法解密。我假设我的编码在某个地方搞砸了,但我不知道从哪里开始弄明白。以下是网站http://dev.hersha.me/str2bin.php的链接,这是我的代码。

<?php

class phpSteg {

function bin2bstr($input) {
    if (!is_string($input)) return null;
    return pack('H*', base_convert($input, 2, 16)); 
}

function bstr2bin($input) {
    if (!is_string($input)) return null;
    $value = unpack('H*', $input);
    return base_convert($value[1], 16, 2);
}


};

$steg = new phpSteg();

//echo $steg->bstr2bin('OMG') . "\n <br \>";
//echo $steg->bin2bstr('010011110100110101000111') . "\n <br \>";
$hash =  hash('md5',"OMGZWTF");
echo $hash . "\n <br \>";
$message = "OMG WTF BBQ";

$text = $message;
$key = $hash;

$iv = mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_CFB), MCRYPT_RAND);
echo $iv . "\n <br \>";
$encrypted = mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $key, $text, MCRYPT_MODE_CFB, $iv);

$binenc = $steg->bstr2bin($encrypted);

$bstrenc = $steg->bin2bstr($binenc);


$decrypted = mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $key, $bstrenc, MCRYPT_MODE_CFB, $iv);
echo "Cipher Text : " . $encrypted . "\n <br \>";

echo "Cipher Text (binary) : " . $binenc . "\n <br \>";

echo "Cipher Text (back from binary) : " . $bstrenc . "\n <br \>";

echo "Decryption : " . $decrypted; // The quick brown fox jumps over the lazy dog

?>

有什么想法吗?

3 个答案:

答案 0 :(得分:3)

不要使用bin2bstr和bstr2bin。如果你需要将字符串存储在某个地方(比如数据库),只需在加密后对字符串进行base64编码/解码。

$encrypted = mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $key, $text, MCRYPT_MODE_CFB, $iv);

$binenc = base64_encode($encrypted);

$bstrenc = base64_decode($binenc);

$decrypted = mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $key, $bstrenc, MCRYPT_MODE_CFB, $iv);

答案 1 :(得分:0)

在加密前尝试使用二进制字符串base64_encode,并在解密后使用base64_decode。否则Mcrypt可能会对数据感到窒息,而不会让你知道。

答案 2 :(得分:0)

所有问题都已解决。

首先:我正在重载base_convert功能。需要较小的数据集。

第二:相当简单明显,base_convert忽略前导零,所以转换时必须将它们添加回来。