當(dāng)柳上原的風(fēng)吹向天際的時候...

          真正的快樂來源于創(chuàng)造

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

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

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

          下面請看代碼:
          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)
           * 創(chuàng)建時間: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;
              
              
          /**
               * 構(gòu)造函數(shù),在其中生成公鑰和私鑰
               * 
          @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();
              }
              
              
          /**
               * 用公鑰對字符串進(jìn)行加密
               * 
               * 說明:
               * 
          @param originalString
               * 
          @param publicKeyArray
               * 
          @return
               * 
          @throws Exception
               * 創(chuàng)建時間: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);
                  
                  
          // 加密數(shù)據(jù)
                  Cipher cp=Cipher.getInstance(Algorithm);
                  cp.init(Cipher.ENCRYPT_MODE, keyPublic);
                  
          return cp.doFinal(originalString.getBytes());
              }
              
              
              
          /**
               * 使用私鑰進(jìn)行解密
               * 
               * 說明:
               * 
          @param encryptedDataArray
               * 
          @return
               * 
          @throws Exception
               * 創(chuàng)建時間: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);
                  
                  
          // 解密數(shù)據(jù)
                  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(
          "準(zhǔn)備用公鑰加密的字符串為:"+str);
                  
                  
          // 用公鑰加密
                  RSASecurityCoder rsaCoder=new RSASecurityCoder();
                  
          byte[] publicKey=rsaCoder.getPublicKey();        
                  
          byte[] encryptArray=rsaCoder.getEncryptArray(str, publicKey);
                  
                  System.out.print(
          "用公鑰加密后的結(jié)果為:");
                  
          for(byte b:encryptArray){
                      System.out.print(b);
                  }
                  System.out.println();
                  
                  
          // 用私鑰解密
                  String str1=rsaCoder.getDecryptString(encryptArray);
                  System.out.println(
          "用私鑰解密后的字符串為:"+str1);
              }
          }

          輸出:
          準(zhǔn)備用公鑰加密的字符串為:你好,世界! Hello,world!
          用公鑰加密后的結(jié)果為:
          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
          !


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

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

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

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

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


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 镇宁| 保德县| 耒阳市| 东光县| 五寨县| 奈曼旗| 恩平市| 垫江县| 湘西| 鹿泉市| 石台县| 江山市| 琼海市| 兴业县| 阆中市| 南丹县| 富顺县| 汝阳县| 连州市| 那曲县| 成武县| 东山县| 阜新| 旺苍县| 伊金霍洛旗| 台湾省| 万年县| 法库县| 苍溪县| 多伦县| 平果县| 漾濞| 江阴市| 宁南县| 岐山县| 手游| 金阳县| 白玉县| 台江县| 陆川县| 纳雍县|