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算法


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