RSA加密技術

結合“山東***”和“山東***”目前的網絡信息傳遞內容來看,其最重要的信息爲播放流地址和mp4的播放地址,其他信息暫時達不到需要加密的條件。

RSA加密技術,爲非對稱加密技術,RSA是目前最有影響力的公鑰加密算法,它能夠抵抗到目前爲止已知的所有密碼攻擊,已被ISO推薦爲公鑰數據加密標準。結合“山東***”具體闡述一下其實現的方式以及原理:

以下是由客戶端訪問服務器進行數據加密的過程,反之一樣

  1. 1.    根據RSA算法,分別在客戶端和服務器生成一對密鑰(公鑰和私鑰);

服務器的公鑰和私鑰暫時以“公S”和“私S”代替,客戶端的公鑰和私鑰暫時以“公C”和“私C”代替;

  1. 2.    用戶通過網絡訪問服務器獲取數據時,將“公C”告知服務器,服務器根據“公C”,RSA算法和自定義的算法進行加密,並將加密後的密文,發送與客戶端
  2. 3.    客戶端拿到密文以後,根據“私C”和自定義算法進行解密,獲得明文

這樣以上完成一次由客戶端-服務器-客戶端的數據加密過程。在整個過成功數據在JAVASCRIPT、HTML中以密文方式出現,在服務器、android、IOS端可進行數據解密。

在整個過程共,服務器端和客戶端生成的公鑰是可以相互告知的,通過對方告知的公鑰進行數據加密,然後通過各自的私鑰進行數據解密。在RSA算法中,單獨知道公鑰是不能推導出私鑰的,單獨知道私鑰也是推導不出公鑰。

以下爲實現代碼

RSACoder.class

