<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í)候...

    真正的快樂(lè)來(lái)源于創(chuàng)造

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

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

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

    下面請(qǐng)看代碼:
    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加密解密類
     * 說(shuō)明:
     * 作者:何楊(heyang78@gmail.com)
     * 創(chuàng)建時(shí)間:2010-12-1 下午06:14:38
     * 修改時(shí)間:2010-12-1 下午06:14:38
     
    */
    public class RSASecurityCoder{
        
    // 非對(duì)稱加密密鑰算法
        private static final String Algorithm="RSA";
        
        
    // 密鑰長(zhǎng)度,用來(lái)初始化
        private static final int Key_Size=1024;
        
        
    // 公鑰
        private final byte[] publicKey;
        
        
    // 私鑰
        private final byte[] privateKey;
        
        
    /**
         * 構(gòu)造函數(shù),在其中生成公鑰和私鑰
         * 
    @throws Exception
         
    */
        
    public RSASecurityCoder() throws Exception{
            
    // 得到密鑰對(duì)生成器
            KeyPairGenerator kpg=KeyPairGenerator.getInstance(Algorithm);
            kpg.initialize(Key_Size);
            
            
    // 得到密鑰對(duì)
            KeyPair kp=kpg.generateKeyPair();
            
            
    // 得到公鑰
            RSAPublicKey keyPublic=(RSAPublicKey)kp.getPublic();
            publicKey
    =keyPublic.getEncoded();
            
            
    // 得到私鑰
            RSAPrivateKey keyPrivate=(RSAPrivateKey)kp.getPrivate();
            privateKey
    =keyPrivate.getEncoded();
        }
        
        
    /**
         * 用公鑰對(duì)字符串進(jìn)行加密
         * 
         * 說(shuō)明:
         * 
    @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)行解密
         * 
         * 說(shuō)明:
         * 
    @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
    !


    看到這里,如果有人說(shuō)客戶端調(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ù)器端接到請(qǐng)求后,用自己的私鑰對(duì)第一個(gè)參數(shù)進(jìn)行解密就可以了。這樣,所有信息都得到了保護(hù)。

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

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

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

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


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 免费国产va在线观看| 无码日韩精品一区二区免费暖暖 | 四虎一区二区成人免费影院网址| 亚洲第一黄片大全| 国产成人免费视频| 亚洲AV无码一区二区三区牲色 | 久久久亚洲欧洲日产国码二区| 在线观看免费人成视频色| 亚洲a∨无码一区二区| 久久久久亚洲精品成人网小说| 在线免费视频一区| 中文字幕免费在线看| 亚洲一线产品二线产品| 亚洲一区二区三区香蕉| 成人免费毛片观看| 亚在线观看免费视频入口| 色欲aⅴ亚洲情无码AV| 亚洲精品自产拍在线观看动漫| 国产一级淫片视频免费看| 18级成人毛片免费观看| 狼色精品人妻在线视频免费| 久久精品国产亚洲AV高清热| 亚洲视频一区二区| 最新猫咪www免费人成| 午夜精品一区二区三区免费视频| 噜噜噜亚洲色成人网站| 亚洲成a人片在线观看中文app| 最新亚洲成av人免费看| 午夜a级成人免费毛片| 91精品国产免费久久国语麻豆| kk4kk免费视频毛片| 亚洲国产精品嫩草影院| 亚洲国产精品久久| 亚洲乱亚洲乱妇无码麻豆| 又粗又硬又大又爽免费视频播放| 日韩国产免费一区二区三区| 精品亚洲永久免费精品| 久久精品成人免费国产片小草| 久久亚洲精品成人无码| 亚洲国产精品久久丫| 亚洲欧洲日产国码久在线观看|