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) 。

欧拉函数的通式:image-20211101200615072
其中p1, p2……pn为n的所有质因数,n是不为0的整数。φ(1)=1(唯一和1互质的数就是1本身)。

image-20211029233050721

举例说明:

φ(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

image-20211029233005171

欧拉定理

image-20211029233348940

欧拉定理推论

image-20211029234301618

这个结论就有意思了, a 经过若干次幂再模 n 后又等于 a。

如果我们能把这个操作拆成两步,第一步不就是相当于加密,第二步不就相当于是解密!

image-20211029235000960

RSA加密算法

image-20211029235133914

image-20211029235155091

posted @ 2021-11-01 20:03  蘑菇西餐  阅读(187)  评论(0编辑  收藏  举报