<span style="font-size:14px;">publicclass RSACoder {

    //非對稱密鑰算法 

    publicstaticfinal String KEY_ALGORITHM="RSA"; 

    /**

     * 密鑰長度,DH算法的默認密鑰長度是1024

     * 密鑰長度必須是64的倍數,在512到65536位之間

     * */ 

    privatestaticfinalintKEY_SIZE=512; 

    //公鑰 

    privatestaticfinal String PUBLIC_KEY="xiaoxiaorenzhe"; 

     

    //私鑰 

    privatestaticfinal String PRIVATE_KEY="dadapangzi"; 

   

    /**

     * 初始化密鑰對

     * @return Map 甲方密鑰的Map

     * */ 

    publicstatic Map<String,Object> initKey() throws Exception{ 

        //實例化密鑰生成器 

        KeyPairGenerator keyPairGenerator=KeyPairGenerator.getInstance(KEY_ALGORITHM); 

        //初始化密鑰生成器 

        keyPairGenerator.initialize(KEY_SIZE); 

        //生成密鑰對 

        KeyPair keyPair=keyPairGenerator.generateKeyPair();

        //甲方公鑰 

        RSAPublicKey publicKey=(RSAPublicKey) keyPair.getPublic(); 

        System.out.println("係數:"+publicKey.getModulus()+"  加密指數:"+publicKey.getPublicExponent());

        //甲方私鑰 

        RSAPrivateKey privateKey=(RSAPrivateKey) keyPair.getPrivate();

        System.out.println("係數:"+privateKey.getModulus()+"解密指數:"+privateKey.getPrivateExponent());

        //將密鑰存儲在map中 

        Map<String,Object> keyMap=new HashMap<String,Object>(); 

        keyMap.put(PUBLIC_KEY, publicKey); 

        keyMap.put(PRIVATE_KEY, privateKey); 

        return keyMap; 

         

    } 

   

    /**

     * 私鑰加密

     * @param data待加密數據

     * @param key 密鑰

     * @return byte[] 加密數據

     * */ 

    publicstaticbyte[] encryptByPrivateKey(byte[] data,byte[] key) throws Exception{ 

         

        //取得私鑰 

        PKCS8EncodedKeySpec pkcs8KeySpec=new PKCS8EncodedKeySpec(key); 

        KeyFactory keyFactory=KeyFactory.getInstance(KEY_ALGORITHM); 

        //生成私鑰 

        PrivateKey privateKey=keyFactory.generatePrivate(pkcs8KeySpec); 

        //數據加密 

        Cipher cipher=Cipher.getInstance(keyFactory.getAlgorithm()); 

        cipher.init(Cipher.ENCRYPT_MODE, privateKey); 

        return cipher.doFinal(data); 

    } 

   

    /**

     * 公鑰加密

     * @param data待加密數據

     * @param key 密鑰

     * @return byte[] 加密數據

     * */ 

    publicstaticbyte[] encryptByPublicKey(byte[] data,byte[] key) throws Exception{ 

         

        //實例化密鑰工廠 

        KeyFactory keyFactory=KeyFactory.getInstance(KEY_ALGORITHM); 

        //初始化公鑰 

        //密鑰材料轉換 

        X509EncodedKeySpec x509KeySpec=new X509EncodedKeySpec(key); 

        //產生公鑰 

        PublicKey pubKey=keyFactory.generatePublic(x509KeySpec); 

         

        //數據加密 

        Cipher cipher=Cipher.getInstance(keyFactory.getAlgorithm()); 

        cipher.init(Cipher.ENCRYPT_MODE, pubKey); 

        return cipher.doFinal(data); 

    } 

    /**

     * 私鑰解密

     * @param data 待解密數據

     * @param key 密鑰

     * @return byte[] 解密數據

     * */ 

    publicstaticbyte[] decryptByPrivateKey(byte[] data,byte[] key) throws Exception{ 

        //取得私鑰 

        PKCS8EncodedKeySpec pkcs8KeySpec=new PKCS8EncodedKeySpec(key); 

        KeyFactory keyFactory=KeyFactory.getInstance(KEY_ALGORITHM); 

        //生成私鑰 

        PrivateKey privateKey=keyFactory.generatePrivate(pkcs8KeySpec); 

        //數據解密 

        Cipher cipher=Cipher.getInstance(keyFactory.getAlgorithm()); 

        cipher.init(Cipher.DECRYPT_MODE, privateKey); 

        return cipher.doFinal(data); 

    } 

   

    /**

     * 公鑰解密

     * @param data 待解密數據

     * @param key 密鑰

     * @return byte[] 解密數據

     * */ 

    publicstaticbyte[] decryptByPublicKey(byte[] data,byte[] key) throws Exception{ 

         

        //實例化密鑰工廠 

        KeyFactory keyFactory=KeyFactory.getInstance(KEY_ALGORITHM); 

        //初始化公鑰 

        //密鑰材料轉換 

        X509EncodedKeySpec x509KeySpec=new X509EncodedKeySpec(key); 

        //產生公鑰 

        PublicKey pubKey=keyFactory.generatePublic(x509KeySpec); 

        //數據解密 

        Cipher cipher=Cipher.getInstance(keyFactory.getAlgorithm()); 

        cipher.init(Cipher.DECRYPT_MODE, pubKey); 

        return cipher.doFinal(data); 

    } 

    

    /**

     * 取得私鑰

     * @param keyMap 密鑰map

     * @return byte[] 私鑰

     * */ 

    publicstaticbyte[] getPrivateKey(Map<String,Object> keyMap){ 

        Key key=(Key)keyMap.get(PRIVATE_KEY); 

        return key.getEncoded(); 

    } 

    /**

     * 取得公鑰

     * @param keyMap 密鑰map

     * @return byte[] 公鑰

     * */ 

    publicstaticbyte[] getPublicKey(Map<String,Object> keyMap) throws Exception{ 

        Key key=(Key) keyMap.get(PUBLIC_KEY);

        return key.getEncoded(); 

    } 

    /**

     * @param args

     * @throws Exception 

     */ 

    publicstaticvoid main(String[] args) throws Exception { 

        //初始化密鑰 

        //生成密鑰對 

        Map<String,Object> keyMap=RSACoder.initKey(); 

        //公鑰 

        byte[] publicKey=RSACoder.getPublicKey(keyMap);

        //私鑰 

        byte[] privateKey=RSACoder.getPrivateKey(keyMap); 

        System.out.println("公鑰:"+Base64.encodeBase64String(publicKey));

        System.out.println("私鑰:"+Base64.encodeBase64String(privateKey)); 

        System.out.println("================密鑰對構造完畢,甲方將公鑰公佈給乙方,開始進行加密數據的傳輸============="); 

        String str="aattaggcctegthththfef/aat.mp4"; 

        System.out.println("===========甲方向乙方發送加密數據=============="); 

        System.out.println("原文:"+str); 

        //甲方進行數據的加密 

        byte[] code1=RSACoder.encryptByPublicKey(str.getBytes(), publicKey);

        System.out.println("加密後的數據:"+Base64.encodeBase64String(code1)); 

        System.out.println("===========乙方使用甲方提供的公鑰對數據進行解密=============="); 

        //乙方進行數據的解密 

        //byte[] decode1=RSACoder.decryptByPublicKey(code1, publicKey); 

        byte[] decode1=RSACoder.decryptByPrivateKey(code1, privateKey); 

        System.out.println("乙方解密後的數據:"+new String(decode1)+""); 

        System.out.println("===========反向進行操作,乙方向甲方發送數據=============="); 

        str="乙方向甲方發送數據RSA算法"; 

        System.out.println("原文:"+str); 

        //乙方使用公鑰對數據進行加密 

        byte[] code2=RSACoder.encryptByPublicKey(str.getBytes(), publicKey); 

        System.out.println("===========乙方使用公鑰對數據進行加密=============="); 

        System.out.println("加密後的數據:"+Base64.encodeBase64String(code2)); 

        System.out.println("=============乙方將數據傳送給甲方======================"); 

        System.out.println("===========甲方使用私鑰對數據進行解密=============="); 

        //甲方使用私鑰對數據進行解密 

        byte[] decode2=RSACoder.decryptByPrivateKey(code2, privateKey); 

        System.out.println("甲方解密後的數據:"+new String(decode2));

       

       

    } 

}</span>

