1. 程式人生 > 其它 >RSA加密演算法

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。

如果我們能把這個操作拆成兩步,第一步不就是相當於加密,第二步不就相當於是解密!

RSA加密演算法