我有java代碼,它爲我產生aes加密代碼,現在我正嘗試在javascript上使用crypto-js,但兩種代碼都提供了不同的密鑰,我不知道爲什麼以及如何在這裏得到同樣關鍵的是我的代碼java加密aes值和javascript加密值不匹配
public static String encrypt(String text, byte[] iv, byte[] key)throws Exception{
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
SecretKeySpec keySpec = new SecretKeySpec(key, "AES");
System.out.println("KEY SPECCCC: "+keySpec);
IvParameterSpec ivSpec = new IvParameterSpec(iv);
cipher.init(Cipher.ENCRYPT_MODE,keySpec,ivSpec);
byte [] results = cipher.doFinal(text.getBytes("UTF-8"));
BASE64Encoder encoder = new BASE64Encoder();
return encoder.encode(results);
}
JavaScript代碼
require(["crypto-js/core", "crypto-js/aes"], function (CryptoJS, AES) {
ciphertext = CryptoJS.AES.encrypt(JSON.stringify(jsondata),
arr.toString(),arr.toString());
});
字符串爲UTF-8
var utf8 = unescape(encodeURIComponent(key));
var arr = [];
for (var i = 0; i < utf8.length; i++) {
arr.push(utf8.charCodeAt(i));
}
如果您只使用對稱加密,你需要在服務器和客戶端完全相同的關鍵。如果您將加密密鑰從服務器發送到客戶端或其他方式需要加密對稱加密密鑰。最簡單的方法是使用TLS。如果你使用TLS,那麼數據和密鑰都是加密的,所以你不需要自己加密。這不提供任何安全性,只是一點混淆。您應該閱讀:https://www.nccgroup.trust/us/about-us/newsroom-and-events/blog/2011/august/javascript-cryptography-considered-harmful/ –
您的代碼不完整。你能證明你如何解碼Java和JS中的密鑰和IV以及實際值? –
IV必須是不可預知的(閱讀:隨機)。不要使用靜態IV或與密鑰相同的值,因爲這會使密碼具有確定性,因此不會在語義上安全。觀察密文的攻擊者可以確定何時之前發送了相同的消息前綴。 IV不是祕密的,所以你可以把它和密文一起發送。通常,它只是在密文前面加上,然後在解密之前切掉。 –