當前位置:
首頁 > 知識 > RSA加密通信小結(四)--RSA加解密的實際操作與流程小結

RSA加密通信小結(四)--RSA加解密的實際操作與流程小結

在上一篇文章中,我們已經將密鑰的生成方法和流程,歸納總結。而本篇主要是講如何利用密鑰進行加解密。

首先,在上一篇文章中的我們生成了很多密鑰,證書等等。

在上述生成的文件中,接收服務端加密報文:pkcs8_private_key.pem給安卓使用解密,private_key.p12 給IOS使用解密(IOS加密是public_key.der文件),rsa_public_key.pem是JAVA伺服器端使用的加密密鑰(雙向通信需要用兩套不一樣的密鑰)。發送加密報文:rsa_public_key.pem給安卓使用加密,public_key.der給IOS使用加密,pkcs8_private_key.pem在伺服器端進行解密密鑰。

其次,打開密鑰文件後,一般長這個樣子。

於是為了將其利用起來,寫了如下代碼:

RSA加密通信小結(四)--RSA加解密的實際操作與流程小結

1 public static String readWantedText(String url) {
2 try {
3 FileReader fr = new FileReader(url);
4 BufferedReader br = new BufferedReader(fr);
5 StringBuffer sb = new StringBuffer;
6
7 String temp = "";// 用於臨時保存每次讀取的內容
8 temp = br.readLine;
9 while ((temp = br.readLine) != null) {
10 if (temp.charAt(0) == "-") {
11 continue;
12 }
13 sb.append(temp);
14 }
15
16 return sb.toString;
17
18 } catch (Exception e) {
19 e.printStackTrace;
20 return null;
21 }
22 }

獲得以上密鑰字元串之後,再將其轉化為可用的密鑰,轉化私鑰代碼如下

1 public static PrivateKey getPrivateKey(String key) throws Exception {
2
3 byte keyBytes = key.getBytes;
4 keyBytes = Base64.decodeBase64(keyBytes);
5 PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(keyBytes);
6 KeyFactory keyFactory = KeyFactory.getInstance("RSA");
7 PrivateKey privateKey = keyFactory.generatePrivate(keySpec);
8 return privateKey;
9 }

轉化公鑰代碼如下:

1 public static PublicKey getPublicKey(String key) throws Exception {
2
3 byte keyBytes = key.getBytes;
4 keyBytes = Base64.decodeBase64(keyBytes);
5 X509EncodedKeySpec keySpec = new X509EncodedKeySpec(keyBytes);
6 KeyFactory keyFactory = KeyFactory.getInstance("RSA");
7 PublicKey publicKey = keyFactory.generatePublic(keySpec);
8 return publicKey;
9 }

然後,得到了密鑰之後我們進行加解密操作,其中一個重要的點就是117 可以參考此篇博文:http://www.metsky.com/archives/657.html,詳細了解。這裡關注點是,加密117位元組加密 一下,解密用128解密。

加密函數如下:

1 public static final String KEY_ALGORITHM = "RSA";
2 private static final int MAX_ENCRYPT_BLOCK = 117;
3 private static final int MAX_DECRYPT_BLOCK = 128;
4
5 public static byte encryptByPublicKey(byte[] data, String publicKey) throws Exception {
6 byte keyBytes = Base64Utils.decode(publicKey);
7 X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(keyBytes);
8 KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
9 Key publicK = keyFactory.generatePublic(x509KeySpec);
10 // 對數據加密
11 Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm);
12 cipher.init(Cipher.ENCRYPT_MODE, publicK);
13 int inputLen = data.length;
14 ByteArrayOutputStream out = new ByteArrayOutputStream;
15 int offSet = 0;
16 byte cache;
17 int i = 0;
18 // 對數據分段加密
19 while (inputLen - offSet > 0) {
20 if (inputLen - offSet > MAX_ENCRYPT_BLOCK) {
21 cache = cipher.doFinal(data, offSet, MAX_ENCRYPT_BLOCK);
22 } else {
23 cache = cipher.doFinal(data, offSet, inputLen - offSet);
24 }
25 out.write(cache, 0, cache.length);
26 i++;
27 offSet = i * MAX_ENCRYPT_BLOCK;
28 }
29 byte encryptedData = out.toByteArray;
30 out.close;
31 return encryptedData;
32 }

解密函數如下:

