<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

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

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

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

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

    舉例來說,現(xiàn)在有一客戶端視圖和WebService服務(wù)器端通信,假如服務(wù)器端的響應(yīng)函數(shù)是 String getResponse(String params,byte[] publicKeyArray);兩邊程序都有下面的RSASecurityCoder類,客戶端在發(fā)送請求前,可以得到此類的一個(gè)實(shí)例,并得到其公鑰,然后調(diào)用服務(wù)器端的getResponse函數(shù),公鑰就是這個(gè)函數(shù)的第二個(gè)參數(shù);服務(wù)器端得到請求后,處理得到結(jié)果,然后用第二個(gè)參數(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)建時(shí)間:2010-12-1 下午06:14:38
     * 修改時(shí)間: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)建時(shí)間: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)建時(shí)間: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í),第一個(gè)參數(shù)params不是還會(huì)暴露一部分信息嗎? 不要怕,我們可以讓服務(wù)器端再準(zhǔn)備一個(gè)WebService函數(shù) byte[] getServerPublicKey();客戶端可以調(diào)用這個(gè)函數(shù)以得到服務(wù)器端的公鑰,然后把params用這個(gè)公鑰加密,然后再調(diào)用getResponse(String params,byte[] publicKeyArray)函數(shù),服務(wù)器端接到請求后,用自己的私鑰對第一個(gè)參數(shù)進(jìn)行解密就可以了。這樣,所有信息都得到了保護(hù)。

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

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

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

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


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 久久久久无码专区亚洲av| 国产免费AV片在线观看播放| 国产亚洲一区二区手机在线观看| 免费鲁丝片一级观看| 37pao成人国产永久免费视频| 国产免费黄色无码视频| 精品视频免费在线| 中文字幕亚洲情99在线| 91亚洲国产在人线播放午夜 | 亚洲娇小性xxxx色| 亚洲av永久无码精品网站 | 黄色a三级免费看| 亚洲日本一线产区和二线产区对比| 亚洲人成依人成综合网| 亚洲欧洲日产国码无码久久99| 亚洲一级Av无码毛片久久精品| 国产成人免费a在线视频app| 在线A级毛片无码免费真人| 日本阿v免费费视频完整版| 最近中文字幕高清免费中文字幕mv| 热久久这里是精品6免费观看| 国产大片免费天天看| 男人免费视频一区二区在线观看| jzzijzzij在线观看亚洲熟妇| 亚洲精华国产精华精华液| 中文字幕精品三区无码亚洲| 亚洲jizzjizz在线播放久| 亚洲jjzzjjzz在线播放| 国产成人精品亚洲日本在线| 亚洲娇小性色xxxx| 亚洲国产精品成人综合色在线| 亚洲一卡一卡二新区无人区| 亚洲精品福利你懂| 亚洲乱理伦片在线观看中字| 亚洲熟伦熟女专区hd高清| 亚洲欧洲国产综合AV无码久久| 亚洲Av永久无码精品黑人| 无套内谢孕妇毛片免费看看| 一区二区三区免费在线视频| 国产免费一级高清淫曰本片| a在线观看免费网址大全|