1

我正在尝试集成一个 API,我必须在其中以 RSA 加密和 BASE64 编码形式发送数据。作为回应,我得到了一个 BASE64 字符串,它应该在我的最后被解码和解密。我能够以加密和编码的形式发送数据。此外,我收到了响应 BASE64 字符串,但我无法解密该字符串。在我的解密中,我收到以下错误:

Exception in thread "main" java.lang.RuntimeException: javax.crypto.BadPaddingException: Decryption error

我使用以下加密:

        String result=new Gson().toJson(parameters);
        byte[] cleartext = result.getBytes("UTF-8");
        PublicKey publicKey=readPublicKey(path);

        Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");   
        cipher.init(Cipher.ENCRYPT_MODE, publicKey);  
        byte[] ciphertext=cipher.doFinal(cleartext);

        String securePayload = Base64.getEncoder().encodeToString(ciphertext);

参数是一个 (String,String) 映射,我已将在 API 中发布所需的参数放入其中。加密后,我在 POST 请求中发送“securePayload”,作为响应,我得到了一个 BASE64 编码的字符串,我应该对其进行解码和解密。对于解密,我使用以下代码:

public static String getDecrypted(String data, PrivateKey key)  {
    Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");

    cipher.init(Cipher.DECRYPT_MODE, key);

    byte[] dataArray=Base64.getDecoder().decode(data);
    byte[] decryptedbytes = cipher.doFinal(dataArray);
    return new String(decryptedbytes);
}

我在以下代码中使用上述函数来解密我在 API 响应中得到的字符串“数据”:

    PrivateKey pvtKey= readFromPrivateKey("C:\\Users\\Administrator\\Desktop\\myPrivateKey.key");
    String result=getDecrypted(data, pvtKey);

要读取私钥,我使用了以下代码:

    public static PrivateKey  readFromPrivateKey(String path) {

    String privateKeyContent = new String(Files.readAllBytes(Paths.get(path)));

    privateKeyContent = privateKeyContent.replaceAll(System.lineSeparator(), "").replace("-----BEGIN PRIVATE KEY-----", "").replace("-----END PRIVATE KEY-----", "").replaceAll("\\s+", "");
    System.out.println(privateKeyContent);
    KeyFactory kf = KeyFactory.getInstance("RSA");

    PKCS8EncodedKeySpec keySpecPKCS8 = new PKCS8EncodedKeySpec(Base64.getDecoder().decode(privateKeyContent));
    PrivateKey privKey = kf.generatePrivate(keySpecPKCS8);
    return privKey;
}

请帮忙。我在做什么错?我检查了我最后使用的公钥和私钥对是否正确。

4

0 回答 0