2017-01-19 16 views
1

を働いていない私は、キーを使用して文字列を暗号化するために、JavaScriptで次のコードを持っている:は、PHP&JS mcryptの復号

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> 

それから私はそれをサーバ側に送信し、

$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に変換しようとしたが、それは常にnonreadableキャラとして時々、ちんぷんかんぷんを出てくる:このPHPコードを解読しようとすると他の回は読めるがナンセンスである。

+0

「mcrypt」は使用しないことをお勧めします。今のところ、ほぼ10年前から放棄されています。このため、PHP 7.2では非推奨となり、コアからPECLに削除されます。標準のPKCS#7(néePKCS#5)パディングはサポートされていません。バイナリデータでも使用できない非標準のヌルパディングのみがサポートされています。 'mcrypt'には、2003年にさかのぼる多くの傑出したバグ(https://sourceforge.net/p/mcrypt/bugs/)があります。代わりに、[defuse](https://github.com/defuse/php-encryption) )または[RNCryptor](https://github.com/RNCryptor)であり、完全な解決策を提供し、維持されており、正しいものです。 – zaph

+0

DESは使用しないでください。安全ではなく、AESで超過しています。 ECBモードを使用しないでください。安全ではありません。[ECBモード](https://en.wikipedia.org/wiki/Block_cipher_mode_of_operation#Electronic_Codebook_.28ECB.29)を参照して、ペンギンまでスクロールしてください。 乱数IVを使用してCBCモードを使用し、暗号化されたデータにIVを使用して復号化に使用するだけで、秘密にする必要はありません。 – zaph

+0

16進コード化された文字列から '0x'を削除する必要があります(実際は、16進数から16進数に切り替えようとしています)。 – LSerni

答えて

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); 

出力は次のようになります。のHello World

この方法で作業正しく、しかし、あなたは別の方法を探す必要がありますあなたのデータを暗号化するには、あなたのスクリプトでキー(12345678)とあなたの暗号化メソッドがすべての人に見えます。

+0

ありがとうございました。代わりに公開鍵/秘密鍵の暗号化を使用しました。私の計画は、PHPセッションで一時的なキーセットを使用し、毎時変更することでした。 – CarlosAllende

0

DESやAESなどのブロック暗号で暗号化されるデータは、ブロックサイズの正確な倍数でなければなりません。解決策は、暗号化するデータにパディングを追加することです。PKCS#5のパディングは、通常はDESのパディングであり、おそらくJavascriptのデフォルトです。残念ながら、mcryptはPKCS#5パディングをサポートしておらず、非標準のゼロパディングのみをサポートしています。

可能な解決策:

  1. mcryptのより優れた暗号化機能を使用して、質問にコメントを参照してください。
  2. Javascriptでパディングなしを指定し、手動でゼロパディングを追加します。
  3. mcryptでパディングなしを指定し、パディングを手動で削除します。

すべてのオプションを指定し、デフォルトに依存しないことをお勧めします。文字列を復号化する