У меня есть следующий код в 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, изменив кодировку, изменив шестнадцатеричное декодирование и т. Д., Но это всегда звучит бессмысленно, иногда как нечитаемые символы, а иногда как читаемые, но бессмысленные.
Способ дешифрования строки не работает должным образом, попробуйте это:
$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) и ваш метод шифрования видны всем.
Данные, которые должны быть зашифрованы блочным шифром, таким как DES или AES, должны быть кратны длине блока. Решение состоит в том, чтобы добавить заполнение к данным, которые должны быть зашифрованы, заполнение PKCS # 5 является обычным заполнением для DES и, вероятно, по умолчанию для Javascript. К сожалению, mcrypt не поддерживает заполнение PKCS # 5, только нестандартное заполнение нулями.
Потенциальные решения:
Лучше указать все параметры и не полагаться на значения по умолчанию.