RSA加密
rsa加密
基礎知識:
rsa是一種非對稱加密,(有公鑰私鑰兩把不同密鑰)。
單向函數:單方向計算容易,反向難。例:x→f(x)容易,而f(x)→x難。
同余:a ≡ b (mod m)意思是a-b = mk。
推論:ab mod k = (a mod k) * (b mod k) mod k
模逆元:也稱模倒數。a-1 ≡ 1 (mod n)相當于:ab = 1 (mod n)。python中有包可以直接用來求模逆元。
模運算:
加法:3+4≡0 (mod 7) , 5+5 ≡ 3 (mod 7), 1+5 ≡ 6 (mod 7)
減法:5-2 ≡ 3 (mod 7) , 3-5 ≡ 3-5+7 ≡ 3+2 (mod 7)
乘法:3 ×4 ≡ 5 (mod 7) , 2×2 ≡ 4(mod 7)
除法:5/4 ≡ 5×4-1 ≡ 5×invert(4,7) ≡5×2 ≡ 3 (mod 7)(除法說法不嚴謹)
歐拉函數:對正整數N,歐拉函數是小于等于N的正整數中與N互質的數的數目。易知,當N數很大時,計算就很困難了,而當N的因式分解已知時,就會有簡單的方法:
例:N=240,已知240=24×3×5
則Ψ(N)=23 ×(2-1)×(3-1)×(5-1)=8×1×2×4=64
費馬小定理:假如a為一個整數,p為一個素數,則 a(p-1)≡1 (mod p)
歐拉定理:假如a和m都是整數,且gcd(a,m) = 1則有aΨ(m) ≡ 1(mod m)
(gcd:最大公約數)
費馬小定理是歐拉定理的特殊情況
RSA加密
密鑰對的產生:
①、選擇兩個大素數p、q,使得n=pq
②、計算Ψ(n) =(p-1)(q-1)
③、隨機數e,要求e與Ψ(n)互素
④、計算d滿足ed=1(mod Ψ(n))
加密:
c = me(mod n)
解密:
m = cd(mod n)
實現RSA加密
下載python中crypto包
from Crypot.Util.number import*導入包中所有函數。
getPrime()函數,括號里為參數長度,此函數用于產生一個指定長度的隨機素數。
getStrongPrime()函數,括號里為參數長度,此函數用于生成一個更安全的素數。
inverse()函數,括號有兩個參數,當兩個參數不互素的時候返回除以最大公約數后的逆元,兩個參數互素時,和gmpy2的invert返回值相同。而invert函數當兩個參數不互素時會報錯。
isPrime()函數可以用來判斷是否為素數
GCD()函數用來求最大公因數
gmpy2的iroot函數用于開n次方,兩個參數m,n,返回結果為一個數字(對m開n次方),結果為整數,和一個布爾數(結果的n次方是否剛好等于原來的數)
pow(m,e,n)函數計算m 的e次方 模n的值
pow(m,e)函數計算m的e次方
RSA相關攻擊算法
1、分解素因數攻擊
已知e,n,c,求m
m=pow(c,d,n)
d=invert(e,Ψ(n))
由于單向性,一直n并不能容易得出p q,也就不能容易得出Ψ(n)
當n的值很大時,往往不能通過枚舉法來分解因數,(而如果生成的素數是不安全的,就可能使n很容易被分解)(通常生成的素數約2048位)
有分解n的網址:
https://www.alpertron.com.ar/ECM.HTM
http://www.factordb.com/index.php
共模攻擊
如果在RSA的使用中使用了相同的模n對相同的明文m進行了加密,那么就可以在不分解n是情況下還原出明文m:
通過擴展歐幾里得算法 可以計算出:
若已知p+q或p-q或者其他pq之間的關系,則可通過方程組求得p, q進而得出Ψ(n),也可直接使用SageMath中Solve函數來解方程組:
Solve([p*q = = n,p+q = = a], [p,q])
小公鑰指數攻擊
當e很小時,則c可能不比n大多少,則可以用枚舉法來求:m^e=c+k*n
嘗試枚舉k并開根,能得到m
總結