加密指數:65537

係數:7235018666043005587713334227877723351776244519952330948988015976499433007005379413072650294166904787713283998646111042233296862701142380157021624939708981

解密指數:701345401610864313269493756957248217859140354841649122158793742446265436219297361593440400665942962113469972118257225407071901463653578112232161797673473

公鑰:MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAIokCNpWyi29yJe++/ObeM4yuIhts+EDSv0gQkCbgn5q

Fx9Y5+RtNYaOQxD5JTsTDg7SQLqmPS2deQ4JnwLGAjUCAwEAAQ==

 

私鑰:MIIBVQIBADANBgkqhkiG9w0BAQEFAASCAT8wggE7AgEAAkEAiiQI2lbKLb3Il77785t4zjK4iG2z

4QNK/SBCQJuCfmoXH1jn5G01ho5DEPklOxMODtJAuqY9LZ15DgmfAsYCNQIDAQABAkANZBrbl4g3

0OruEtx3q/2U94O97ex/BoOxb/wcKTcIK/oISzw83StcmhPVtjNMU9LCUHmetNq0G3ofane9OxIB

AiEAy7qi9oLdXlBzIr67As780LdVYMqiH8FSXYKSuc02EbUCIQCtlWruRjmO2V4KSbLUwC34bh/q

KlhwEk4pK0to6JB+gQIhAMQahzsahNOARROw3Hq7m4ecscZVxvEiOZJhWbMX4W/xAiBZ8ps+bVVW

GH0Kh7YLWKp5mVcgWGELcfDelHi3HAwEAQIhAKU+5e1x3oFJzlr1yYJK8+HsFN4q/3TPZW1sAAWm

iQwM

 

================密鑰對構造完畢,甲方將公鑰公佈給乙方,開始進行加密數據的傳輸=============

===========甲方向乙方發送加密數據==============

原文:aattaggcctegthththfef/aat.mp4

加密後的數據:TpTIbGi6KlEIUleDt8yzH3Dq6YYGbaH5v4c9YqHwLi8nZ9CjgIEWgwCW45UxApMzMGF5Z6i2Ej6p

ZFsuppHaoQ==

 

===========乙方使用甲方提供的公鑰對數據進行解密==============

乙方解密後的數據:aattaggcctegthththfef/aat.mp4

===========反向進行操作,乙方向甲方發送數據==============

原文:乙方向甲方發送數據RSA算法

===========乙方使用公鑰對數據進行加密==============

加密後的數據:WTUo21ns88yw2kp1kmswygoWu8CP0iS0YN69+gBHE78/4h50okJeNE9PHXPg0dZ7O+zJuIqt+kuF

wit2e2Mb+Q==

 

=============乙方將數據傳送給甲方======================

===========甲方使用私鑰對數據進行解密==============

甲方解密後的數據:乙方向甲方發送數據RSA算法


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章