【问题标题】:AES Decryption not working using with crypto jsAES 解密不适用于加密 js
【发布时间】:2018-02-23 10:52:12
【问题描述】:

在我的代码中,我使用 crypto.js 使用 AES 加密来加密数据,并且我正在解密加密的文本 在java中。

如果我尝试在 javascript 或 java 中加密和解密,加密和解密工作正常。但如果我在 javascript 中加密 并尝试在 java 中解密我得到以下错误。

javax.crypto.BadPaddingException:给定的最终块不正确 填充在 com.sun.crypto.provider.CipherCore.doFinal(CipherCore.java:966)

下面是我的 JSCode:

var keyHex = CryptoJS.enc.Utf8.parse('584771624934175587013168');
var iv    = CryptoJS.enc.Hex.parse('000000000000000000000000');
var encrypted = CryptoJS.AES.encrypt('1111', keyHex, {
    iv:iv,
    mode: CryptoJS.mode.CBC,
    padding: CryptoJS.pad.Pkcs7
});
console.log('encryptByAES key: ',encrypted.toString());

下面是我的java代码。

String key = "584771624934175587013168";
String plainText = "1111";
public String encryptTextusingAES(String text, String kek) throws Exception {
    Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
    byte[] keyBytes= new byte[16];
    byte[] b= kek.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(Cipher.ENCRYPT_MODE,keySpec,ivSpec);
    byte[] results = cipher.doFinal(text.getBytes("UTF-8"));
    BASE64Encoder encoder = new BASE64Encoder();
    return encoder.encode(results);
}

public String decryptTextusingAES(String text, String kek) throws Exception{
    Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
    byte[] keyBytes= new byte[16];
    byte[] b= kek.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(Cipher.DECRYPT_MODE,keySpec,ivSpec);
    BASE64Decoder decoder = new BASE64Decoder();
    byte [] results = cipher.doFinal(decoder.decodeBuffer(text));
    return new String(results,"UTF-8");
}

How to decrypt correctly any help will be greatly appreciated!!!!

【问题讨论】:

    标签: javascript java cryptography aes


    【解决方案1】:

    当您使用 AES 等块加密时,您的输入需要在加密之前填充。有多种标准方法可以做到这一点。

    在您的 JS 代码中,您指定的是 PKCS-7:

        padding: CryptoJS.pad.Pkcs7
    

    但在您的 Java 代码中,您指定的是 PKCS-5:

        Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
    

    确保两边都使用相同的填充算法。

    【讨论】:

    • 谢谢,但 PKCS5 填充在 javascript 中不存在。
    • 欢迎为我的帖子投票here
    猜你喜欢
    • 2020-04-28
    • 1970-01-01
    • 2011-02-02
    • 2016-09-21
    • 1970-01-01
    • 2014-09-12
    • 1970-01-01
    • 1970-01-01
    • 2012-02-24
    相关资源
    最近更新 更多