我有一个第三方 API,我必须以加密形式以 JSON 格式发送数据。JSON 中的数据如下所示:
{
"encryptedKey": "rltP+oNBMx26wSpmvKZ91iL=",
"encryptedData": "u5o+ON08CNGLwvt8OUmHXFPAzfk3uPILANA="
}
注意: json 值中的数据被修剪以仅显示示例。
我正在使用 Java11HttpClient 将此请求发送到给定的端点。具有所有加密值的请求得到了很好的处理,我得到了一个看起来与请求相同的期望结果(响应再次在键值配对 JSON 中并且值被加密)。
{
"encryptedKey": "rltP+oNmvKZ91iL=",
"encryptedData": "u5ot8OUmHXFPAzfk3uPILANA="
}
我必须再次解密这个 JSON“encryptedKey”才能获得实际内容。解密是使用“RSA/ECB/PKCS1Padding”完成的。因此,当我通过这个 encryptedKey 字符串来解密代码时,它给了我 BadPaddingException。
javax.crypto.BadPaddingException: Decryption error
at java.base/sun.security.rsa.RSAPadding.unpadV15(RSAPadding.java:378)
at java.base/sun.security.rsa.RSAPadding.unpad(RSAPadding.java:290)
at java.base/com.sun.crypto.provider.RSACipher.doFinal(RSACipher.java:366)
at java.base/com.sun.crypto.provider.RSACipher.engineDoFinal(RSACipher.java:392)
at java.base/javax.crypto.Cipher.doFinal(Cipher.java:2202)
我正在使用这段代码:
HttpRequest request = HttpRequest.newBuilder().POST(BodyPublishers.ofString(requestPayload))
.uri(URI.create(url))
.header("Content-Type", "application/json")
.header("Accept", "application/json")
.headers(buildHeaders(headers).toArray(String[]::new)).build();
HttpResponse 响应 = httpClient.send(request, HttpResponse.BodyHandlers.ofString(StandardCharsets.UTF_8));
上面的代码适用于请求,并以与预期相同的结构给我一个响应。但问题似乎在于String中响应的反序列化过程。
选项 2:当我选择从代码生成的加密请求时,如果在 Postman 中作为有效负载添加相同的请求,我会得到类似的响应。现在,如果我从 Postman 响应中解密该加密密钥,使用相同的代码库它会给我一个有效数据而没有填充异常。
需要有关发送此类请求的方法以及使用 Spring 或 Java11 等中的某些库处理响应数据的建议。
到目前为止,我已经尝试过 Unirest、Java11HttpClient 和 OkHttp,但结果相同。
提前致谢。