Python:利用math和random模块实现RSA加密算法
实验五报告: 利用math和random模块实现RSA加密算法
实验目标
本实验的主要目标是熟悉RSA(Rivest-Shamir-Adleman)密码算法的编写,其中包括求最大公因子、模逆的扩展欧几里得算法、素性检测算法、生成大素数、生成RSA公私钥对以及RSA加密和解密。
实验要求
通过编写Python代码,实现以下功能:
- 编写一个函数用于求两个数的最大公因子(最大公约数)。
- 编写一个函数用于计算模逆的扩展欧几里得算法。
- 编写rabin-miller素性检测算法函数。
- 编写一个函数用于生成大素数。
- 编写一个函数用于生成RSA公私钥对。
- 编写RSA加密和解密函数。
实验内容
1. 求最大公因子的函数
运用辗转相除法
def find_gcd(a, b):
while b:
a, b = b, a % b # 辗转相除法
return a
# 输入两个数
num1 = int(input("输入第一个数: "))
num2 = int(input("输入第二个数: "))
# 调用函数并打印结果
gcd = find_gcd(num1, num2)
print("最大公因子是:", gcd)
2. 计算模逆的扩展欧几里得算法函数
a存在模m的逆元的条件是a和m互质,使用扩展欧几里得算法可以得到\(xa+ym=1\),对等式两边同时\(modm\)得\(xa(modm)=1\),\(x\)即为a模m的逆元\(a^{-1}\)
def extended_gcd(a, m):
if m == 0:
return (a, 1, 0)
else:
gcd, x, y = extended_gcd(m, a % m)
return (gcd, y, x - (a // m) * y)
def mod_inverse(a, m):
gcd, x, y = extended_gcd(a, m)
if gcd != 1:
raise ValueError("模逆不存在,因为a和m不互质")
else:
return x % m
3. rabin-miller素性检测算法函数
Rabin-Miller算法基于费马小定理和二次剩余的性质,以随机性为基础来进行检测。它的基本思想是:如果一个整数 n 是合数(非素数),那么对于大多数随机选择的整数 a,它的幂次 a^n-1 与 1 在模 n 意义下不相等。但如果 n 是素数,那么这个性质将在所有整数 a 下都成立
import random
def is_prime_rabin_miller(n, k=5):
if n <= 1:
return False
if n <= 3:
return True
# 将 n-1 分解成形式 2^k * m
m, k = n - 1, 0
while m % 2 == 0:
m //= 2
k += 1
# 进行 k 次检测
for _ in range(k):
a = random.randint(2, n - 2) # 随机选择 a,保证 1 < a < n-1
x = pow(a, m, n)
if x == 1 or x == n - 1:
continue
for _ in range(k - 1):
x = pow(x, 2, n)
if x == n - 1:
break
else:
return False # n 被判定为合数
return True # n 可能是素数
n = input("请输入一个数:")
if is_prime_rabin_miller(n):
print(f"{n} 是素数")
else:
print(f"{n} 不是素数")
4. 生成大素数的算法函数
使用python中的Random模块生成一个指定比特位数的随机数,并用rabin miller算法判断该随机数是否为素数。
def get_big_prime(bit_length):
while True:
candidate = random.getrandbits(bit_length) # 随机生成一个指定比特长度的随机数
# 确保生成的候选数是奇数,并且是素数
candidate |= 1 # 设置最低位为1,确保是奇数
if is_prime_rabin_miller(candidate): # 使用rabin miller 算法检测该随机数是否为素数
return candidate
5. 生成RSA公私钥对的函数
- 首先生成两个大素数\(p\)、\(q\)
- 然后计算\(n+p\times q\),以\(n\)作为RSA加密的模数
- 选取一个比\(n\)小且与\(n\)互质的数作为加密指数\(e\)
- 解密指数\(d\)满足\(ed(mod\varphi(n))\equiv1\),\(\varphi(n)\)为欧拉函数
def generate_rsa_key_pair(bit_length):
p = get_big_prime(bit_length)
q = get_big_prime(bit_length)
n = p * q
phi = (p - 1) * (q - 1)
e = 65537
d = mod_inverse(e, phi)
return ((n, e), (n, d))
6. RSA加密和解密函数
设c为密文,m为明文
RSA加密:\(c=m^e(mod n)\)
RSA解密:\(m=c^d(modn)\)
def rsa_encrypt(m,pubic_key):
n,e = pubic_key
c = pow(m,e,n)
return c
def rsa_decrypt(c,private_key):
n,d = private_key
m = pow(c,d,n)
return m
结论
通过本次实验,我们成功实现了RSA密码算法的关键组件,包括最大公因子的计算、模逆的扩展欧几里得算法、素性检测、生成大素数、生成RSA公私钥对以及RSA加密和解密。这些组件是构建一个安全的RSA加密系统所必需的,并在密码学领域具有广泛的应用。
Python:利用math和random模块实现RSA加密算法的更多相关文章
- python数学math和random模块
math模块 关注公众号"轻松学编程"了解更多. 在使用math模块时要先导入 # 导入模块 import math 1.math.ceil(num) 对num进行向上取整 num ...
- Python基础系列讲解——random模块随机数的生成
随机数参与的应用场景大家一定不会陌生,比如密码加盐时会在原密码上关联一串随机数,蒙特卡洛算法会通过随机数采样等等.Python内置的random模块提供了生成随机数的方法,使用这些方法时需要导入ran ...
- Python 入门之 内置模块 -- random模块
Python 入门之 内置模块 -- random模块 1.random模块 import random # random -- 随机数 (1)选择1-50之间随机的整数 print(random.r ...
- Python测试开发之random模块
random模块是一个生成随机数.随机字符的模块,平时被使用的也非常多,下面是random模块的常用方法: random.random()生成一个0-1的随机小数,如果想要对随机小数保留两位小数,可以 ...
- 小白的Python之路 day5 random模块和string模块详解
random模块详解 一.概述 首先我们看到这个单词是随机的意思,他在python中的主要用于一些随机数,或者需要写一些随机数的代码,下面我们就来整理他的一些用法 二.常用方法 1. random.r ...
- python标准库之random模块
Python中的random模块用于生成随机数. 下面具体介绍random模块的功能: 1.random.random() #用于生成一个0到1的 随机浮点数:0<= n < 1.0 1 ...
- python学习 生成随机函数 random模块的用法
random模块是用于生成随机数 常用函数 函数 含义 random() 生成一个[0,1.0)之间的随机浮点数 uniform(a,b) 生成一个a到b之间的随机浮点数 randint(a,b) 生 ...
- 第12.4节 Python伪随机数数生成器random模块导览
random模块实现了各种分布的伪随机数生成器,常用功能包括: random.seed(a=None, version=2):初始化随机数生成器,如果 a 被省略或为 None ,则使用当前系统时间. ...
- python第八课——random模块的使用
2.2.如何获取随机整数值? 引入random模块的使用 randint(a,b)函数:作用:返回给程序一个[a,b]范围内的随机整数注意:含头含尾闭区间 思路步骤: 第一步:导入random模块到相 ...
- Python 学习笔记之random 模块
要使用Random 模块里的一些随机数方法需要先导入random 模块. 下面是几种常用的随机数方法: 以生成随机8位密码,包括大小写字母,数字为例 pwd = ''.join(random.samp ...
随机推荐
- 树莓派4B-细分驱动步进电机
树莓派4B-细分驱动步进电机 项目介绍 利用4B树莓派控制步进电机转动,精度可达:0.0144度 (即360度/25000) 适用于非常精密的角度转动. 舵机的精度为1度,无法实现超高精度控制. 硬件 ...
- Unity的OnOpenAsset:深入解析与实用案例
Unity OnOpenAsset 在Unity中,OnOpenAsset是一个非常有用的回调函数,它可以在用户双击资源文件时自动打开一个编辑器窗口.这个回调函数可以用于自定义资源编辑,提高工作效率. ...
- ChatGPT的探索与实践-业务应用篇
本篇文章主要介绍在实际的开发过程当中,如何使用GPT帮助开发,优化流程,恰逢今年京东20周年庆,文末会介绍如何与618大促实际的业务相结合,来提升应用价值.全是干货,且本文所有代码和脚本都是利用GPT ...
- 2023年郑州轻工业大学校赛邀请赛mjh
首先,很感谢老师的信任,选择我去参加此次比赛:其次,感谢wh,wyh两位队友的全程带飞.此次比赛是我第一次参加线下的比赛活动,内心难免激动与紧张. 比赛开始,队友直接找到了签到题进行解答,而我拿到了看 ...
- Redis集群搭建之三大模式
一.简介: Redis 是一个开源的 key-value 存储系统,由于出众的性能,大部分互联网企业都用来做服务器端缓存.Redis 在3.0版本前只支持单实例模式,虽然支持主从模式.哨兵模式部署来解 ...
- Blazor阻止冒泡传播
在你的组件的外面套上一个div,并添加@onclick:stopPropagation="true" <div @onclick:stopPropagation=" ...
- Builder 生成器模式简介与 C# 示例【创建型2】【设计模式来了_2】
〇.简介 1.什么是生成器模式? 一句话解释: 在构造一个复杂的对象(参数多且有可空类型)时,通过一个统一的构造链路,可选择的配置所需属性值,灵活实现可复用的构造过程. 生成器模式的重心,在于分离 ...
- C# 多线程访问之 SemaphoreSlim(信号量)【进阶篇】
SemaphoreSlim 是对可同时访问某一共享资源或资源池的线程数加以限制的 Semaphore 的轻量替代,也可在等待时间预计很短的情况下用于在单个进程内等待. 由于 SemaphoreSlim ...
- 简述分布式链路追踪工具——Jaeger
1.简介 1.1 Jaeger是什么 Jaeger 是受到 Dapper 和 OpenZipkin 启发的由 Uber Technologies 作为开源发布的分布 ...
- [kafka]部署安装单节点
前言 kafka 3.0之前的版本需要依赖zookeeper,3.0版本之后可不依赖zookeeper. 基于zookeeper的安装步骤 节点IP:172.50.13.103 kafka版本:2.7 ...