第六代加密法-RSA加密

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}')

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值