python实现RSA算法

目录

RSA算法的理解

扩展欧几里得算法求逆

代码实现


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算法的理解,如有错误请大家指出!

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Yangfanqihang_1

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值