我正在尝试集成一个 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;
}
请帮忙。我在做什么错?我检查了我最后使用的公钥和私钥对是否正确。