JSEncrypt 加密但 java 无法解密-BadPaddingException

问题描述

我正在尝试使用 JSEncrypt (v 2.3.1) 加密数据,然后服务器解密数据 (Java)。 大多数情况下它可以工作,但有时后端会抛出 BadPaddingException。

我在堆栈上发现它可能与这个问题重复: JSEncrypt(js) encrypt,but python cannot decrypt 但似乎不是同样的例外。

我用谷歌搜索并发现了问题:JSEncrypt#encrypt creates sporadically invalid ciphertexts。但是当我尝试按照 github 链接重现问题时,后端代码仍然解密数据。 谁能给点建议?

JS代码

function encryptInput(input,key){
    var encrypt = new JSEncrypt();
    encrypt.setPublicKey(key);
    var encrypted = encrypt.encrypt(input);
    return encrypted;  
}

Java 代码

public String decryptWeb(String cipherText,String privateKey){
    try{
    // Remove the first and last lines
    privateKey = privateKey.replace("-----BEGIN PRIVATE KEY-----","");
    privateKey = privateKey.replace("-----END PRIVATE KEY-----","");

    // Base64 decode data
    byte[] encoded = Base64.decodeBase64(privateKey);

    KeyFactory kf = KeyFactory.getInstance("RSA");
    RSAPrivateKey privateKey = (RSAPrivateKey) kf.generatePrivate(new PKCS8EncodedKeySpec(encoded));

    Cipher cipher = Cipher.getInstance("RSA");
    cipher.init(Cipher.DECRYPT_MODE,privateKey);
    return new String(cipher.doFinal(Base64.decodeBase64(cipherText)),"UTF-8");    // exception throw here
    }catch(Exception ex){
        LOG.error("decrypt",ex);
        return "";
    }
}

异常:

decrypt - decrypt
javax.crypto.BadPaddingException: Decryption error
    at sun.security.rsa.RSAPadding.unpadV15(UnkNown Source)
    at sun.security.rsa.RSAPadding.unpad(UnkNown Source)
    at com.sun.crypto.provider.RSACipher.doFinal(RSACipher.java:363)
    at com.sun.crypto.provider.RSACipher.engineDoFinal(RSACipher.java:389)
    at javax.crypto.Cipher.doFinal(Cipher.java:2164)
    at com.util.Decryptor.decrypt(Decryptor.java:161)

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)