加密 JS AES-128 密码 - 等效的 Javascript 代码



我有以下Java代码来创建AES-128密码,其中key和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使用相同的方法来生成相同的密码,但没有成功。你能帮帮我吗?

引用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!!

您正在从随机盐中生成一个密钥(请参阅第一行),并将该密钥用作初始化向量...然而,您期望一个恒定的结果?(正如预期的那样,每次调用的结果都会发生变化)。

修复它以使用完全相同的字节进行keyivSecretKeySpec和 Java 代码中的IvParameterSpec(您可以使用其getEncoded()方法进行查询)。我不知道AES SecretKeySpec是否使用PBKDF2或其他密钥派生函数 - 但它应该很容易测试。找到匹配的那个并坚持下去。

还要注意,CryptoJS中的默认填充是PKCS7(请参阅"块模式和填充"的文档);这可能与您在第一行Java代码中指定的PKCS5有很大不同。

最新更新