public static byte decryptByPrivateKey(byte[] encryptedData, String privateKey)
throws Exception {
byte keyBytes = Base64Utils.decode(privateKey);
PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes);
KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
Key privateK = keyFactory.generatePrivate(pkcs8KeySpec);
Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm);
cipher.init(Cipher.DECRYPT_MODE, privateK);
int inputLen = encryptedData.length;
ByteArrayOutputStream out = new ByteArrayOutputStream;
int offSet = 0;
byte cache;
int i = 0;
// 對數據分段解密
while (inputLen - offSet > 0) {
if (inputLen - offSet > MAX_DECRYPT_BLOCK) {
cache = cipher.doFinal(encryptedData, offSet, MAX_DECRYPT_BLOCK);
} else {
cache = cipher.doFinal(encryptedData, offSet, inputLen - offSet);
}
out.write(cache, 0, cache.length);
i++;
offSet = i * MAX_DECRYPT_BLOCK;
}
byte decryptedData = out.toByteArray;
out.close;
return decryptedData;
}

上兩段代碼中,涉及到的轉碼代碼為:

1 public static byte decode(String base64) throws Exception {
2 return Base64.decode(base64.getBytes);
3 }
4
14 public static String encode(byte[] bytes) throws Exception {
15 return new String(Base64.encode(bytes));
16 }

由此 我們就完成了對密鑰的使用,現在我們通過一個簡單的測試代碼來檢驗我們這幾篇文檔的成果。

1 public static void main(String[] args) {
2
3
4 String publicFilePath = "E:\test_public_key.pem";
5 String publickey = RSAForCommunication.readWantedText1(publicFilePath);
6 String word = "這是用來測試,加密效果的一句話,可以試試 有多長。但是目前的情況來看,是可以長場產出噶哈哈哈哈哈哈哈哈啊哈哈哈哈哈啊哈哈哈哈啊啊啊哈哈哈";
7 String encode ="";
8 try {
9 byte a = RSAForCommunication.encryptByPublicKey(word.getBytes, publickey);
10 encode = Base64Utils.encode(a);
11 } catch (Exception e) {
12
13 }
14
15 System.out.println("-------加密之後的密文:");
16 System.out.println(encode);
17
18
19 String filePath = "E:\test_private_key.pem";
20 String key = RSAForCommunication.readWantedText1(filePath);
21 byte a;
22 try {
23 a = Base64Utils.decode(encode);
24 byte b = decryptByPrivateKey(a, key);
25 String deCodeStr = new String(b, "utf-8");
26 System.out.println("--------密文解密為:");
27 System.out.println(deCodeStr);
28 } catch (Exception ex) {
29 System.out.println("1");
30 }
31
32 }

結果展示

RSA加密通信小結(四)--RSA加解密的實際操作與流程小結

最後,這裡的密文在傳輸過程中會出現空格或者被轉義的情況,請注意!這是因為安卓或者IOS使用了通信框架或者其他原因導致。會使得通信失敗

如果你有更好的加解密辦法請聯繫我。

——————————————————————————————————————————

補充

關於Base64的包 不建議使用 sun.misc.BASE64Encoder這個包,具體的原因是由於SUN公司賣給oracle之前,自己定義的一些類。並不在公布的API中,以後隨時可能被刪除掉,所以不建議使用。

建議使用 ,如:org.apache.commons.codec.binary.Base64類

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 達人科技 的精彩文章:

python 自定義回調函數
遞歸和分治思想及其應用
mysql分析sql語句基礎工具——explain
JMS 之 Active MQ 消息存儲

TAG:達人科技 |

您可能感興趣

包文婧分享夜間護膚流程,CPB、POLA、LP、FANCL、SK-II
基於NVIDIA CUDA加速工作流程的RED R3D SDK正式上線
JVM系列(一)JVM啟動流程和基本結構
惠普欲通過「VR Snacking」增強傳統的CAD工作流程
理解下HTTPS的原理及流程了
AI智能優化,聯想S5系統或將流程如iOS
眾多EOS用戶成功執行BIOS BOOT流程
ePRICE如何入駐?ePRICE入駐流程&賬號註冊流程指南
藥品檢測儀器技術領導者SOTAX實施IFS APPLICATIONS 10以優化全球業務流程
飛利浦大中華區 CTO 姚智清:以設備端優勢發力 AI,實現健康全流程管理 | CCF-GAIR 2019
森海塞爾攜手DEAR Reality為XR 3D音頻提供端到端的工作流程
RONY·LU(羅尼·陸)高級定製服務流程
Spring解密-Bean 載入流程
Section 10-Halcon實戰寶典之HALCON概述與開發流程
AMETEK Sorensen 發布帶有觸摸顯示屏的SGX系列直流程式控制電源
WPS Excel入門:處理表格的一般流程
F91《指戰星際》NNN期:Dark流ZVP運營流程
NVIDIA再秀GPU虛擬化解決方案,助力用戶工作流程加速
SCI雜誌審稿人,教你零基礎Meta分析流程及軟體操作
一探究竟 親身體驗東風本田CR-V 1.5T召迴流程