RSA算法簡單介紹:
RSA算法是非對稱加密算法,在1977年被羅納德·李維斯特(Ron Rivest)、阿迪·薩莫爾(Adi Shamir)和倫納德·阿德曼(Leonard Adleman)一起提出的,故取名為RSA非對稱加密算法,而今在計算機數據加密領域以及電子商業中廣泛使用.
致敬三位偉大的數學家
RSA數學原理:
提問:
設想我們如果有一個正整數n,有多少個數與n互為互質關系?
tag:什么叫互質關系?
互質關系(即兩個數,除了1以外,沒有其他的公約數,那么我們就稱之為這兩個數是互質關系.例如:3和8是互質關系,而2和8就不是.)
φ(n)與歐拉函數:
而求n的互質關系數的個數的方式(也就是上述的提問),我們就稱為歐拉函數.通常我們用φ(n)來表示.
舉例:
φ(8) = 4;(1,3,5,7與8互質)
φ(7) = 6;(1,2,3,4,5,6與7互質)
歐拉函數的特性:
1.如果n本身是一個質數(也就是說n本身除了1和自己不被任何數整除,例如7)
那么φ(n) = n - 1; 比如φ(7) = 7 - 1 = 6;
2.如果n能夠分解成兩個質數(a,b)的乘積(例如15 可以 分解成 3 * 5 ,而3和5是質數)
那么φ(n) = φ(a) * φ(b);
由于a是質數,b也是質數,所以φ(a) = a - 1,φ(b) = b - 1;(根據第一條)
那么我們可以推論得出 φ(n) = (a - 1) * (b - 1);
歐拉定理:
如果兩個正整數m和n互質,那么m的φ(n)次方減去1,可以被n整除.
公式: m^φ(n) % n == 1;
即是m的φ(n)次方模以 n 恒等于1.
例如:3 和 5? 互質,那么 3^φ(5) % 5 == 1.也就是說 3 ^ 4 % 5 == 1;?
費馬小定理:(我一直覺得這個定理是廢話)
歐拉定理的特殊情況:如果兩個正整數m和n互質,而且n為質數!那么φ(n)結果就是n-1。
就是說: m^φ(n) % n == 1,當n是質數的時候 m^φ(n) % n = m^(n - 1) % n == 1.
歐拉定理公式轉換:
由于歐拉定理我們知道:
m^φ(n) % n == 1.
而1^k 還是等于 1. 那么 也就是說?m^φ(n) % n = (m^φ(n) % n)^k = m ^ (k *?φ(n) ) % n == 1.
我們在這個等式基礎上左右乘以m.也就是說?m ^ (k *?φ(n) ) % n =?m ^ (k *?φ(n)? + 1) % n == m.
最終轉換結果我們且先記下,先看下模反元素.
模反元素:
如果兩個正整數e和x互質,那么一定能夠找到一個整數d,使得e * d? - 1可以整除 x.那么也就可以說,d就是e相對于x的模反元素.
我們可以記為:e * d % x == 1.
變換: 既然 e * d % x == 1.那么 e * d == k * x + 1.(k為某個可計算出來的正整數).
舉例:
如 3 和 5 互質 那么 3 * d? = k *? 5 + 1. d 可以為 4, k 為 16.
觀察
e * d = k * x + 1. 等式右邊 的 k * x + 1 跟 歐拉定理公式變化的最后一步 k * φ(n) + 1是一致的.
那么也就可以推論得出:
m ^ (k *?φ(n)? + 1) % n? = m ^ (k * x + 1) % n?= m ^( e * d )? % n == m.
即是:
m ^( e * d )? % n == m.
這個公式的滿足條件:
首先這個公式里的k * x + 1 被替代成 k * φ(n) + 1.故而x 是這個公式里的φ(n).
所以這個公式:
1.d 要是e 相對于 φ(n) 的模反元素.(所以e也相對于φ(n)互質)
2.m要小于n.
迪菲赫爾曼密鑰交換:
在上圖中,客戶端和服務器約定了一個數17得到它的源根3.分別各隨機出一個值13和15.
1.客戶端通過公式計算得到6發送給服務器.服務器通過公式計算得到值12發送給客戶端.
2.第三方在網絡中竊取到6和12.
3.客戶端得到服務器的數據6.通過6套入公式中得到值10.服務器得到客戶端發送的數據12,套入公式中同樣得到值10.
4.此時信息發送完畢!
交換原理:
回到之前的上圖 客戶端在隨機出13后,通過3 ^ 13 % 17 得到12,此時服務器 接收到12.通過12 ^ 15 % 17 = 10.而服務器 在隨機出15后,通過3 ^ 15 % 17 得到6 發送給客戶端,客戶端拿到6后 通過 6 ^ 13 % 17 同樣也得到10
我們可以看到?
客戶端這里計算了 (3 ^ 15? % 17) ^13 %17? = 3 ^ (15 * 13) % 17 = 10.
tag:?(3 ^ 15? % 17)? 是服務器給的
服務器這里計算了 (3 ^ 13? % 17) ^15 %17? = 3 ^ (13 * 15) % 17 = 10.
tag:??(3 ^ 13? % 17)?? 是客戶端給的
也就是說之前的客戶端和服務器 將 m ^(e * d) % n 的公式成功拆分成了兩部分:
m ^ e % n = C.(加密)
C ^ d % n = m.(解密)
Nice!! 到這里 我們就可以模擬出一個完整的RSA加解密流程了.
公式說明:
m ^ e % n = C.(加密)
C ^ d % n = m.(解密)
在上述公式中,e和n 是公鑰. d 和 n 是私鑰.C是密文,m是明文.
明文在通過公鑰加密成密文C. 而C通過私鑰解密成明文m.
知道原理后,那么請問我們如果要破解RSA應該怎么做?
如果我們要破解RSA,首先我們掌握的信息有密文C,公鑰e和n.未知的則是私鑰d和n以及明文m.因為n是公鑰中攜帶的 所以我們要知道明文m,首先要知道私鑰的d.已知d是公鑰中的e相對于φ(n)的模反元素,所以要求得d需要知道φ(n).而n我們是已知的,如果要求φ(n),需要將n因式分解將n分解成兩個質數p1,p2通過公式 φ(n) = (p1 - 1)*(p2 - 1).來求出φ(n).最終通過φ(n)找到模反元素私鑰d.
但是事實是,這個n一般的值都特別大,對一個大整數n進行因式分解,計算量相當恐怖,目前人類已經分解的最大整數是232個十進制位,768個二進制位.
而當今我們為了確保信息的安全,采用RSA加密的通常是1024個二進制位或者2048個二進制位.所以相對而言,采用RSA加密的信息一般是安全的.
在MAC下使用終端來演示RSA:
在MacOS系統中一般使用內置OpenSSL(開源密碼庫)來進行終端運行.
命令演示:
openssl genrsa -out private.pem 1024.(生成一個1024個二進制位的私鑰)
openssl rsa -in private.pem -pubout -out public.pem.(根據私鑰導出公鑰)
加密:
openssl rsautl -encrypt -in message.txt -inkey public.pem -pubin -out enc.txt
解密:
openssl rsautl -decrypt -in enc.txt -inkey private.pem -out dec.txt
RSA的特性:
由于RSA計算量比較大,所以效率比較低,但是因為公鑰私鑰分開,所以安全系數比較高.
通常我們用RSA加密一些數據量小的文件,如果數據量比較大,那么我們更多的會考慮對稱加密算法比如DES,3DES,AES.
所以我們更多的用RSA加密對稱加密的密鑰或者用于數字簽名.