php解密加密数据

时间:2011-06-21 17:26:00

标签: php encryption

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

但我尝试将其解密回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; 
}

&GT?;

谢谢!

5 个答案:

答案 0 :(得分:3)

将您的hex2bin()功能更改为以下内容,其余的脚本将正常运行。

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

对于它的价值,“缺失”hex2bin()函数对PHP源代码是recently added,并且可能会在PHP 5.4.0中发布。

答案 1 :(得分:2)

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

PHP.net说:

mcrypt_encrypt(string $ cipher,string $ key,string $ data,string $ mode [,string $ iv]) mcrypt_decrypt(string $ cipher,string $ key,string $ data,string $ mode [,string $ 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!
?>

答案 2 :(得分:0)

对于那种工作,我通常使用base64_encode和decode,它可以使用类似于你的代码。

答案 3 :(得分:0)

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

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

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

答案 4 :(得分: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))); 
}