Java RSA加密中的BadPaddingException

Java RSA加密中的BadPaddingException,java,encryption,rsa,badpaddingexception,Java,Encryption,Rsa,Badpaddingexception,我的RSA加密程序中出现了一个BadPaddingException。 但我不知道为什么会这样 import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.security.InvalidKe

我的RSA加密程序中出现了一个BadPaddingException。 但我不知道为什么会这样

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.security.InvalidKeyException;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.NoSuchAlgorithmException;
import java.security.PrivateKey;
import java.security.PublicKey;

import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.CipherInputStream;
import javax.crypto.CipherOutputStream;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.SecretKey;


public class Crypter
{


    private static final String text="Hallo";


    public static byte[] encryptObject(Nachricht msg,PublicKey pubkey) //verschlüsselt das Objekt im CipherStream
    {
        Cipher cipher;
        try
        {
            cipher = Cipher.getInstance("RSA");
            cipher.init(Cipher.ENCRYPT_MODE, pubkey);

            ByteArrayOutputStream bos = new ByteArrayOutputStream();
            CipherOutputStream cos = new CipherOutputStream(bos, cipher); 
            ObjectOutputStream oos = new ObjectOutputStream(cos); 
            oos.writeObject(msg); 
            oos.flush();

            byte[] encryptedBytes = bos.toByteArray();  
            return encryptedBytes;

            //weiss nicht was ich zurückgeben soll 
            //den ObjectOutputStream
            //oder die verschlüsselten Bytes


            //byte[] encryptedBytes = bos.toByteArray();  

        } catch (NoSuchAlgorithmException e)
        {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (NoSuchPaddingException e)
        {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (InvalidKeyException e)
        {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e)
        {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        return null;

    }

    public static Nachricht decryptObject(PrivateKey privKey,byte[] encryptedBytes) //entschlüsselt das Object
    {
        Nachricht  msg=null;
        try
        {
            Cipher cipher = Cipher.getInstance("RSA");

            cipher.init(Cipher.DECRYPT_MODE, privKey);
            ByteArrayInputStream bin = new ByteArrayInputStream(encryptedBytes);
            CipherInputStream cin = new CipherInputStream(bin, cipher);
            ObjectInputStream in = new ObjectInputStream(cin);
            return (Nachricht) in.readObject();


        } catch (InvalidKeyException e)
        {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (NoSuchAlgorithmException e)
        {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (NoSuchPaddingException e)
        {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e)
        {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (ClassNotFoundException e)
        {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }



        return null;
    }




    //verschlüsselt Text
    public static byte[] encryptBytes(PublicKey key, byte[] plain)
    {
        byte[] chiffre=null;

        try
        {
            Cipher cipher=Cipher.getInstance("RSA");
            cipher.init(Cipher.ENCRYPT_MODE, key);

            chiffre= cipher.doFinal(plain);

            return chiffre; //verschlüsseltes byte[]

        } catch (NoSuchAlgorithmException e)
        {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (NoSuchPaddingException e)
        {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (InvalidKeyException e)
        {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IllegalBlockSizeException e)
        {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (BadPaddingException e)
        {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        return null; 

    }
    //entschlüsselt Text
    public static byte[] decryptBytes(PrivateKey key, byte[] chiffre)
    {

        try
        {
            Cipher cipher=Cipher.getInstance("RSA");
            cipher.init(cipher.DECRYPT_MODE,key);

            byte[] btext= cipher.doFinal(chiffre);
            return btext;


        } catch (NoSuchAlgorithmException e)
        {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (NoSuchPaddingException e)
        {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (InvalidKeyException e)
        {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IllegalBlockSizeException e)
        {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (BadPaddingException e)
        {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        return null; //er meckert sonst....
    }



    public static void main(String [] args)
    {


        try
        {


            //KeyPair und Keys managen
            KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("RSA");
            keyPairGen.initialize(1024);
            KeyPair keypair=keyPairGen.generateKeyPair();
            PrivateKey privKey=keypair.getPrivate();
            PublicKey pubKey=keypair.getPublic();

            //Text->Byte
            //Byte->Text
            System.out.println("\n\nTest");
            String testtext= "h";
            byte[] testbyte=testtext.getBytes();
            System.out.println(testbyte);
            testtext=new String(testbyte);
            System.out.println(testtext);
            System.out.println("\n\n");

            //Text->Byte[] text
            //byte[] text->encrypt
            //byte[]encrypt-> decrypt
            //byte[] decrypt->String
            System.out.println("Ausgangstext:");
            System.out.println(text);
            System.out.println("1)Text als byte[] unverschlüsselt");
            byte[] bytetext=text.getBytes(); //in byte[] umgewandelt
            System.out.println( bytetext); //bytetext anzeigen lassen
            System.out.println("2) byte[] verschlüsselt");
            byte[] encrypt=encryptBytes(pubKey,bytetext); //verschlüsseln des byte[]
            System.out.println( encrypt); //ausgeben lassen
            System.out.println("3) byte[] entschlüsselt");
            byte[]decrypt=decryptBytes(privKey,encrypt); //entschlüsseln lassen
            String text=new String(decrypt);
            System.out.println(text);
            //String s = new String(bytes);

            //Object->byte[]
            //byte[] object-> byte[] encrypt
            //byte[] encrypt -> byte[]decrypt
            //byte[] decrypt -> object
            System.out.println("Ausgangsobjekt:");
            Nachricht  msg=new Nachricht();
            msg.setNachricht("Hallo");
            //verschlüsseln des Objekts
            byte[] vObject=encryptObject(msg,pubKey);
            System.out.println("Test ");
            Nachricht neuemsg=decryptObject(privKey,vObject);
            System.out.println("Test2");
            String nachricht=neuemsg.getNachricht();
            System.out.println(nachricht);










        } catch (NoSuchAlgorithmException e)
        {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }






    }

}




我很感激任何帮助或提示! 我编写的处理字符串加密的函数如main函数所示正常工作。 我不知道该补充什么。 代码通过了“测试”系统输出,但也抛出了一些异常。
我希望您知道缺少了什么,或者我必须添加什么才能使其正常工作。

好吧,问题的直接原因是您忘记在ObjectOutputStream上调用此方法(它关闭所有其他流,包括CipherOutputStream),方法是:

oos.close()

从JavaDocs获取:

此方法调用封装密码对象的doFinal方法,该方法将处理封装密码缓冲的所有字节

因此,对于某些密码,flush可能会导致某些字节加密,但不会在末尾添加填充

但是还有很多其他的事情也会引起悲伤:

  • 您没有指定应该使用哪种填充,因此在其他Java安装上可能会有所不同,请参阅以获取一些建议:或例如
  • 如果对象变大一点(或者使用占用更多空间的不同填充),加密的结果是一个0字节的数组,不会引发任何异常。另请参阅:这建议使用对称密码(如AES)进行加密,并且仅使用RSA加密AES密钥。(或将密钥大小加倍,并准备在每次密钥大小加倍时增加7倍或8倍的CPU时间,请参阅:)
  • 您应该知道String.toBytes()和String(byte[])都使用默认编码,这在其他计算机上可能不同,请确保指定例如

  • 免费建议:如果你想将你的“Nachricht”(信息)交换到另一台计算机上,并且想要真正安全、快速、简单(在一定程度上)和防愚的东西,我建议你使用TLS(或DTLS),这是基于25年的研究和实践。

    嗯,问题的直接原因是您忘记在ObjectOutputStream(关闭包括CipherOutputStream在内的所有其他流)上调用此方法,方法如下:

    oos.close()

    从JavaDocs获取:

    此方法调用封装密码对象的doFinal方法,该方法将处理封装密码缓冲的所有字节

    因此,对于某些密码,flush可能会导致某些字节加密,但不会在末尾添加填充

    但是还有很多其他的事情也会引起悲伤:

  • 您没有指定应该使用哪种填充,因此在其他Java安装上可能会有所不同,请参阅以获取一些建议:或例如
  • 如果对象变大一点(或者使用占用更多空间的不同填充),加密的结果是一个0字节的数组,不会引发任何异常。另请参阅:这建议使用对称密码(如AES)进行加密,并且仅使用RSA加密AES密钥。(或将密钥大小加倍,并准备在每次密钥大小加倍时增加7倍或8倍的CPU时间,请参阅:)
  • 您应该知道String.toBytes()和String(byte[])都使用默认编码,这在其他计算机上可能不同,请确保指定例如

  • 免费建议:如果你想将你的“Nachricht”(信息)交换到另一台计算机上,并且想要真正安全、快速、简单(在一定程度上)和防愚的东西,我建议你使用TLS(或DTLS),这是基于25年的研究和实践。

    你能进行堆栈后跟踪吗?哪种方法会给您异常?您可以进行堆栈后跟踪吗?哪种方法会给您带来异常?