RSA-шифрование после запроса JAVA - PullRequest
0 голосов
/ 03 октября 2019

Мне нужно сделать интеграцию с платформой. Платформа предоставила мне открытый ключ для шифрования данных для вызова их 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 неверных запросов. Я не знаю, правильно ли я это делаю.

Вопросg 1) Пожалуйста, предложите, каков наилучший способ сделать это?

Вопрос 2) Я каждый раз получаю строку base64 «securePayload» по-разному. Может ли это быть причиной плохого запроса?

1 Ответ

0 голосов
/ 03 октября 2019

Мое заполнение было неправильным, и из-за этого я получал ошибку. Я обновился до PKCS1, и теперь он работает нормально. Спасибо.

PublicKey publicKey=readPublicKey(path);

        Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");   
        cipher.init(Cipher.PUBLIC_KEY, publicKey);  
        byte[] ciphertext=cipher.doFinal(cleartext);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...