Java RSA加密中的BadPaddingException
我的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
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年的研究和实践。你能进行堆栈后跟踪吗?哪种方法会给您异常?您可以进行堆栈后跟踪吗?哪种方法会给您带来异常?