2014-01-10 3 views
0

Мне нужно зашифровать данные с помощью AES в JavaScript, а затем отправить их на наш сервер для расшифровки PHP. Да, я знаю, это небезопасно, и люди смогут его расшифровать - мы используем это как способ сделать людей труднее обращать вспять и деформировать наш код.js-mcrypt и php's mcrypt не выдает одинаковые значения

Я использую эту библиотеку:

https://github.com/Dexus/js-mcrypt/blob/master/mcrypt.js

Я использую Rijndael-128 и CBC для AES, с размером блока 16. Я подтвердил, что это значение является одинаковым для PHP & JS. Я могу зашифровать и расшифровать строку, используя тот же ключ, IV и rijndael-128/cbc в JS и PHP, но по какой-то причине PHP не может расшифровать вывод из JS. Может кто-то, пожалуйста, помогите мне и укажите, что я делаю неправильно?

Вот код:

<script type="text/javascript" src="Serpent.js"></script> 
<script type="text/javascript" src="rijndael.js"></script> 
<script type="text/javascript" src="mcrypt.js"></script> 

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

    echo mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC); 
    echo "->" . mcrypt_get_key_size('rijndael-128', 'cbc'); 

    $ciphertext_hex = "86B83EB77A6D40CACABAD79F0EA335E8454B1A9974B2D89D43B3EE0E25B649FB19EB88DF7A4490F9AB05F44701F081DD"; 
    $ciphertext = hex2bin($ciphertext_hex); 

    $key_hex = "31323334353637383930313233343536"; 
    $key = hex2bin($key_hex); 

    $iv = "123456789"; 
    $cipher = "rijndael-128"; 
    $mode = "cbc"; 

    $plaintext = mcrypt_decrypt($cipher, $key, $ciphertext, $mode, $iv); 

    echo "<h2>Enc in JS, Dec in PHP</h2>Encrypted: $ciphertext<br /><br />\n\nDecrypted: $plaintext"; 

    echo "<h2>Enc/Dec in PHP</h2>Encrypted: " . ($encd = mcrypt_encrypt($cipher, $key, "this is the message I want to encode", $mode, $iv)) . "<br><br>\n\n"; 
    echo "Decrypted: " . mcrypt_decrypt($cipher, $key, $encd, $mode, $iv); 
?> 

<div id='js_results'></div> 
<script> 
    var hexdigits='ABCDEF'; 
    var hexLookup=Array(256); 
    for(var i=0;i<256;i++) 
     hexLookup[i]=hexdigits.indexOf(String.fromCharCode(i)); 

    var bin2hex=function(str){ 
     var out=''; 
     for(var i=0;i<str.length;i++) 
      out+=hexdigits[str.charCodeAt(i)>>4]+hexdigits[str.charCodeAt(i)&15]; 
     return out; 
    } 

    var hex2bin=function(str){ 
     var out=''; 
     var part=-1; 
     for(var i=0;i<str.length;i++){ 
      var t=hexLookup[str.charCodeAt(i)] 
      if(t>-1){ 
       if(part>-1){ 
        out+=String.fromCharCode(part|t); 
        part=-1; 
       }else 
        part=t<<4; 
      } 
     } 
     return out; 
    } 

    var cipher = "<?php echo $cipher; ?>"; 
    var mode = "<?php echo $mode; ?>"; 
    var key = hex2bin("<?php echo $key_hex; ?>"); 
    var iv = "<?php echo $iv; ?>"; 
    var msg = "this is the message I want to encode"; 

    var enc = mcrypt.Encrypt(msg, iv, key, cipher, mode); 
    var enc_hex = bin2hex(enc); 

    var enc_hex_static = "<?php echo $ciphertext_hex; ?>"; 
    var enc_static = hex2bin(enc_hex_static); 
    var dec = mcrypt.Decrypt(enc_static, iv); 

    document.getElementById('js_results').innerHTML = "<h2>Enc in JS</h2>Encrypted: " + enc + "<br><br>\n\nEnc in Hex: " + enc_hex + "<br><br>\n\nDec: " + dec; 

</script> 

ответ

0

Преобразовать обе строки, чтобы использовать ту же кодировку, как utf8

+0

Вы имеете в виду зашифрованные строки? –

+0

Строки с обычным текстом –

+0

Преобразование строки javascript для кодирования в utf8 и декодированного вывода в PHP для utf8 не устраняет проблему, к сожалению –

0

Часть раствора исправить, почему довольно рано ваше кодирование идет не так. например: строка после hex2bin по зашифрованному тексту, сравниваемая с js/php. Я использовал различные функции для проверки вывода (различные реализации hex2bin), но я не могу точно определить ошибку в определенном месте, кроме вашего фактического зашифрованного текста, который отличается от js/php. Я пытаюсь найти время, чтобы выяснить, как это исправить.

Смежные вопросы