RSA 加密后请求 JAVA



我必须与平台集成。该平台为我提供了一个公钥来加密数据以调用他们的API。发送请求时,我需要考虑以下几点:

  1. 该请求是 HTTPS/POST 请求。
  2. 请求必须类似于:
{ 
Base64Encode(
RSA_Encrypt( 
{ "a" : "111111", "b" : "12234", "c" : "2342342", "d" : "612413726581" }
)
)
}

我输入如下参数:

Map<String, String> parameters = new HashMap<String, String>();
parameters.put("a", "112227");
parameters.put("b", "5411");
parameters.put("c", "12345678");
parameters.put("d", "123456");

加密如下:

StringBuilder sb = new StringBuilder();
sb.append("{");
for (String parameterName : parameters.keySet()) { 
sb.append("""+parameterName+""").append(':').append("""+parameters.get(parameterName)+""").append(',');
}
String s=sb.toString();
s=s.replaceAll(",\Z", "");
s=s+"}";
byte[] cleartext = s.getBytes("UTF-8");
String path="Path to certificate file\rsa_apikey.cer";
FileInputStream fin = new FileInputStream(filename);
CertificateFactory f;
PublicKey pk;
try {
f = CertificateFactory.getInstance("X.509");
X509Certificate certificate = (X509Certificate)f.generateCertificate(fin);
pk = certificate.getPublicKey();
} catch (CertificateException e) {
e.printStackTrace();
}
Cipher cipher = Cipher.getInstance("RSA/ECB/OAEPWithSHA1AndMGF1Padding");   
cipher.init(Cipher.ENCRYPT_MODE, pk);  
byte[] ciphertext=cipher.doFinal(cleartext);
String securePayload = Base64.getEncoder().encodeToString(ciphertext);

之后,我将发送 POST 请求。请求仍显示 400 错误请求错误。我不知道我做得是否正确。

问题 1(请建议最好的方法是什么?

问题2(我每次都得到不同的 Base64 字符串"安全有效负载"。会是请求不好的原因吗?

我的填充错误,因此我得到了错误。我更新到 PKCS1,现在它工作正常。谢谢。

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

最新更新