RSA расшифровка JAVA BadPadding - PullRequest
       56

RSA расшифровка JAVA BadPadding

1 голос
/ 04 октября 2019

Я пытаюсь интегрировать 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;
}

Пожалуйста, помогите в том же. Что я не так делаю? Я проверил правильность пары открытых и закрытых ключей, используемой на моем конце.

...