javax.crypto.BadPaddingException:復号化エラーのJava RSA暗号化を使用して

liaquore:

私は自分自身が将来的に使用するために、私はシンプルなライブラリを作ることができると私は仕事に、この単純なコードを取得することはできませんので、RSAの暗号化を設定しようとしています。ここではソースコードは次のとおりです。

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();
    }
}

そして、この出力(画像それは私が暗号化されたテキストをコピーすることはできませんので)。

何か案は?

EDIT:次のように変更:

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);

この方法は、Base64にバイトに変換するために使用しました:

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

しかし、今、私はこのエラーを取得します:

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)

私は分割のいくつかの並べ替えを行う必要がありますか?それとも私が何か他の間違っているのでしょうか?

adrhc:

あなたはこれを欠けています。

で暗号化するときに公開鍵を使用する必要があり1 の秘密鍵を復号化するために
もと
で暗号化する際に、秘密鍵のいずれかを使用する必要があり、公開鍵復号化するために

更新

例えばで暗号化する場合、秘密鍵は、その後に解読しようとしている同じ秘密鍵あなたはその必要がありますjava.crypto.BadPaddingExceptionを

私はこれを証明するコードを共有することはできませんが、私は使用してテストしました:

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

暗号私が使用のためにしばらく:

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

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=190577&siteId=1