RSA加密算法

加密步骤如下图所示

1、选择一堆不相等且足够大的质数 p 和 q

2、计算 p 和 q 的乘积 n = p * q

3、计算 n 的欧拉函数 ϕ(n)=(p-1)*(q-1)

欧拉函数 ϕ(n):统计 小于n 的所有和 n 互指的数的个数。

注意:这里说的互质的数包括1

例如:ϕ(6)=2,小于 6 的数有 [1,2,3,4,5] ,和 6 有公因数的数有 [2,3,4],和 6 互质的数有 [1,5] ,所以 ϕ(6)=2

质数的欧拉函数为质数本身减一

例如:ϕ(7)=6,小于 7 的数有 [1,2,3,4,5,6] ,这些数都和 7 互质,所以 ϕ(7)=6

因为 p 和 q 均为质数,所以 ϕ(n)= ϕ(p) ϕ(q) = (p-1) (q-1)

4、选一个与 ϕ(n) 互质的整数 e ( 1 < e < ϕ(n) ,e通常取 65537 )

5、计算出 e 对于 ϕ(n) 的模反元素 d ( d*e mod ϕ(n) = 1 )

模反元素的计算需要通过扩展欧几里得算法实现,最后算出的 d 为 e 的系数
# 通过python函数实现扩展欧几里得算法,结果返回为(最大公因数,x,y) , a*x + b*y = gcd(a,b) , gcd(a,b)为a和b的最大公因数
def extended_gcd1(a,b):    # 扩展欧几里得算法,通过循环实现
    old_s=t=1
    old_t=s=0
    old_r=a
    r=b
    while r!=0:
        q=old_r//r
        old_s,s=s,old_s-s*q
        old_t,t=t,old_t-t*q
        old_r,r=r,old_r%r
    return (old_r,old_s,old_t)

6、加解密

明文为 m

密文为 c

加密算法 ( e , n )

加密算法需要知道 e 和 n

计算方法: me mod n = c

m的e次方 模n 得到密文c

# python 代码表示为
c = m ** e % n

解密算法 ( d , n )

解密算法需要知道 d 和 n,要求出 d 就需要知道 p 和 q,通过欧拉函数计算出 ϕ(n)=(p-1)*(q-1) ,再通过扩展欧几里得算法求出 e 的系数 d

计算方法: cd mod n = m

c的d次方 模n 得到明文m

# python 代码表示为
m = c ** d % n 

以上就是RSA加解密的过程及其原理


加密:已知 m=3194 , 选 p=976643 , q=565583 , e=65537,求密文 c

解:先根据已知条件p,q求出 n ,再通过明文模 n 最后得到密文 c

n = p * q = 976643 * 565583 = 552372677869

c = m ** e % n = 3194 ** 65537 % 552372677869 = 348234702383


解密:已知 c=348234702383 ,p=976643 , q=565583 ,e=65537,求明文m

解:现根据已知条件 p 和 q 求出 n 和 ϕ(n) ,再通过 e 和 ϕ(n) 求出 d,最后通过 d 和 n 求出明文 m

n = p * q = 976643 * 565583 = 552372677869

ϕ(n)=(p-1)(q-1) = 976642 565582 = 552371135644

通过扩展欧几里得算法求出 e 的系数 d = 211173212133

m = c d % n = 348234702383 211173212133 % 552372677869 = 3194


以上两个例子就是加密和解密的过程了。