3

我有以下用于创建 AES-128 密码的 Java 代码,其中 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"));

我尝试使用 CryptoJS 在 Javascript 中使用相同的方法来生成相同的密码,但没有成功。你能帮我么?

4

1 回答 1

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

您正在从随机盐生成一个密钥(见第一行),并使用与初始化向量相同的密钥......但您期望得到一个恒定的结果?(正如预期的那样,每次调用的结果都会发生变化)。

修复它以使用与java 代码中的keyiv使用的完全相同的字节(您可以使用它们的方法查询)。我不知道 AES SecretKeySpec 是使用 PBKDF2 还是其他密钥派生函数——但它应该很容易测试。找到匹配的并坚持下去。SecretKeySpecIvParameterSpecgetEncoded()

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

于 2014-01-21T23:21:38.840 回答