加密字符串"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?;
谢谢!
答案 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)));
}