javax.crypto.BadPaddingException: Decryption error when using Java RSA encryption

liaquore :

I'm trying to set up RSA encryption so I can make a simple library for myself to use in the future and I can't get this simple code to work. Here is the source code:

package rsa.testing;

import java.security.KeyPair;
import java.security.KeyPairGenerator;

import javax.crypto.Cipher;

public class AloneTest
{
    public static void doTest()
    {
        try
        {
            KeyPairGenerator gen = KeyPairGenerator.getInstance("RSA");
            gen.initialize(2048);
            KeyPair pair = gen.genKeyPair();
            System.out.println("Public key: " + byteArrayToString(pair.getPublic().getEncoded()));
            System.out.println("Private key: " + byteArrayToString(pair.getPrivate().getEncoded()));

            Cipher encryptPublic = Cipher.getInstance("RSA");
            encryptPublic.init(Cipher.ENCRYPT_MODE, pair.getPublic());

            Cipher decryptPublic = Cipher.getInstance("RSA");
            decryptPublic.init(Cipher.DECRYPT_MODE, pair.getPublic());

            Cipher encryptPrivate = Cipher.getInstance("RSA");
            encryptPrivate.init(Cipher.ENCRYPT_MODE, pair.getPrivate());

            Cipher decryptPrivate = Cipher.getInstance("RSA");
            decryptPrivate.init(Cipher.DECRYPT_MODE, pair.getPrivate());

            System.out.println("All ciphers created.");
            System.out.println();

            String plainText = "Hello World!";
            System.out.println("Plain text: " + plainText);
            String encrypted = new String(encryptPrivate.doFinal(plainText.getBytes()));
            System.out.println("Encrypted: " + encrypted);
            String decrypted = new String(decryptPublic.doFinal(encrypted.getBytes()));
            System.out.println("Decrypted: " + decrypted);
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
    }

    private static String byteArrayToString(byte[] bytes)
    {
        String str = "";

        for (byte b : bytes)
        {
            str += b + " ";
        }

        return str.trim();
    }
}

And this the output (image because it doesn't let me copy the encrypted text).

Any ideas?

EDIT: Changed the following:

String plainText = "Hello World!";
System.out.println("Plain text: " + plainText);
String encrypted = byteToBase64String(encryptPublic.doFinal(plainText.getBytes()));
System.out.println("Encrypted: " + encrypted);
String decrypted = byteToBase64String(decryptPublic.doFinal(encrypted.getBytes()));
System.out.println("Decrypted: " + decrypted);

Method used to convert bytes to Base64:

private static String byteToBase64String(byte[] bytes)
{
    return Base64.getEncoder().encodeToString(bytes);
}

But now I get this error:

Plain text: Hello World!
Encrypted: dCTsYrQTDfNkRr6+nupWW4ntsmD69wrWS1TDvS3Uk1B6lCKkycegAb7wJgnXNolZ58dRXgbzEyCkeM/IbH0ruIEMfuhS5vrggo1s9+6MQN2hW1I4iElJfAdGKYQ8H9pFhAws+VQGetjwvJwUI9iWIi15721vc508/ks7rn4oQOk=
javax.crypto.IllegalBlockSizeException: Data must not be longer than 128 bytes
    at com.sun.crypto.provider.RSACipher.doFinal(RSACipher.java:344)
    at com.sun.crypto.provider.RSACipher.engineDoFinal(RSACipher.java:389)
    at javax.crypto.Cipher.doFinal(Cipher.java:2164)
    at rsa.testing.AloneTest.doTest(AloneTest.java:40)
    at rsa.testing.Main.main(Main.java:21)

Do I have to do some sort of splitting? Or am I doing something else wrong?

adrhc :

You are missing this:

when encrypting with public key one should use private key to decrypt
and also
when encrypting with private key one should use public key to decrypt

UPDATE

When encrypting with e.g. private key then trying to decrypt with same private key you'll have that java.crypto.BadPaddingException

I can't share the code proving this but I tested using:

KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("RSA");
keyPairGen.initialize(2048);
keyPair = keyPairGen.generateKeyPair();

while for Cipher I used:

Cipher.getInstance("RSA/ECB/PKCS1Padding")

Guess you like

Origin http://43.154.161.224:23101/article/api/json?id=80830&siteId=1