RSA加密演算法
RSA加密演算法
RSA數學基礎
整除
如果 a 整除 b ,記為 a|b 。
若c = k1*a + k2 *b ,e|a 且 e|b , 則 e|c
最大公因子
所有同時整除 和 的整數中,最大的那個,稱為 和 的最大公因子,記為 (a,b)
歐幾里得演算法(輾轉相除法)
def gys(a, b):
if b == 0:
return a
return gys(b, a % b)
print( gys(8,4) )
擴充套件歐幾里得演算法
def egcd(a, b): if b == 0: return a, 1, 0 gcd, k1, k2 = egcd(b, a % b) return gcd, k2, k1 - a / b * k2 # 擴充套件歐幾里得演算法 # k1 * a + k2 * b =(a,b) print(f"公因數、k1、k2分別為:") print( egcd(13,4) )
互素
最大公因子的最小可能取值是1,當 (a,b) = 1 ,即a和b的最大公因子為1時,我們稱a和b互素。
乘法逆元
同餘定理:給定一個正整數m,如果兩個整數a和b滿足a-b能夠被m整除,即(a-b)/m得到一個整數,那麼就稱整數a與b對模m同餘,記作a≡b(mod m)。對模m同餘是整數的一個等價關係。
若a ≡ 0 (mod m),則 m|a;
例如:26 ≡ 2(mod 12)
(26 - 2)/ 12 = 2 能被整除
如果 ax ≡ 1 (mod p),且 gcd (a,p) = 1 (即 a與p互質),則稱a關於模p的乘法逆元為x。
法一:利用擴充套件歐幾里得演算法
首先模就是餘數,比如 12 % 5 = 12 - 52 = 2,18 % 4 =18 - 44 = 2。
那麼 ax≡1 (mod p) => ax % p = 1% p => ax - yp = 1 。
若把y前的符號變成 + 的形式就是ax+py=1,為方便理解下面我們把p寫成b就是ax+by=1。
就表示x是a的模b乘法逆元,y是b的模a乘法逆元。
例如,求5關於模14的乘法逆元:
(5,14) = 1 互素
5x ≡ 1 (mod 14)
5x - y14 = 1
所以x = 3 , y = 2 所以 3是5關於模14的乘法逆元
尤拉函式
就是對於一個正整數n,小於n且和n互質的正整數(包括1)的個數,記作φ(n) 。
尤拉函式的通式:
其中p1, p2……pn為n的所有質因數,n是不為0的整數。φ(1)=1(唯一和1互質的數就是1本身)。
舉例說明:
φ(10)=10×(1-1/2)×(1-1/5)=4; 10的質因數為2,5;
φ(30)=30×(1-1/2)×(1-1/3)×(1-1/5)=8; 30的質因數為2,3,5;
φ(49)=49×(1-1/7)=42。 49的質因數為7
尤拉定理
尤拉定理推論
這個結論就有意思了, a 經過若干次冪再模 n 後又等於 a。
如果我們能把這個操作拆成兩步,第一步不就是相當於加密,第二步不就相當於是解密!