【发布时间】:2016-08-05 19:51:00
【问题描述】:
我正在尝试使用 Javascript 和 CryptoJS 复制 Java 应用程序中使用的加密。我不太确定我应该如何复制 SecretKeySpec,因为 CryptoJS 似乎需要一个字符串作为密钥。
这是我需要在 JS 中复制的 Java 加密代码:
public byte[] encrypt(byte[] origin)
{
String key = "testkey";
SecretKeySpec sks = new SecretKeySpec(convertAESKey(key), "AES");
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
byte[] iv = new byte[16];
cipher.init(Cipher.ENCRYPT_MODE, sks, new IvParameterSpec(iv));
return cipher.doFinal(origin);
}
private byte[] convertAESKey(String key)
{
byte[] keyBytes;
keyBytes = key.getBytes("UTF-8");
byte[] keyBytes16 = new byte[16];
System.arraycopy(keyBytes, 0, keyBytes16, 0,
Math.min(keyBytes.length, 16));
return keyBytes16;
}
}
到目前为止我的 JS 代码:
var iv = new Uint8Array(16);
var key = "testkey";
var encrypted = CryptoJS.AES.encrypt(
someByteArray,
key,
{
iv: iv,
mode: CryptoJS.mode.CBC
}
);
另外,cipher 的最终输出是一个加密的字节数组。 CryptoJS 的最终输出似乎是一个带有密文的对象。有没有办法将输出作为字节数组?
我现在唯一能想到的是将加密的响应转换为字符串,然后将其转换为字节数组,但这似乎与 Java 加密的输出不匹配。
【问题讨论】:
-
使用开箱即用的加密对我来说没问题。问题是复制 Java 加密,因为当前的实现是客户端(Java)到服务器(Java),我需要将它设置为客户端(Javascript)到服务器(Java)。服务器代码无法更改,因此能够准确匹配加密非常重要。
标签: javascript java encryption cryptography cryptojs