import random
from random import randint
def is_prime(n):
""" 判断是否为素数 """
for i in range(2, n):
if n % i == 0:
print('此素数输入错误')
return 0
print('素数输入正确')
def primes( Min = 10 # 范围最小值
,Max = 30 # 范围最大值
,return_num = None
):
""" 生成指定范围的素数 """
Result = [] # 结果
for N in range(Min, Max): # 给自然数来个遍历
for P in range(2, N):
if (N % P == 0): # 判断是否有因数
break # 有因数那就不是质数,跳出循环
else:
Result.append(N)
if return_num != None:
if len(Result) >= return_num:
return Result
return Result
# def create_prime(start,stop):
# """ 随机生成指定范围内的素数 """
# if start < 2:
# start = 2
# for i in range(start, stop+1):
# for j in range(2, i):
# if i % j == 0:
# break
# else:
# yield i
def is_relprime(minv, maxv):
""" 判断e与oula是否互质 """
for i in range(2, minv + 1):
if minv % i == 0 and maxv % i == 0:
# print('e与oula并不互为质数')
return False
# print('e与oula互为质数')
return True
def compute_prikey(oula,e):
""" 计算私钥 d """
global d, k
k = 1
while (k * oula + 1) % e != 0:
k += 1
print(f'k={k}')
d = int((k * oula + 1) / e)
print(f'd={d}')
return d
def compute_prikey_0(oula,e,d=0):
""" 递归 计算私钥 d """
if d*e%oula == 1:
return d
else:
d += 1
return compute_prikey(oula,e,d)
p = 7
q = 17
### 验证p,q是否为素数
is_prime(p)
is_prime(q)
### 求出n的值
n = p * q
print(f'n=p*q={n}')
### 计算olua函数的值
oula = (p - 1) * (q - 1)
print(f'oula=(p - 1) * (q - 1)={oula}')
### 生成1与oula函数之的素数
num = primes(0,oula)
### 验证这些素数是否与oula函数互素,
es = []
for e in num:
if is_relprime(e,oula):
es.append(e)
### 随机抽取一个与oula互素的数作为e
e = random.choice(es)
print(f'随机质数:e={e}')
### 求出私钥d的值
d = compute_prikey(oula,e)
print(f'生成的公钥是:(n,e)=({n},{e})')
print(f'生成的私钥是:(n,d)=({n},{d})')
### 用密文测试一下加密
s = 19
print(f"需要加密的数据:{s} ")
c = (s**e)%n
print(f"您获得的密文是:{c}")
s = (c**d)%n
print(f'密文的解密结果为:{s}')
第六代加密法-RSA加密
于 2024-11-05 09:37:59 首次发布