非对称加密
非对称加密有一对密钥,公钥和私钥。可以用公钥加密,也可以用私钥加密。不过,公钥加密必须用私钥解密,私钥加密必须用公钥解密。如果不对应,则会报这样的异常
javax.crypto.BadPaddingException: Data must start with zero
代码如下:
- import java.security.KeyPair;
- import java.security.KeyPairGenerator;
- import javax.crypto.Cipher;
- publicclass test1 {
- //公钥加密
- publicbyte[] PublicEncrypt(KeyPair key,String str)throws Exception {
- Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
- cipher.init(Cipher.ENCRYPT_MODE, key.getPublic());
- return cipher.doFinal(str.getBytes("UTF8"));
- }
- //公钥解密
- publicbyte[] PublicDECRYPT (KeyPair key,byte[] data)throws Exception {
- Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
- cipher.init(Cipher.DECRYPT_MODE, key.getPublic());
- return cipher.doFinal(data);
- }
- //私钥加密
- publicbyte[] PrivateEncrypt (KeyPair key,String str)throws Exception {
- Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
- cipher.init(Cipher.ENCRYPT_MODE, key.getPrivate());
- return cipher.doFinal(str.getBytes("UTF8"));
- }
- //私钥解密
- publicbyte[] PrivateDECRYPT(KeyPair key,byte[] data)throws Exception {
- Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
- cipher.init(Cipher.DECRYPT_MODE, key.getPrivate());
- return cipher.doFinal(data);
- }
- publicstaticvoid main(String args[]) throws Exception {
- String str = "Hello World!";
- KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA");
- keyGen.initialize(1024);
- KeyPair key = keyGen.generateKeyPair();
- test1 t = new test1();
- System.out.println("加密前原文:"+str);
- byte[] data = t.PublicEncrypt(key,str);
- System.out.println("私钥解密后:"+new String(t.PrivateDECRYPT(key,data)));
- byte[] data1 = t.PrivateEncrypt(key,str);
- System.out.println("公钥解密后:"+new String(t.PublicDECRYPT(key,data1)));
- }
- }