0

我有一个第三方 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,但结果相同。

提前致谢。

4

0 回答 0