RSA加密算法是一種非對稱加密算法,由Ron Rivest、Adi Shamir和Leonard Adleman在1977年共同提出。下文先簡要介紹RSA加密的原理,再介紹如何使用Python進行解密。
RSA算法的加密
生成公鑰和私鑰
第一步:任取不相等的兩質數$p,q$。(此處$p,q$的大小決定了破譯難度)
第二步:$n=pq$。($n$的二進位制的長度即為密鑰長度)
第三步:計算$n$的Euler函數$φ(n) = (p-1)(q-1)$。
第四步:任取整數$e$滿足$1<e<φ(n)$,且$e$與$φ(n)$互質。
第五步:計算出$e$對於$φ(n)$的模反元素$d$。
第六步:公鑰為$(n,e)$,私鑰為$(n,d)$。
加密
第一步:取需要加密的整數$m$。(此處$m<n$)(若要加密字串等,可用ASCII編碼先轉化為整數)
第二步:密文$c\equiv m^e({\rm mod}\ n)$。
- $n,e,c$是公開的,$p,q,φ(n),d,m$是私密的。
RSA算法的解密
首先,我們需要了解以下兩個算法:
擴展Euclidean算法 (EEA)
對於兩正整數$a,b$,我們有Euclidean算法(即輾轉相除法)來計算$gcd(a,b)$:
1 | def gcd(a,b): |
由Bézout定理可知,存在整數$x,y$使得$ax+by=gcd(a,b)$成立。
相較於Euclidean算法,擴展Euclidean算法除了計算$gcd(a,b)$,還會得到$x,y$的值。
代碼如下:
(非遞歸)
1 | def eea(a,b): |
(遞歸)
1 | def eea(a,b): |
Square-and-Multiply算法 (SAMA)
對於三正整數$a,e,n$,我們有Square-and-Multiply算法來計算$a^e({\rm mod}\ n)$,其原理是:
取$e$的二進位制$e=(e_{k-1}…e_0)_2$(其中$k$為$e$的二進位制的長度),則有$e=\sum^{k-1}_{i=0}{e_i\cdot 2^i}$。
$x_0=a$
$x_1=(x_0^2\ {\rm mod}\ n)=(a^2\ {\rm mod}\ n)$
$…$
$x_i=(x_{i-1}^2\ {\rm mod}\ n)=(a^{2^i}\ {\rm mod}\ n)$
$…$
$x_{k-1}=(x_{k-2}^2\ {\rm mod}\ n)=(a^{2^{k-1} }\ {\rm mod}\ n)$
由此可得$a^e\equiv \prod^{k-1}_{i=0}{x_i^{e_i}} ({\rm mod}\ n)$。
代碼如下:
1 | def sam(a,e,n): |
解密
由$c\equiv m^e({\rm mod}\ n)$可證$c^d\equiv m({\rm mod}\ n)$,下給出證明過程:
知$ed\equiv1({\rm mod}\ φ(n))$,因此有$ed-1=lφ(n),(l\in\mathbb N_+)$;
由Euler定理,有$c^d\equiv m^{ed}\equiv m^{lφ(n)+1}\equiv m\cdot (m^{φ(n)})^l\equiv m\cdot 1^l\equiv m({\rm mod}\ n)$,得證。
因此,如果已知$(n,d,c)$,結合Square-and-Multiply算法即可得到原文$m$,代碼如下:
1 | def rsa_1(n,d,c): |
同理,如果已知$(p,q,e,c)$,結合擴展Euclidean算法和Square-and-Multiply算法也可得到原文$m$,代碼如下:
1 | def rsa_2(p,q,e,c): |
這是因為由$φ(n) = (p-1)(q-1)$和$ed\equiv1({\rm mod}\ φ(n))$可知$de+kφ(n) =1(k\in\mathbb Z) $,對$(e,φ(n))$使用擴展Euclidean算法即可得$d$,又由$c^d\equiv m({\rm mod}\ n)$可知對$(c,d,n)$使用Square-and-Multiply算法即可得$m$(此處也說明$d$必須是正數)。
例題
對密文$c$在RSA中進行解密,已知
1 | p=92848022024833655041372304737256052921065477715975001419347548380734496823522565044177931242947122534563813415992433917108481569319894167972639736788613656007853719476736625612543893748136536594494005487213485785676333621181690463942417781763743640447405597892807333854156631166426238815716390011586838580891 |
使用代碼
1 | print(tsa_2(p,q,e,c)) |
可得
1 | m=6307076265101868022401168220914091002094923647543913608078494521549403802210173444891094505706734673093765283572976861935581726849816923593651509857540611964713018709162664925976240947063856932023113689107118569968804329173281583483592095382533613111762918421362278333322916021933519728291798749842494918068962745956079827474452589542646246101220774107235973703726237733253085312380677531524226610656535104841419537111452876626825419473934925741346089252331195249707094812401729770078951956524070871949864300367817846976007250758036392548367298788322489841149673899984125317729640492807125318100997973696848942216291 |