結合“山東***”和“山東***”目前的網絡信息傳遞內容來看,其最重要的信息爲播放流地址和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算法