RSA和模幂算法实验python并给代码注释
时间: 2024-05-01 10:19:34 浏览: 14
好的,下面是RSA和模幂算法的实现代码,并附有注释:
``` python
# 导入math库,用于对数学运算的支持
import math
# RSA加密函数
def rsa_encrypt(msg, p, q, e):
# 计算N,N = p * q
n = p * q
# 计算phi_N,phi_N = (p-1) * (q-1)
phi_n = (p - 1) * (q - 1)
# 求e关于phi_N的乘法逆元d,即满足 e*d = 1 mod(phi_N) 的d
d = modinv(e, phi_n)
# 将明文转换为数字message
message = text_to_num(msg)
# 对明文进行加密,密文c = message^e mod N
c = pow(message, e, n)
# 返回加密后的密文
return c
# RSA解密函数
def rsa_decrypt(c, p, q, e):
# 计算N,N = p * q
n = p * q
# 计算phi_N,phi_N = (p-1) * (q-1)
phi_n = (p - 1) * (q - 1)
# 求e关于phi_N的乘法逆元d,即满足 e*d = 1 mod(phi_N) 的d
d = modinv(e, phi_n)
# 对密文进行解密,明文message = c^d mod N
message = pow(c, d, n)
# 将数字转换为明文
msg = num_to_text(message)
# 返回解密后的明文
return msg
# 模幂运算函数
def modpow(a, b, n):
# 将指数b转换为2进制形式,方便进行快速幂运算
b = bin(b)[2:]
# 对快速幂算法要用到的变量x进行初始化
x = a % n
# 对指数b进行倒序迭代
for i in range(len(b)-2, -1, -1):
# 如果当前位为1,则将当前余数乘上原数,再对n取余,得到新余数
if b[i] == '1':
x = (x * a) % n
# 将原数自乘,再对n取余,得到新原数
a = (a * a) % n
# 返回最终运算结果
return x
# 扩展欧几里得算法函数,用于求出两个数x和y的最大公因数g以及满足ax + by = g中的一组解(x0, y0)
def egcd(a, b):
if a == 0:
return b, 0, 1
else:
g, y, x = egcd(b % a, a)
return g, x - (b // a) * y, y
# 求a关于模m的乘法逆元a^-1函数
def modinv(a, m):
g, x, y = egcd(a, m)
if g != 1:
raise Exception('Modular inverse does not exist')
else:
return x % m
# 将文本转为数字函数
def text_to_num(msg):
# 将文本字符串转换为ASCII码列表
ascii_lst = [ord(c) for c in msg]
# 将ASCII码列表用数字串表示
num_str = ''.join([str(c) for c in ascii_lst])
# 将数字串转换为int类型数字
num = int(num_str)
# 返回数字
return num
# 将数字转为文本函数
def num_to_text(num):
# 将数字转换为字符串类型
num_str = str(num)
# 将数字字符串按照3位一组拆分成多个数字
num_lst = [int(num_str[i:i+3]) for i in range(0, len(num_str), 3)]
# 将数字列表转换为对应的ASCII字符列表
ascii_lst = [chr(n) for n in num_lst]
# 将ASCII字符列表拼接成文本字符串
msg = ''.join(ascii_lst)
# 返回文本
return msg
```