2017-10-18 66 views
0

爲什麼CryptoJS的輸出不同於PHP中的openssl_encrypt(如果我使用的是同一個鍵和ivector)?CryptoJS不正確的AES編碼

openssl_encrypt('test' , 'aes-256-cbc', '17cc0ffd728f34c171e06c47df4227a32ee6ef5d6c60398eeab30cf34306c644', 0 , base64_decode('aROnq5DocMLgrlpAF6yjgw==')); 

輸出:

oIcizpTDCTgtTGu3lO1cJg== 

每次相同的輸出。

CryptoJS:

var encrypted = CryptoJS.AES.encrypt("test", CryptoJS.enc.Hex.parse('UDOuDk5uxceoFWxtrabuEhamMC1T4Abr'), { 
iv: CryptoJS.enc.Hex.parse('HLcM0VZYfsgPo2ye')}).toString(); 

輸出:

VTJGc2RHVmtYMTlrVHh4N0F3V2VySWlFcjBGeWlRRkcyMmNabEtjWmpmYz0= 

爲什麼從CryptoJS輸出每次都不同?

編輯:

您的提示後:

var encrypted = CryptoJS.AES.encrypt("test", CryptoJS.enc.Hex.parse('UDOuDk5uxceoFWxtrabuEhamMC1T4Abr'), { 
iv: CryptoJS.enc.Hex.parse('HLcM0VZYfsgPo2ye')}).toString(); 

輸出:

CoFpbmd4YzOiVEFzVkeaDQ== 

現在每次都是相同的

但比PHP不同:

openssl_encrypt("test" , "aes-256-cbc", "UDOuDk5uxceoFWxtrabuEhamMC1T4Abr", 0 , "HLcM0VZYfsgPo2ye"); 

輸出:

oV9OZVYM80p8mlHH5wnzEg== 

回答

1

CryptoJS.AES.encrypt會嘗試自動使用AES-128,AES-192或AES-256取決於你傳遞的關鍵。在你的情況下,你傳遞一個祕密密碼('17cc0f ...')而不是一個會導致它產生自己的AES-256密鑰的密鑰。

The documentation states

CryptoJS支持AES-128,AES-192和AES-256。它會根據您傳入的密鑰的大小選擇 變體。如果您使用密碼短語 ,那麼它將生成一個256位密鑰。

爲了使用密鑰,您必須先解析一個十六進制密鑰並通過該密鑰。

var key = CryptoJS.enc.Hex.parse('000102030405060708090a0b0c0d0e0f'); 
var encrypted = CryptoJS.AES.encrypt("test", key, { iv: iv });