0

我有以下用于解密的 NodeJS 代码,它工作得非常好,但是当我当时尝试在 Java 中转换相同的代码时,我遇到了错误。

给定最终块未正确填充。如果在解密期间使用了错误的密钥,则可能会出现此类问题

节点 JS 代码片段:

  let textParts = text.split(':');
  let iv = Buffer.from(textParts.shift(), 'hex');
  let encryptedText = Buffer.from(textParts.join(':'), 'hex');
  let decrypted = decipher.update(encryptedText);
  let decipher = crypto.createDecipheriv(
    'aes-256-cbc',
    Buffer.from(ENCRYPTION_KEY),
    iv,
  );
  decrypted = Buffer.concat([decrypted, decipher.final()]);
  return decrypted.toString();

Java代码片段:

try {
    IvParameterSpec iv = new IvParameterSpec(initVector.getBytes(StandardCharsets.UTF_8));
    SecretKeySpec skeySpec = new SecretKeySpec(key.getBytes(StandardCharsets.UTF_8), "AES");
    Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5PADDING");
    cipher.init(Cipher.DECRYPT_MODE, skeySpec, iv);
    byte[] original = cipher.doFinal(Base64.decodeBase64(encyptedData));
    return new String(original);
} catch (Exception ex) {
    ex.printStackTrace();
}

Node JS 和 Java 代码的加密密钥相同。提前致谢。

4

2 回答 2

1

如果您的初始向量是 32 字节,那么您需要如下解密。

public String decrypt(String encryptedData) {
    try {
        String data[] = encryptedData.split(":");
        IvParameterSpec iv = new IvParameterSpec(getBytes(data[0]));
        Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding");
        SecretKeySpec skeySpec = new SecretKeySpec(YOUR_KEY.getBytes(), "AES");
        cipher.init(Cipher.DECRYPT_MODE, skeySpec, iv);
        byte[] decryptedData = cipher.doFinal(getBytes(data[1]));
        return new String(decryptedData);
    } catch (Exception e) {
        throw new RuntimeException("Error occured while decrypting data", e);
    }
}

public byte[] getBytes(String s) {                   
    String tmp;
    byte[] b = new byte[s.length() / 2];
    int i;
    for (i = 0; i < s.length() / 2; i++) {
        tmp = s.substring(i * 2, i * 2 + 2);
        b[i] = (byte)(Integer.parseInt(tmp, 16) & 0xff);
    }
    return b;
}
于 2021-12-17T12:47:32.123 回答
-2

似乎问题在于解码时java中变量的大小。检查此链接可能会给您一些提示:

1- ejava-base64-encode-and-decode

2-给定的最终块未正确填充

于 2021-12-16T07:39:25.880 回答