當柳上原的風吹向天際的時候...

          真正的快樂來源于創造

            BlogJava :: 首頁 :: 聯系 :: 聚合  :: 管理
            368 Posts :: 1 Stories :: 201 Comments :: 0 Trackbacks
          按:以下文字涉及RSA解密加密的基本操作,您如果已經知曉就不用浪費時間了。

          在加密解密過程中,如果加密解密雙方都使用同一密鑰,那么泄密的可能性還是存在的,無論你把這個密鑰放在代碼,文件或是數據庫中。最好是密鑰分成兩部分,公鑰提供出去給應答者,讓它給返回的結果加密,請求者得到返回結果后,用自己的私鑰將其解密,公鑰和私鑰都由程序生成。這樣,客戶端和服務器端程序的所有者和編寫者都難以知道每個客戶端的私鑰是什么,從而難以破解數據。RSA就是實現這一想法的途徑之一。

          舉例來說,現在有一客戶端視圖和WebService服務器端通信,假如服務器端的響應函數是 String getResponse(String params,byte[] publicKeyArray);兩邊程序都有下面的RSASecurityCoder類,客戶端在發送請求前,可以得到此類的一個實例,并得到其公鑰,然后調用服務器端的getResponse函數,公鑰就是這個函數的第二個參數;服務器端得到請求后,處理得到結果,然后用第二個參數--客戶端送來的公鑰進行加密,然后送回結果;客戶端得到結果后用自己的私鑰進行解密就可以了。這樣,信息在傳輸過程的安全性就有了充分的保證了。

          下面請看代碼:
          package com.heyang.util;

          import java.security.KeyFactory;
          import java.security.KeyPair;
          import java.security.KeyPairGenerator;
          import java.security.PrivateKey;
          import java.security.PublicKey;
          import java.security.interfaces.RSAPrivateKey;
          import java.security.interfaces.RSAPublicKey;
          import java.security.spec.PKCS8EncodedKeySpec;
          import java.security.spec.X509EncodedKeySpec;

          import javax.crypto.Cipher;

          /**
           * RSA加密解密類
           * 說明:
           * 作者:何楊(heyang78@gmail.com)
           * 創建時間:2010-12-1 下午06:14:38
           * 修改時間:2010-12-1 下午06:14:38
           
          */
          public class RSASecurityCoder{
              
          // 非對稱加密密鑰算法
              private static final String Algorithm="RSA";
              
              
          // 密鑰長度,用來初始化
              private static final int Key_Size=1024;
              
              
          // 公鑰
              private final byte[] publicKey;
              
              
          // 私鑰
              private final byte[] privateKey;
              
              
          /**
               * 構造函數,在其中生成公鑰和私鑰
               * 
          @throws Exception
               
          */
              
          public RSASecurityCoder() throws Exception{
                  
          // 得到密鑰對生成器
                  KeyPairGenerator kpg=KeyPairGenerator.getInstance(Algorithm);
                  kpg.initialize(Key_Size);
                  
                  
          // 得到密鑰對
                  KeyPair kp=kpg.generateKeyPair();
                  
                  
          // 得到公鑰
                  RSAPublicKey keyPublic=(RSAPublicKey)kp.getPublic();
                  publicKey
          =keyPublic.getEncoded();
                  
                  
          // 得到私鑰
                  RSAPrivateKey keyPrivate=(RSAPrivateKey)kp.getPrivate();
                  privateKey
          =keyPrivate.getEncoded();
              }
              
              
          /**
               * 用公鑰對字符串進行加密
               * 
               * 說明:
               * 
          @param originalString
               * 
          @param publicKeyArray
               * 
          @return
               * 
          @throws Exception
               * 創建時間:2010-12-1 下午06:29:51
               
          */
              
          public byte[] getEncryptArray(String originalString,byte[] publicKeyArray) throws Exception{
                  
          // 得到公鑰
                  X509EncodedKeySpec keySpec=new X509EncodedKeySpec(publicKeyArray);
                  KeyFactory kf
          =KeyFactory.getInstance(Algorithm);
                  PublicKey keyPublic
          =kf.generatePublic(keySpec);
                  
                  
          // 加密數據
                  Cipher cp=Cipher.getInstance(Algorithm);
                  cp.init(Cipher.ENCRYPT_MODE, keyPublic);
                  
          return cp.doFinal(originalString.getBytes());
              }
              
              
              
          /**
               * 使用私鑰進行解密
               * 
               * 說明:
               * 
          @param encryptedDataArray
               * 
          @return
               * 
          @throws Exception
               * 創建時間:2010-12-1 下午06:35:28
               
          */
              
          public String getDecryptString(byte[] encryptedDataArray) throws Exception{
                  
          // 得到私鑰
                  PKCS8EncodedKeySpec keySpec=new PKCS8EncodedKeySpec(privateKey);
                  KeyFactory kf
          =KeyFactory.getInstance(Algorithm);
                  PrivateKey keyPrivate
          =kf.generatePrivate(keySpec);
                  
                  
          // 解密數據
                  Cipher cp=Cipher.getInstance(Algorithm);
                  cp.init(Cipher.DECRYPT_MODE, keyPrivate);
                  
          byte[] arr=cp.doFinal(encryptedDataArray);
                  
                  
          // 得到解密后的字符串
                  return new String(arr);
              }

              
          public byte[] getPublicKey() {
                  
          return publicKey;
              }
              
              
          public static void main(String[] arr) throws Exception{
                  String str
          ="你好,世界! Hello,world!";
                  System.out.println(
          "準備用公鑰加密的字符串為:"+str);
                  
                  
          // 用公鑰加密
                  RSASecurityCoder rsaCoder=new RSASecurityCoder();
                  
          byte[] publicKey=rsaCoder.getPublicKey();        
                  
          byte[] encryptArray=rsaCoder.getEncryptArray(str, publicKey);
                  
                  System.out.print(
          "用公鑰加密后的結果為:");
                  
          for(byte b:encryptArray){
                      System.out.print(b);
                  }
                  System.out.println();
                  
                  
          // 用私鑰解密
                  String str1=rsaCoder.getDecryptString(encryptArray);
                  System.out.println(
          "用私鑰解密后的字符串為:"+str1);
              }
          }

          輸出:
          準備用公鑰加密的字符串為:你好,世界! Hello,world!
          用公鑰加密后的結果為:
          62-90-128-107-100-7070-11157-123-9160-6-116-68-1476-45-112-107-53-90107-84-670-9862-35-11116-83-10864312117-96-117-56995-2510321-89-89-828977-8810940100-91-76986562-222574-12815-120118-103-11-121-6030-6490-79-804911111-17-473984-7046-12294-8454-27108-26-11281-43833782-7926-612284-81781132357-3108-12673245-5111912-86-10041-799104-8146-5712374-55
          用私鑰解密后的字符串為:你好,世界! Hello,world
          !


          看到這里,如果有人說客戶端調用服務器端的getResponse函數時,第一個參數params不是還會暴露一部分信息嗎? 不要怕,我們可以讓服務器端再準備一個WebService函數 byte[] getServerPublicKey();客戶端可以調用這個函數以得到服務器端的公鑰,然后把params用這個公鑰加密,然后再調用getResponse(String params,byte[] publicKeyArray)函數,服務器端接到請求后,用自己的私鑰對第一個參數進行解密就可以了。這樣,所有信息都得到了保護。

          如果String的表現力不夠怎么辦,有了XML的幫助,這從來不是問題,您說呢?

          好了,感謝您看到這里,希望上面的文字能對您有所幫助;如果您要使用的話,上面的代碼需要改寫一下,相信您知道該怎么辦。

          posted on 2010-12-01 19:19 何楊 閱讀(500) 評論(0)  編輯  收藏

          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 抚顺市| 桦川县| 曲靖市| 铜陵市| 吉木萨尔县| 武定县| 卓资县| 绍兴市| 黎川县| 南阳市| 蓬莱市| 青川县| 建瓯市| 全南县| 康保县| 北川| 乐都县| 肇庆市| 秦皇岛市| 吉林省| 江油市| 怀化市| 洪洞县| 荔浦县| 河曲县| 盐亭县| 东光县| 贵溪市| 改则县| 乌鲁木齐县| 天水市| 如东县| 蒙山县| 彭山县| 米脂县| 荔浦县| 莲花县| 广德县| 蛟河市| 新竹市| 凭祥市|