paulwong

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

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

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

          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算法要求有一個可信任的隨機數源 */
          //        SecureRandom secureRandom = new SecureRandom();
                  
                  
          /** 為RSA算法創建一個KeyPairGenerator對象 */
                  KeyPairGenerator keyPairGenerator 
          = KeyPairGenerator.getInstance(ALGORITHM);
                  
                  
          /** 利用上面的隨機數據源初始化這個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{
                      
          /** 清空緩存,關閉文件輸出流 */
                      oos1.close();
                      oos2.close();
                  }
              }

              
          /**
               * 加密方法
               * 
          @param source 源數據
               * 
          @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對象來實現對源數據的RSA加密 */
                  Cipher cipher 
          = Cipher.getInstance(ALGORITHM);
                  cipher.init(Cipher.ENCRYPT_MODE, publicKey);
                  
          byte[] b = source.getBytes();
                  
          /** 執行加密操作 */
                  
          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對象對已用公鑰加密的數據進行RSA解密 */
                  Cipher cipher 
          = Cipher.getInstance(ALGORITHM);
                  cipher.init(Cipher.DECRYPT_MODE, privateKey);
                  BASE64Decoder decoder 
          = new BASE64Decoder();
                  
          byte[] b1 = decoder.decodeBuffer(cryptograph);
                  
                  
          /** 執行解密操作 */
                  
          byte[] b = cipher.doFinal(b1);
                  
          return new String(b);
              }

              
          public static void main(String[] args) throws Exception {
                  String source 
          = "恭喜發財!";// 要加密的字符串
                  System.out.println("準備用公鑰加密的字符串為:" + source);
                  
                  String cryptograph 
          = encrypt(source);// 生成的密文
                  System.out.print("用公鑰加密后的結果為:" + 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 閱讀(15003) 評論(1)  編輯  收藏 所屬分類: J2EE

          Feedback

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

          不錯  回復  更多評論   


          主站蜘蛛池模板: 永年县| 枝江市| 长丰县| 巴林左旗| 郎溪县| 安溪县| 永仁县| 昭苏县| 岳西县| 来安县| 常宁市| 太白县| 武邑县| 轮台县| 霸州市| 洛浦县| 玉树县| 木兰县| 宝山区| 麦盖提县| 黎城县| 民丰县| 民权县| 读书| 名山县| 青冈县| 宾川县| 厦门市| 普兰县| 修水县| 纳雍县| 台中县| 东乡县| 罗甸县| 怀柔区| 绥滨县| 卫辉市| 浏阳市| 长寿区| 泸西县| 黄平县|