我有以下用于创建AES-128密码的Java代码,其中密钥和iv都基于相同的密码。
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 :(得分: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!!
您正在从随机盐生成密钥(请参阅第一行),并使用与初始化向量相同的密钥...但是您希望得到一个恒定的结果? (正如预期的那样,每次调用时结果都会发生变化)。
修复它以使用key
和iv
使用的完全相同的字节来自java代码中的SecretKeySpec
和IvParameterSpec
(您可以使用它们{{ 1}}方法)。我不知道AES SecretKeySpec是否使用PBKDF2或其他密钥派生函数 - 但它应该很容易测试。找到匹配并坚持下去的那个。
还要注意CryptoJS中的默认填充是PKCS7(关于“块模式和填充”,请参阅the docs);这可能与您在第一行Java代码中指定的PKCS5有很大不同。