2016-11-13 6 views
2

私はCryptoJSを使用してWebサーバー(PHPとAES-128-ECBを使用)から暗号化を解読しましたが、正しいwordArrayを取得できません。長さが長すぎます。CryptoJS.AES.decrypt()の出力に0x8080808が埋め込まれたwordArray

var pwd = "abcdefghijklmnop"; 
var words = [0x86C5464, 0x7335231]; 
var plain_array= CryptoJS.lib.WordArray.create(words); 
var base64_pwd = CryptoJS.enc.Utf8.parse(pwd).toString(CryptoJS.enc.Base64); 
var pwd_key = CryptoJS.enc.Base64.parse(base64_pwd); 
var encryption = AES.encrypt(plain_array,pwd_key, {mode: CryptoJS.mode.ECB,padding: CryptoJS.pad.Pkcs7}).toString(); 
var decrypt = AES.decrypt(encryption,pwd_key, {mode: CryptoJS.mode.ECB,padding: CryptoJS.pad.Pkcs7}); 

そしてを復号化は、次のとおりです:ここに私のテストコードがある

decrypt == { 
    sigBytes : 8, 
    words : [0x86C5464, 0x7335231, 0x8080808, 0x8080808]  
} 

decrypt.words0x8080808で埋められたのはなぜ?正しい長さのwordArrayを取得するにはどうすればよいですか?

ありがとうございます。

答えて

0

AESはブロック暗号で、AESの場合はブロックサイズのチャンク(16バイト)で入力する必要があります。暗号化されるデータがブロックサイズの偶数倍でない場合、パディングバイトを追加する必要があります。 PKCS#7パディングは一般的なパディングモードです。ほとんどのAESライブラリは、PKCS#7のパディングモードをサポートしています。パディングモードでは、暗号化時にパディングが追加され、解読時にパディングが削除されます。

この場合、8バイトのpaddigが追加されました。これは0x08という値の8バイトです。

PKCS#7 paddingを参照してください。

注:ECBモードを使用しないでください。安全ではありません。ECB modeを参照して、ペンギンまでスクロールしてください。その代わりに、暗号化されたデータにIVを付加して復号化に使用するだけで、ランダムIVのCBCモードを使用します。

+0

ありがとうございます!私はもうECBを使用しません。 – Kinch

関連する問題