目录
RSA算法的理解
(参考信息安全工程师教程RSA算法)
使用例子进行加强理解:设素数p=3,q=17,并令e=13
第一步:计算n(两个素数的乘积p*q)
n=p*q=3*17=51
得到公钥 n=51,e=13
第二步:计算欧拉函数t=(p-1)(q-1)和密钥d
t=(p-1)*(q-1)=2*16=32
扩展欧几里得算法求逆:
d*e=1mod t【使用扩展欧几里得算法求逆】
参考下图(信息安全数学书上的扩展欧几里得算法)
第三步:假设Bob的公开密钥为e=13,n=51(上面求出)
Alice发送明文“2”给Bob
加密算法:
C=M^e mod n = 2^13 mod 51 = 32
解密算法:
M=C^d mod n = 32^5 mod 51 = 2
代码实现:
"""
RSA加密解密原理:
(1).选择两个不同的大素数p、q(目前两个数的长度都接近512bit是安全的);
(2). 计算n = p*q。
(3). 计算n的欧拉函数 t=(p-1)(q-1)。
(4). 选择整数e作为公钥,使e与t互素,且1<e< t。
(5). 用[欧几里得算法计算]d作为私钥,使d*e=1 mod t。
(6). 加密:C=M^e mod n
(7). 解密:M=C^d mod n=(M^e)^d mod n= M^e^d mod n
"""
import timeit
from math import sqrt
global isprime # 定义全局变量,在prime系统不出现灰色波浪线
# 判断是否为素数
def prime(num):
global isprime
if num <= 1:
return False
for item in range(2, int(sqrt(num) + 2)): # 本身加1但考虑特殊情况2,所以进行加2
if num % item == 0:
return False
return True
# 扩展欧几里得求解逆元
def extend(a, b):
# a为模数,b为求逆数(可以这样理解a为大数,所求的逆元为s1,b为小数,所求的逆元为t1)
s1 = 1
s2 = 0
t1 = 0
t2 = 1
while b != 0:
temp = b
c = a // b
# 计算大数的逆
s0 = s1
s1 = s2
s2 = s0 - (c * s1)
# 计算小数的逆
t0 = t1
t1 = t2
t2 = t0 - (c * t1)
b = a % b
a = temp
return t1
# 加密算法
def encryption(c1, n1, e1):
c2 = (c1 ** e1) % n1
return c2
# 解密算法
def decode(c1, n1, d1):
m1 = (c1 ** d1) % n1
return m1
if __name__ == '__main__':
# 从键盘输入两个数,判断是否为素数,如果是则输入第二个素数如果不是则重新输入
# 第一步:生成两个大素数p和q
p = 0
q = 0
for i in range(1, 4):
p = int(input('请输入第一个素数p:'))
if prime(p) is True:
print(f'{p}这个数是素数')
break
elif prime(p) is False:
print(f'{p}这个数不是素数!请重新输入')
for i in range(1, 4):
q = int(input('请输入第二个素数q:'))
if prime(q) is True:
print(f'{q}这个数是素数')
break
elif prime(q) is False:
print(f'{q}这个数不是素数!请重新输入')
e = int(input('请输入公钥e:'))
print('公钥为:e=' + str(e))
# 第二步:计算这两个数p和q的乘积
n = p * q
print('两个素数乘积为:n=' + str(n))
# 第三步:计算n的欧拉函数t=(p-1)(q-1),模数
t = (q - 1) * (p - 1)
print('欧拉函数值为:t=' + str(t))
# 使用扩展欧几里得算法进行求逆运算
d = extend(t, e)
print('产生的密钥为:d=' + str(d))
print('') # 进行换行,为了美观
print('--------------开始进行加密---------------')
# 加密:
c = int(input('请输入你所要发送的明文M,进行加密:M='))
c3 = encryption(c, n, e)
print('------>正在进行加密------>\n发送给你的密文为:', encryption(c, n, e))
print('') # 进行换行,为了美观
print('--------------开始进行解密---------------')
# 解密:
m = int(input('收到密文C,用自己的私钥进行解密:d='))
print('------>正在进行解密------>\n解密成功!密文为:', decode(c3, n, m))
本篇文章只是自己对于RSA算法的理解,如有错误请大家指出!