paulwong

          Java生成RSA非對稱型加密的公鑰和私鑰(利用java API)

          非對稱型加密非常適合多個客戶端和服務(wù)器之間的秘密通訊,客戶端使用同一個公鑰將明文加密,而這個公鑰不能逆向的解密,密文發(fā)送到服務(wù)器后有服務(wù)器端用私鑰解密,這樣就做到了明文的加密傳送。

          非對稱型加密也有它先天的缺點,加密、解密速度慢制約了它的發(fā)揮,如果你有大量的文字需要加密傳送,建議你通過非對稱型加密來把對稱型‘密鑰’分發(fā)到客戶端,及時更新對稱型‘密鑰’。

          package com.paul.module.common.util;

          import sun.misc.BASE64Decoder;
          import sun.misc.BASE64Encoder;

          import java.io.FileInputStream;
          import java.io.FileOutputStream;
          import java.io.ObjectInputStream;
          import java.io.ObjectOutputStream;
          import java.security.Key;
          import java.security.KeyPair;
          import java.security.KeyPairGenerator;

          import javax.crypto.Cipher;

          public class RSASecurityUtil2 {
              
          /** 指定加密算法為RSA */
              
          private static final String ALGORITHM = "RSA";
              
          /** 密鑰長度,用來初始化 */
              
          private static final int KEYSIZE = 1024;
              
          /** 指定公鑰存放文件 */
              
          private static String PUBLIC_KEY_FILE = "PublicKey";
              
          /** 指定私鑰存放文件 */
              
          private static String PRIVATE_KEY_FILE = "PrivateKey";

              
          /**
               * 生成密鑰對
               * 
          @throws Exception
               
          */
              
          private static void generateKeyPair() throws Exception {
                  
          //        /** RSA算法要求有一個可信任的隨機數(shù)源 */
          //        SecureRandom secureRandom = new SecureRandom();
                  
                  
          /** 為RSA算法創(chuàng)建一個KeyPairGenerator對象 */
                  KeyPairGenerator keyPairGenerator 
          = KeyPairGenerator.getInstance(ALGORITHM);
                  
                  
          /** 利用上面的隨機數(shù)據(jù)源初始化這個KeyPairGenerator對象 */
          //        keyPairGenerator.initialize(KEYSIZE, secureRandom);
                  keyPairGenerator.initialize(KEYSIZE);
                  
                  
          /** 生成密匙對 */
                  KeyPair keyPair 
          = keyPairGenerator.generateKeyPair();
                  
                  
          /** 得到公鑰 */
                  Key publicKey 
          = keyPair.getPublic();
                  
                  
          /** 得到私鑰 */
                  Key privateKey 
          = keyPair.getPrivate();
                  
                  ObjectOutputStream oos1 
          = null;
                  ObjectOutputStream oos2 
          = null;
                  
          try {
                      
          /** 用對象流將生成的密鑰寫入文件 */
                      oos1 
          = new ObjectOutputStream(new FileOutputStream(PUBLIC_KEY_FILE));
                      oos2 
          = new ObjectOutputStream(new FileOutputStream(PRIVATE_KEY_FILE));
                      oos1.writeObject(publicKey);
                      oos2.writeObject(privateKey);
                  } 
          catch (Exception e) {
                      
          throw e;
                  }
                  
          finally{
                      
          /** 清空緩存,關(guān)閉文件輸出流 */
                      oos1.close();
                      oos2.close();
                  }
              }

              
          /**
               * 加密方法
               * 
          @param source 源數(shù)據(jù)
               * 
          @return
               * 
          @throws Exception
               
          */
              
          public static String encrypt(String source) throws Exception {
                  generateKeyPair();
                  Key publicKey;
                  ObjectInputStream ois 
          = null;
                  
          try {
                      
          /** 將文件中的公鑰對象讀出 */
                      ois 
          = new ObjectInputStream(new FileInputStream(
                              PUBLIC_KEY_FILE));
                      publicKey 
          = (Key) ois.readObject();
                  } 
          catch (Exception e) {
                      
          throw e;
                  }
                  
          finally{
                      ois.close();
                  }
                  
                  
          /** 得到Cipher對象來實現(xiàn)對源數(shù)據(jù)的RSA加密 */
                  Cipher cipher 
          = Cipher.getInstance(ALGORITHM);
                  cipher.init(Cipher.ENCRYPT_MODE, publicKey);
                  
          byte[] b = source.getBytes();
                  
          /** 執(zhí)行加密操作 */
                  
          byte[] b1 = cipher.doFinal(b);
                  BASE64Encoder encoder 
          = new BASE64Encoder();
                  
          return encoder.encode(b1);
              }

              
          /**
               * 解密算法
               * 
          @param cryptograph    密文
               * 
          @return
               * 
          @throws Exception
               
          */
              
          public static String decrypt(String cryptograph) throws Exception {
                  Key privateKey;
                  ObjectInputStream ois 
          = null;
                  
          try {
                      
          /** 將文件中的私鑰對象讀出 */
                      ois 
          = new ObjectInputStream(new FileInputStream(
                              PRIVATE_KEY_FILE));
                      privateKey 
          = (Key) ois.readObject();
                  } 
          catch (Exception e) {
                      
          throw e;
                  }
                  
          finally{
                      ois.close();
                  }
                  
                  
          /** 得到Cipher對象對已用公鑰加密的數(shù)據(jù)進行RSA解密 */
                  Cipher cipher 
          = Cipher.getInstance(ALGORITHM);
                  cipher.init(Cipher.DECRYPT_MODE, privateKey);
                  BASE64Decoder decoder 
          = new BASE64Decoder();
                  
          byte[] b1 = decoder.decodeBuffer(cryptograph);
                  
                  
          /** 執(zhí)行解密操作 */
                  
          byte[] b = cipher.doFinal(b1);
                  
          return new String(b);
              }

              
          public static void main(String[] args) throws Exception {
                  String source 
          = "恭喜發(fā)財!";// 要加密的字符串
                  System.out.println("準備用公鑰加密的字符串為:" + source);
                  
                  String cryptograph 
          = encrypt(source);// 生成的密文
                  System.out.print("用公鑰加密后的結(jié)果為:" + cryptograph);
                  System.out.println();

                  String target 
          = decrypt(cryptograph);// 解密密文
                  System.out.println("用私鑰解密后的字符串為:" + target);
                  System.out.println();
              }
          }


          http://blog.sina.com.cn/s/blog_43b03c72010080t2.html
          http://topic.csdn.net/t/20040510/14/3049788.html
          http://yuanliyin.iteye.com/blog/853334

          posted on 2012-01-16 00:37 paulwong 閱讀(15007) 評論(1)  編輯  收藏 所屬分類: J2EE

          Feedback

          # re: Java生成RSA非對稱型加密的公鑰和私鑰(利用java API) 2013-07-22 16:15 發(fā)送到

          不錯  回復(fù)  更多評論   


          主站蜘蛛池模板: 鹤山市| 永仁县| 昆明市| 巴南区| 河西区| 海安县| 星子县| 古交市| 巴林左旗| 陆良县| 广饶县| 弋阳县| 卢龙县| 香格里拉县| 彝良县| 襄垣县| 浮山县| 布尔津县| 禹城市| 秀山| 花莲县| 长春市| 剑川县| 英超| 兴化市| 勃利县| 抚松县| 南开区| 随州市| 孟州市| 丰县| 酉阳| 岳阳市| 天祝| 肃宁县| 阜南县| 新兴县| 任丘市| 昆明市| 玛纳斯县| 海丰县|