JavaScript — PHP & amp; Расшифровка JS Mcrypt не работает

У меня есть следующий код в Javascript для шифрования строки с помощью ключа:

des.js это: http://www.tero.co.uk/des/code.php

<script src="/js/des.js"></script>
<script>
var key = '12345678';
var message = 'hello world';

var ciph = des(key, message, 1, 0);
ciph = stringToHex(ciph);
console.log("Encrypted Result: " + ciph);
</script>

Затем я отправляю его на сервер и пытаюсь расшифровать с помощью следующего кода PHP:

$key = '12345678';
$hexa = '0x28dba02eb5f6dd476042daebfa59687a'; /This is the output from Javascript
$string = '';
for ($i=0; $i < strlen($hexa)-1; $i+=2) {
$string .= chr(hexdec($hexa[$i].$hexa[$i+1])); }
echo mcrypt_decrypt(MCRYPT_DES, $key, $string, MCRYPT_MODE_ECB);

Я пытался преобразовать его в utf8, изменив кодировку, изменив шестнадцатеричное декодирование и т. Д., Но это всегда звучит бессмысленно, иногда как нечитаемые символы, а иногда как читаемые, но бессмысленные.

1

Решение

Способ дешифрования строки не работает должным образом, попробуйте это:

$key = '12345678';
$hexa = '0x28dba02eb5f6dd476042daebfa59687a';

function hexToString ($h) {
$r = "";
for ($i= (substr($h, 0, 2)=="0x")?2:0; $i<strlen($h); $i+=2) {$r .= chr (base_convert (substr ($h, $i, 2), 16, 10));}
return $r;
}

echo mcrypt_decrypt(MCRYPT_DES, $key,hexToString('0x28dba02eb5f6dd476042daebfa59687a'), MCRYPT_MODE_ECB);

Выход будет: Привет, мир

Этот способ работает должным образом, однако вы должны искать другой метод для шифрования ваших данных, в вашем скрипте ключ (12345678) и ваш метод шифрования видны всем.

1

Другие решения

Данные, которые должны быть зашифрованы блочным шифром, таким как DES или AES, должны быть кратны длине блока. Решение состоит в том, чтобы добавить заполнение к данным, которые должны быть зашифрованы, заполнение PKCS # 5 является обычным заполнением для DES и, вероятно, по умолчанию для Javascript. К сожалению, mcrypt не поддерживает заполнение PKCS # 5, только нестандартное заполнение нулями.

Потенциальные решения:

  1. Используйте лучшую функцию шифрования, чем mcrypt, см. Комментарий к вопросу.
  2. Укажите отсутствие заполнения в Javascript и добавьте ноль вручную.
  3. Укажите отсутствие заполнения в mcrypt и удалите заполнение вручную.

Лучше указать все параметры и не полагаться на значения по умолчанию.

0

По вопросам рекламы [email protected]