RSA 加解密java实现

本文介绍了一种非对称加密的实现方式,使用RSA算法生成公钥和私钥,并通过公钥加密私钥解密、私钥加密公钥解密的过程进行数据加密解密测试。

非对称加密

 非对称加密有一对密钥,公钥和私钥。可以用公钥加密,也可以用私钥加密。不过,公钥加密必须用私钥解密,私钥加密必须用公钥解密。如果不对应,则会报这样的异常

javax.crypto.BadPaddingException: Data must start with zero

 

代码如下

  1. import java.security.KeyPair;  
  2. import java.security.KeyPairGenerator;  
  3. import javax.crypto.Cipher;  
  4.   
  5. public class RSA {  
  6.   
  7.     //公钥加密  
  8.     public byte[] PublicEncrypt(KeyPair key,String str)throws Exception {  
  9.         Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");  
  10.         cipher.init(Cipher.ENCRYPT_MODE, key.getPublic());  
  11.         return cipher.doFinal(str.getBytes("UTF8"));  
  12.     }  
  13.       
  14.     //公钥解密  
  15.     public byte[] PublicDECRYPT (KeyPair key,byte[]  data)throws Exception {  
  16.         Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");  
  17.         cipher.init(Cipher.DECRYPT_MODE, key.getPublic());  
  18.         return cipher.doFinal(data);  
  19.     }  
  20.       
  21.     //私钥加密  
  22.     public byte[] PrivateEncrypt (KeyPair key,String str)throws Exception {  
  23.         Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");  
  24.         cipher.init(Cipher.ENCRYPT_MODE, key.getPrivate());  
  25.         return cipher.doFinal(str.getBytes("UTF8"));  
  26.     }  
  27.       
  28.     //私钥解密  
  29.     public byte[] PrivateDECRYPT(KeyPair key,byte[]  data)throws Exception  {  
  30.         Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");  
  31.         cipher.init(Cipher.DECRYPT_MODE, key.getPrivate());  
  32.         return cipher.doFinal(data);  
  33.     }  
  34.   
  35.       
  36.     public static void main(String args[]) throws Exception {  
  37.         String str = "Hello World!";  
  38.         KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA");  
  39.         keyGen.initialize(1024);  
  40.         KeyPair key = keyGen.generateKeyPair();  
  41.         test1 t = new test1();  
  42.         System.out.println("加密前原文:"+str);  
  43.         byte[] data = t.PublicEncrypt(key,str);   
  44.         System.out.println("私钥解密后:"+new String(t.PrivateDECRYPT(key,data)));  
  45.         byte[] data1 = t.PrivateEncrypt(key,str);   
  46.         System.out.println("公钥解密后:"+new String(t.PublicDECRYPT(key,data1)));  
  47.     }  
  48. }  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值