从Java到node.js的AES加密

4

我有一个用Java编写的AES加密和解密算法,并且需要在JavaScript中实现解密。

 public static final String ENCRYPTION_ALGORITHM = "AES/CBC/PKCS5Padding";
 public static String wrap(String clearText, String key) {
    byte[] iv = getIv();

    byte[] cipherText = encrypt(clearText, key, iv);
    byte[] wrapped = new byte[iv.length + cipherText.length];
    System.arraycopy(iv, 0, wrapped, 0, iv.length);
    System.arraycopy(cipherText, 0, wrapped, 16, cipherText.length);

    return new String(Base64.encodeBase64(wrapped));
}

private static byte[] encrypt(String clearText, String key, byte[] iv) {
    try {
        Cipher cipher = Cipher.getInstance(ENCRYPTION_ALGORITHM);
        AlgorithmParameters params = AlgorithmParameters.getInstance("AES");
        params.init(new IvParameterSpec(iv));
        cipher.init(Cipher.ENCRYPT_MODE, getKey(key), params);
        return cipher.doFinal(clearText.getBytes());
    } catch (GeneralSecurityException e) {
        throw new RuntimeException("Failed to encrypt.", e);
    }
}

private static SecretKeySpec getKey(String key) {
    try {
        return new SecretKeySpec(Hex.decodeHex(key.toCharArray()), "AES");
    } catch (DecoderException e) {
        throw new RuntimeException("Failed to generate a secret key spec", e);
    }
}

private static byte[] getIv() {
    byte[] iv = new byte[16];
    new SecureRandom().nextBytes(iv);

    return iv;
}

我写了 JavaScript 代码但生成的结果是错误的:

var responseBody = JSON.stringify({"key":"215467ryhfdjeu8373t4"});
var initializationVector = crypto.randomBytes(16);
key = new Buffer(key.substring(0,32), 'hex');
var cipher = crypto.createCipheriv('aes-128-cbc', key, iv);
var encrypted = cipher.update(new Buffer(responseBody)) +     cipher.final('hex');
var encoded = new Buffer(initializationVector+encrypted, 'binary');
return encoded;

你能帮我将Java包装函数改写成JavaScript(NodeJS)吗?

1个回答

3

问题已解决。

问题出在缓冲区的连接上。运算符“+”不适用于此。需要使用默认方法。

Buffer.concat([initializationVector, encrypted])

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接