结合“山东***”和“山东***”目前的网络信息传递内容来看,其最重要的信息为播放流地址和mp4的播放地址,其他信息暂时达不到需要加密的条件。
RSA加密技术,为非对称加密技术,RSA是目前最有影响力的公钥加密算法,它能够抵抗到目前为止已知的所有密码攻击,已被ISO推荐为公钥数据加密标准。结合“山东***”具体阐述一下其实现的方式以及原理:
以下是由客户端访问服务器进行数据加密的过程,反之一样
- 1. 根据RSA算法,分别在客户端和服务器生成一对密钥(公钥和私钥);
服务器的公钥和私钥暂时以“公S”和“私S”代替,客户端的公钥和私钥暂时以“公C”和“私C”代替;
- 2. 用户通过网络访问服务器获取数据时,将“公C”告知服务器,服务器根据“公C”,RSA算法和自定义的算法进行加密,并将加密后的密文,发送与客户端
- 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算法