PHP расшифровывает зашифрованные данные - PullRequest
0 голосов
/ 21 июня 2011

После шифрования строки "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; 
}

?>

Спасибо!

Ответы [ 5 ]

3 голосов
/ 21 июня 2011

Измените вашу hex2bin() функцию на следующую, и остальная часть вашего скрипта будет работать нормально.

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

Что бы это ни стоило, «отсутствующая» функция hex2bin() была недавно добавлена ​​ в исходный код PHP и, вероятно, будет выпущена с PHP 5.4.0.

2 голосов
/ 21 июня 2011

Почему вы вообще используете hexbin?Просто используйте PHP-функции mcrypt_decrypt () и mycrypt_encrypt () и покончите с этим.По сути, они принимают одни и те же параметры, единственное отличие - это состояние строки данных, передаваемой вами.

PHP.net говорит:

mcrypt_encrypt (строка $ cipherстрока $ key, строка $ data, строка $ mode [, строка $ iv]) mcrypt_decrypt (строка $ шифр, строка $ key, строка $ data, строка $ mode [, строка $ 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!
?>
0 голосов
/ 21 июня 2011

mcrypt_encrypt уже возвращает зашифрованные данные в виде строки - зачем проходить дальнейшее преобразование?Если вас беспокоит транспорт (например, электронная почта), вы можете использовать base64 encode / decode после шифрования, если вы беспокоитесь о хранении базы данных, просто убедитесь, что вы экранировали строку в SQL (или используете базу данных).параметры).

Кроме того, «Лучше не использовать строки ASCII для ключей».Попробуйте вместо:

$key=hash("SHA256", "TestingKey", true);
0 голосов
/ 21 июня 2011

Вы можете использовать две простые функции:

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))); 
}
0 голосов
/ 21 июня 2011

Для такой работы я обычно использую base64_encode и decode, и он работает с кодом, похожим на ваш.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...