Crypto JS AES-128密码 - 相当于Javascript代码

时间:2014-01-20 17:57:22

标签: java javascript cryptojs

我有以下用于创建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生成相同的密码,但没有成功。你能帮我吗?

1 个答案:

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

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

修复它以使用keyiv使用的完全相同的字节来自java代码中的SecretKeySpecIvParameterSpec(您可以使用它们{{ 1}}方法)。我不知道AES SecretKeySpec是否使用PBKDF2或其他密钥派生函数 - 但它应该很容易测试。找到匹配并坚持下去的那个。

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