[密码学]:RSA

本文介绍了扩展欧几里得算法用于求解模逆元,以及Rabin_Miller素性测试算法。通过随机生成大数并进行素性检测,确保加密过程中使用的为大素数。接着,利用这些大素数进行RSA加密,展示公钥和私钥的生成过程,并实现数字明文到密文的转换。最后,程序演示了如何解密回原始明文,确保加密系统的安全性。
摘要由CSDN通过智能技术生成

一、简述

在这里插入图片描述

二、基础知识

1、扩展欧几里得求逆元:
假设a>b;
1、若b=0,则gcd(a,b)=a,得到x=1,y=0;
2、若ab!=0
有ax1+by1=gcd(a,b);
bx2+(a%b)y2=gcd(b,a%b);
由欧几里得算法可得:gcd(a,b)=gcd(b,a%b);

即有:
ax1+by1=bx2+(a%b)y2;
即,ax1+by1=bx2+[a-(a/b)b]y2=ay2+bx2-b(a/b)y2;

由a、b系数相等得:
x1=y2,
y1=x2-(a/b)y2;
这样通过求解x2,y2来得到x1,y1。

2、rabin_miller算法
在这里插入图片描述
在这里插入图片描述

三、 代码

import random


def rabin_miller(num):  # rabin_miller算法
    if (num % 2 == 0):
        return False
    s = num - 1
    t = 0
    while s % 2 == 0:
        s = s // 2
        t += 1

    for trials in range(5):
        a = random.randrange(2, num - 1)
        v = pow(a, s, num)
        if v != 1:
            i = 0
            while v != (num - 1):
                if i == t - 1:
                    return False
                else:
                    i = i + 1
                    v = (v ** 2) % num
    return True


def set_prime(size):
    while (1):
        n = random.randrange(2 ** (size - 1), 2 ** size)  # 随机生成大数
        if (rabin_miller(n)):  # 使用素性检测
            return n


def gcd(a, b):  # 求最大公约数
    if (a < b):
        temp = a
        a = b
        b = temp
    if (a % b != 0):
        return gcd(b, a % b)
    else:
        return b


def ext_gcd(a, b):  # 扩展欧几里得算法
    if b == 0:
        x1 = 1
        y1 = 0
        return a, x1, y1
    else:
        r, x1, y1 = ext_gcd(b, a % b)
        x = y1
        y = x1 - a // b * y1
        return r, x, y


def encrypt():
    size = int(input("请输入大素数大小(bit):"))
    p = set_prime(size)
    q = set_prime(size)
    N = p * q  # N
    fai_N = (p - 1) * (q - 1)
    e = 65537  # 公钥
    if (gcd(e, fai_N) == 1):
        print("e与fai_N互质")
        r, x, y = ext_gcd(e, fai_N)
        while (x < 0):
            x += fai_N
        d = x  # 密钥
        print("私钥d:" + str(d))
        m = int(input("请输入数字明文:"))
        c = pow(m, e, N)  # 密文
        print("密文:" + str(c))
        print("明文:" + str(pow(c, d, N)))
    else:
        print("e与fai_N不互素,程序结束")


encrypt()

测试

在这里插入图片描述

引用:
Miller-Rabin素性测试算法详解

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值