PHP - Какую кодировку использует mcrypt для зашифрованной строки? - PullRequest
1 голос
/ 01 февраля 2010

Используя 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 ]

3 голосов
/ 01 февраля 2010

Не стоит использовать 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);
0 голосов
/ 16 февраля 2010

Все проблемы решены.

Первое: я перегружал функцию base_convert. Нужен меньший набор данных.

Второе: на самом деле довольно просто и очевидно, base_convert игнорирует ведущие нули, поэтому при преобразовании приходилось добавлять их обратно.

0 голосов
/ 01 февраля 2010

Попробуйте base64_encode в вашей двоичной строке перед шифрованием и используйте base64_decode после ее расшифровки. В противном случае Макрипт может задохнуться от данных, не давая вам знать.

...