2011-06-21 192 views
0

加密字符串"1234567890"后,我用hex2bin函数将加密的字符串转换为二进制格式并得到"ea359482e4b20603bfe9"php解密加密数据

但我试图解密回1234567890失败(总是得到有线字符)。

我错过了什么?

下面是一个示例。

<?php 

$text = "1234567890"; 
$key = "TestingKey"; 
echo "SRC: ".$text."<br/>"; 

$iv = mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_CFB), MCRYPT_RAND); 
$encrypted = mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $key, $text, MCRYPT_MODE_CFB, $iv); 
//$encrypted = bin2hex($encrypted); 
$encrypted = "ea359482e4b20603bfe9"; //this was one of the string that came out. 
echo "ENC: ".$encrypted."<br/>"; 

$encrypted = hex2bin($encrypted); 
$decrypted = mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $key, $encrypted, MCRYPT_MODE_CFB, $iv); 
echo "DEC: ".$decrypted."<br/>"; 

function hex2bin($text) 
{ 
    $len = strlen($text); 
    for($i=0;$i<$len;$i+=2) 
    { 
     $binary .= pack("C",hexdec(substr($text,$i,2))); 
    } 
    return $binary; 
} 

?>

谢谢!

回答

0

对于这种工作,我通常使用base64_encode和解码,它与代码类似于你的代码。

+0

谢谢Manhim。不幸的是,我必须使用mcrypt_encrypt,因为我正在处理的项目需要使用这种方法。 – Felasfaw

+0

@Felasfaw我的意思是,而不是hex2bin,不用于加密o.O – Manhim

0

mcrypt_encrypt已经以字符串的形式返回加密数据 - 为什么要经过进一步的转换?如果你担心传输(例如电子邮件),那么你可以在加密之后使用base64 encode/decode,如果你担心数据库的存储,只要确保你转义了SQL中的字符串(或使用数据库参数)即可。

此外,“最好不要使用ASCII字符串键”。尝试改为:

$key=hash("SHA256", "TestingKey", true); 
0

你可以用两个简单的功能:

define('SALT', 'your secret salt'); 

function encrypt($text) 
{ 
    return trim(base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, SALT, $text, MCRYPT_MODE_ECB, mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB), MCRYPT_RAND)))); 
} 

function decrypt($text) 
{ 
    return trim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, SALT, base64_decode($text), MCRYPT_MODE_ECB, mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB), MCRYPT_RAND))); 
} 
+1

你不需要对同一个加密字符串使用相同的IV吗?或者我只是在加密失败? – Manhim

3

更改您的hex2bin()功能以下内容,你的脚本的其余部分将工作得很好。

function hex2bin($text) 
{ 
    return pack('H*', $text); 
} 

对于它的价值,“丢失”的hex2bin()功能是recently added到PHP源代码,很可能会用PHP 5.4.0发布。

2

为什么你使用hexbin?只需使用PHP的mcrypt_decrypt()和mycrypt_encrypt()函数即可完成。它们基本上采用相同的参数,唯一的区别是您传递给它的数据字符串的状态。

PHP.net说:

mcrypt_encrypt(字符串$密码,字符串$键,字符串$数据,串$模式[,字符串$ IV]) mcrypt_decrypt(字符串$密码,字符串$键,字符串$数据,串$模式[,串$ IV])

因此,这里是一些示例代码我鞭打在一起你...

<?php 
$iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB); 
$iv = mcrypt_create_iv($iv_size, MCRYPT_RAND); 

$key = "This is a very secret key"; 
$text = "Meet me at 11 o'clock behind the monument."; 

//Lets encrypt it 
$encrypted_text = mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $key, $text, MCRYPT_MODE_ECB, $iv); 
echo "Here is the encrypted text: $encrypted_text\n<br>\n"; 

//Do whatever with it. Store it, transmit it, whatever... 

//Ok, I want it back. Lets decrypt it. 
$decrypted_text = mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $key, $encrypted_text, MCRYPT_MODE_ECB, $iv); 

//Hooray, the data is back! 
?>