Я пытаюсь интегрировать API, где мне нужно отправлять данные в зашифрованном виде RSA и в формате BASE64. В ответ я получаю строку BASE64, которая должна быть декодирована и расшифрована на моем конце. Я могу отправлять данные в зашифрованном и зашифрованном виде. Также я получаю ответ BASE64 String, но я не в состоянии расшифровать строку. В моем расшифровке я получаю следующую ошибку:
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) иЯ поместил в него параметры, необходимые для POST в API. После шифрования я отправляю «securePayload» в запросе POST и в ответ получаю строку в кодировке 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);
}
Выше функции, которую я использую в следующем коде для расшифровки «данных» String, которые я получаю в ответе API:
PrivateKey pvtKey= readFromPrivateKey("C:\\Users\\Administrator\\Desktop\\myPrivateKey.key");
String result=getDecrypted(data, pvtKey);
Toпрочитайте закрытый ключ Я использовал следующий код:
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;
}
Пожалуйста, помогите в том же. Что я не так делаю? Я проверил правильность пары открытых и закрытых ключей, используемой на моем конце.