2014-01-20 58 views
3

我有以下用於創建AES-128密碼的Java代碼,其中密鑰和iv都基於相同的密碼短語。Crypto JS AES-128密碼 - 等效的Javascript代碼

Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); 
byte[] keyBytes = new byte[16]; 
byte[] b = passphare.getBytes("UTF-8"); 
int len = b.length; 
if (len > keyBytes.length) { 
    len = keyBytes.length; 
} 

System.arraycopy(b, 0, keyBytes, 0, len); 
SecretKeySpec keySpec = new SecretKeySpec(keyBytes, "AES"); 
IvParameterSpec ivSpec = new IvParameterSpec(keyBytes); 
cipher.init(opmode, keySpec, ivSpec); 

cipher.doFinal(textToEncrypt.getBytes("UTF-8")); 

我試圖在JavaScript中使用相同的方法使用CryptoJS生成相同的密碼,但沒有成功。你能幫我麼?

+0

你能提供一個簡短的樣本輸入和輸出嗎?這將使編寫和測試等效的cryptojs版本變得更加容易。另外,你可以添加你目前盡力而爲的cryptojs嘗試嗎? – tucuxi

+0

是的,當然!這是我到目前爲止嘗試http://jsfiddle.net/jonaix/hgAZM/ –

+0

僅供參考,這是不安全的。您直接將密碼轉換爲字節並將其用作密鑰。您應該使用密碼來使用基於密碼的密鑰派生函數(如PBKDF或bcrypt或scrypt)來生成安全密鑰。你的IV也不是隨機的,這是不安全的。請參閱crypto.stackexchange.com。 – Chloe

回答

1

從OP的評論引述的jsfiddle:

var salt = CryptoJS.lib.WordArray.random(128/8); 
// Key and iv should be based on the same value. In this example "1111" 
var key = CryptoJS.PBKDF2("1111", salt, { keySize: 128/32 }); 
var iv = key; // Not sure what should be here!! 

您是從隨機鹽生成密鑰(見第一行),並使用相同的密鑰初始化向量...但你期待不變的結果? (如預期的那樣,結果在每個調用中改變)。

解決它使用完全相同的字節keyiv從Java代碼SecretKeySpecIvParameterSpec(你可以查詢使用其getEncoded()方法)使用。我不知道AES SecretKeySpec是否使用PBKDF2或其他密鑰派生函數 - 但它應該很容易測試。找到一個匹配並堅持下去的人。請注意CryptoJS中的默認填充是PKCS7(請參閱關於「塊模式和填充」的the docs);這可能與您在第一行Java代碼中指定的PKCS5有很大不同。