2017-01-18 12 views
0

AES-256で暗号化されたBase64でエンコードされたdataを復号しようとしています。上位バイトは、この補正後19の代わりに144に設定されているためCryptoJSでAES CFBを解読するときに有効なバイト数が正しくありません

var data = "Ic9OcXxn2MnpgFwH4SHkxSY3laYB+kkevevwOPeQjLEeUsAVcHzLdBJZ1liWK5d94I/uNwyzbk+/l6QH/WsU0mzxuXcqBYl4iRIA7UIfchYJTsoaWAnSIjsioFUBAfc8YCODID0HW4AY7nK6Bb0mTP55HxlWstE92w1uJVMmBmJRscrAxySNlAFzVVGxuiiCc3sJimfbMNajXOUeFgvSzw=="; 
 

 
var base64data = CryptoJS.enc.Base64.parse(data); 
 

 
var encrypted = new CryptoJS.lib.WordArray.init(base64data.words.slice(4)); 
 
var iv = new CryptoJS.lib.WordArray.init(base64data.words.slice(0, 4)); 
 
var key = CryptoJS.enc.Utf8.parse("secure%password!secure%password!"); 
 

 
var cipher = CryptoJS.lib.CipherParams.create({ 
 
    ciphertext: encrypted 
 
}); 
 

 
var decrypted = CryptoJS.AES.decrypt(cipher, key, { 
 
    iv: iv, 
 
    mode: CryptoJS.mode.CFB 
 
}); 
 

 
var result = decrypted.toString(CryptoJS.enc.Utf8); 
 
console.log(decrypted.toString(CryptoJS.enc.Utf8)); 
 
// Wrong Output: {"first_name": "Han 
 

 
console.log(decrypted.sigBytes); 
 

 
decrypted.sigBytes = 144 
 

 
console.log(decrypted.toString(CryptoJS.enc.Utf8)); // Correct 
 
// Correct Output: {"first_name": "Hans-J\u00fcrgen", "last_name": "M\u00fcller", "city": "Hamburg", "number": "20a", "zip": "20456", "street": "Ladenstra\u00dfe"}
<script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.2/rollups/aes.js"></script> 
 
<script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.2/components/mode-cfb.js"></script>

復号化されたデータの一部のみでWordBuffer結果の最初の出力、:私のJSコードのこの部分、出力が間違っています。

なぜsigBytesマニュアルを修正する必要がありますか?何か案は?ありがとうございました!

答えて

0

私は自分自身で答えを見つけました。問題は実際にはjavascriptコードではありません。それはデータを暗号化したPythonコード内にありました。

AES CFBを使用してpycrpytoでセグメントサイズを128に設定する場合は、日付を埋め込んで16バイトの倍数にする必要があります。

ここでは、dataがいくつかのバイト文字列を参照し、key 32バイトの長い暗号化キーを示す私の完全なpython暗号化コードです。

length = 16 - (len(data) % 16) 
data += bytes([length]) * length 

iv = Random.new().read(AES.block_size) 
key = options.encrypt_key.encode() 
cipher = AES.new(key, AES.MODE_CFB, iv, segment_size=128) 

crypted = cipher.encrypt(data) 
entry = iv + crypted 
entry = base64.b64encode(entry) 

エントリdata再度Pythonコードとkeyから暗号化されたデータをbase64エンコードが同じ32バイト長の鍵である、次のコードで再びデータを復号化クライアントに送信され:

var base64data = CryptoJS.enc.Base64.parse(data); 

var encrypted = new CryptoJS.lib.WordArray.init(base64data.words.slice(4)); 
var iv = new CryptoJS.lib.WordArray.init(base64data.words.slice(0, 4)); 

var cipher = CryptoJS.lib.CipherParams.create({ ciphertext: encrypted }); 

var decrypted = CryptoJS.AES.decrypt(cipher, key, {iv: iv, mode: CryptoJS.mode.CFB}); 

これはすべての場合に有効です。

関連する問題