直到今天,我纔不再認爲“RSA算法只在考試用過”,因爲最近做的支付就用到了這個算法,我纔可以有理有據地告訴我自己:“RSA不單單在考試用到啊!”。你要問我爲什麼,我只能告訴你,繼續看下去!
◔ 加密歷史
不知道提到加密算法,正在看博客的你,最先想到的是哪種加密?
我只能告訴你,我最先想到的是公鑰加密,這是一種很6的加密。因爲在公鑰加密出現之前,所有的加密都是一種模型:
1)甲使用某種規則對文件加密,將文件和加密方式告訴乙;
2)乙使用同一種規則對文件進行解密;
在上述模式(也就是俗稱的“對稱加密”)中,人們不得不爲祕鑰的保存和傳遞進行擔憂,因爲在這個加密過程中,甲必須將加密的規則告訴乙,否則乙方無法完成解密;這個讓加密專家頭疼的問題一直持續到--Rivest、Shamir 和 Adleman 這三個人在1977年提出的“非對稱加密”算法。這種算法就是我們一直在說的“RSA加密算法”;
這種算法非常可靠,因爲它使用的祕鑰越長,破解難度係數就會越高,這樣文件的傳輸過程就會越安全。據記載,目前被破解的最長RSA祕鑰是768個二進制位。也就是說,當前祕鑰長度超過768位的祕鑰,還無人能破解。所以我們基本上可以認爲:1024位的RSA祕鑰基本安全,2048位的祕鑰及其安全。
◔ RSA算法的必備知識
要想知道RSA公鑰和私鑰的祕密,我們需要先回顧一些數學知識:素數、互質數、指數運算、模運算;下面舉一個栗子:
主人公就是大家熟悉的:李雷和韓梅梅;
李雷要向韓梅梅傳遞消息,但是不想輕易的被別人破解,所以對這則消息進行了加密:
▶ 選擇兩個不相等的比較大的質數(X,Y),並且計算出X與Y的乘積Z;
李雷選擇的這兩個質數分別是 61和53(實際應用中,這兩個質數越大,就破解的難度係數就越高),並計算出兩個質數的乘積:Z = 61 * 53 = 3233;也就意味着當前祕鑰的長度是3233 的二進制位,也就是110010100001,一共12位,所以當前李雷使用的祕鑰就是12位;
▶ 使用叫 歐拉函數 的這個東西,計算出r = (X-1)(Y-1)
計算所得:3120;
▶ 隨機選擇一個整數e,確保1 < e < r,而且e和r互質;
李雷在1和3120之間隨機選擇了17,;
▶ 利用公式: e * d = 1(mod r)計算出一組整數解(a,b)=(2753,-15)
▶ 組裝私鑰和公鑰
上述過程中,Z=3233,e=17,d=2753,所以李雷獲取到的公鑰就是(3233,17),私鑰就是(3233,2753);
所以整個過程歸爲一張圖就是:
借用一個例子給大家展示RSA算法的實例:
public class RSA {
/**
* 加密、解密算法
* @param key 公鑰或密鑰
* @param message 數據
* @return
*/
public static long rsa(int baseNum, int key, long message){
if(baseNum < 1 || key < 1){
return 0L;
}
//加密或者解密之後的數據
long rsaMessage = 0L;
//加密核心算法
rsaMessage = Math.round(Math.pow(message, key)) % baseNum;
return rsaMessage;
}
public static void main(String[] args){
//基數
int baseNum = 3 * 11;
//公鑰
int keyE = 3;
//密鑰
int keyD = 7;
//未加密的數據
long msg = 24L;
//加密後的數據
long encodeMsg = rsa(baseNum, keyE, msg);
//解密後的數據
long decodeMsg = rsa(baseNum, keyD, encodeMsg);
System.out.println("加密前:" + msg);
System.out.println("加密後:" + encodeMsg);
System.out.println("解密後:" + decodeMsg);
}
}
程序運行執行的結果爲:
加密前:24
加密後:30
解密後:24
以上就是RSA算法加密解密的相關東西,關於支付的相關知識會在下篇中寫到,謝謝大家關注!