Расшифровка Mcrypt не работает - PHP

Я использую две простые функции для шифрования и расшифровки паролей. Но функция расшифровки работает неправильно. Вот мой вывод:

Зашифровано: �\� ���#�%\��>�3,�o�Sd��c�
Расшифровано: test123

и вот мой код:

$size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_CBC);
$iv = mcrypt_create_iv($size, MCRYPT_DEV_RANDOM);   

function encrypt($data)
{
    $key = 'test';
    $encrypted_data = mcrypt_cbc(MCRYPT_RIJNDAEL_256, $key, $data, MCRYPT_ENCRYPT, $iv);
    return $encrypted_data;
}

function decrypt($encryptedData)
{       
    $key = 'test';
    $decrypt = mcrypt_cbc(MCRYPT_RIJNDAEL_256, $key, $encryptedData, MCRYPT_DECRYPT, $iv);
    return $decrypt;
}


$password = encrypt($member[0]['PASSWORD']);
print('Encrypted: '.$password.'<br />');
$password = decrypt($password);
print('Decrypted: '.$password);

person Daniel Harris    schedule 05.02.2013    source источник
comment
Попробуйте вместо этого использовать этот код. Это определенно работает.   -  person John Conde    schedule 05.02.2013
comment
Здесь есть несколько ошибок; вы обрабатываете строку или пароль как ключ, вы используете Rijndael 256, который не совпадает с AES-256, и, наконец, вы явно не определяете кодировку символов для открытого текста. Это, очевидно, не считая вопроса IV в моем ответе.   -  person Maarten Bodewes    schedule 05.02.2013
comment
к сожалению, вам придется заставить mcrypt работать с AES-256. Что-то вроде создания шифра MCRYPT_RIJNDAEL_128, но с использованием 256-битного ключа. Также я не думаю, что кодировку символов в PHP нелегко контролировать. абсолютно прав насчет пароля.   -  person Peter Elliott    schedule 06.02.2013


Ответы (3)


Ну да, это то, что происходит, когда вы используете случайный IV для шифрования и новый для дешифрования. Вы должны генерировать IV только во время шифрования и, например. добавить его к зашифрованному тексту.

person Maarten Bodewes    schedule 05.02.2013

Проблема с $iv поколением. Вы генерируете его во время шифрования, а затем генерируете его СНОВА во время дешифрования.

$size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_CBC);
$iv = mcrypt_create_iv($size, MCRYPT_DEV_RANDOM);

function encrypt($data, $iv)
{
    $key = 'test';
    $encrypted_data = mcrypt_cbc(MCRYPT_RIJNDAEL_256, $key, $data, MCRYPT_ENCRYPT, $iv);
    return $encrypted_data;
}

function decrypt($encryptedData, $iv)
{
    $key = 'test';
    $decrypt = mcrypt_cbc(MCRYPT_RIJNDAEL_256, $key, $encryptedData, MCRYPT_DECRYPT, $iv);
    return $decrypt;
}

$password = encrypt("testing", $iv);
echo $password.'<br>';
echo decrypt($password, $iv);
person Achrome    schedule 05.02.2013
comment
Почему вы публикуете тот же ответ с опозданием на 7 минут? - person Maarten Bodewes; 05.02.2013
comment
Я проверил обновление после того, как опубликовал его. Я был на скрипке, работая над кодом. :( - person Achrome; 05.02.2013
comment
Это похоже на хорошую скрипку, поэтому решите эту конкретную проблему, хотя обычно шифрование и дешифрование не будут использовать один и тот же экземпляр. Вам нужно каким-то образом передать IV. Обратите внимание, что Stackoverflow любит иметь встроенный код - не просто указывайте на внешнюю скрипку, особенно если она размером с укус. - person Maarten Bodewes; 05.02.2013
comment
Лично я бы использовал одноэлементный подход для IV, чтобы он оставался одинаковым по всем направлениям. Я могу опубликовать код в ответе, но я также хотел дать работающую среду, чтобы увидеть, как она работает. Поскольку вы дали ответ первым, вы можете взять эту скрипку, и я удалю свой ответ. :) - person Achrome; 05.02.2013
comment
Вся идея IV состоит в том, что он меняется для каждого шифрования одним и тем же ключом. Поэтому использование синглтона не является хорошей идеей. Генерация нового IV — это то, что Даниэль действительно сделал правильно. Но обычно IV следует хранить вместе с зашифрованным текстом, поскольку он напрямую связан с ним. Держать его в памяти обычно особого смысла нет. - person Maarten Bodewes; 06.02.2013
comment
Я понимаю. Это имеет большой смысл. Спасибо за разъяснения. - person Achrome; 06.02.2013
comment
Рад, что смог объяснить и это, оставьте свой ответ, я проголосую за ваши усилия :) - person Maarten Bodewes; 06.02.2013
comment
Спасибо. Я все еще изучаю веревки на StackOverflow, поэтому иногда могу немного запутаться. - person Achrome; 06.02.2013
comment
Я все еще получаю �j�);���淐�G����8Y:Mz�m��` за шифрование. Есть ли способ расшифровать эти символы? - person Daniel Harris; 06.02.2013
comment
Вы по-прежнему можете использовать base64, как и раньше. Я лишь упростил сценарий для собственного тестирования. - person Achrome; 06.02.2013

Хорошо, я получил шифрование, работающее с этим кодом:

$size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_CBC);
$iv = mcrypt_create_iv($size, MCRYPT_DEV_RANDOM);   

function encrypt($data)
{
    $key = 'test';
    $encrypted_data = mcrypt_cbc(MCRYPT_RIJNDAEL_256, $key, $data, MCRYPT_ENCRYPT, $iv);
    return base64_encode($encrypted_data);
}

function decrypt($encryptedData)
{       
    $key = 'test';
    $encryptedData = base64_decode($encryptedData);
    $decrypt = mcrypt_cbc(MCRYPT_RIJNDAEL_256, $key, $encryptedData, MCRYPT_DECRYPT, $iv);
    return trim($decrypt);
}
person Daniel Harris    schedule 05.02.2013