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 ...
随机推荐
- 深入浅出security学习笔记
第一章 导入web和security依赖,然后默认提供了一个基于内存的UserDetailsServiceAutoConfiguration如下 会读取写入的user配置,SecurityProper ...
- 一张表实现类某音的视频"评论回复"功能
前言 现如今,不管是哪种类型的应用,评论区都少不了.从工具类的到媒体信息流类的,评论留言都是最基本的互动环节.比如抖音短视频下,针对视频每个用户都可以发表自己的观点:而针对用户的评论,其他的用户又可 ...
- 2023ccpc大学生程序设计竞赛-wmh
这算是我第一次参加这种团队赛,感谢程老师给我这个机会.刚开赛还算比较顺利,一眼看出来A是个签到,拿下之后开始跟榜F题.一开始想法比较简单,就是排序,记录相邻两个数的差,然后再排序.wa了后以为是范围出 ...
- Oracle分区表设置详解
Oracle分区表详解 Oracle建议单表超过2G就需要进行分表,一万数据大概3MB,单表最多分区为1024*1024-1个分区,我感觉够我们使用了哈 废话不多说,上示例,Oracle分表具体sql ...
- iptables简要介绍及使用iptables实践NAT技术
简介 iptables的文章多如牛毛,但是,我读了一些,发现虽然成体系,但是不便理解,今天就结合自己的理解,好好讲解下,另外,我们也会使用iptables来实验一个nat地址转换的demo,nat转换 ...
- 如何编写难以维护的React代码?——滥用useEffect
如何编写难以维护的React代码?--滥用useEffect 在许多项目中,我们经常会遇到一些难以维护的React代码.其中一种常见的情况是滥用useEffect钩子,特别是在处理衍生状态时.让我们来 ...
- SpringBoot 启动流程分析(寻找扩展点)
1.SpringBoot maven 依赖版本 <?xml version="1.0" encoding="UTF-8"?> <project ...
- 一种flink 作业提交失败的情况描述与原因排查
遇到异常 2019-12-24 16:49:59,019 INFO org.apache.flink.yarn.YarnClusterClient - Starting client actor sy ...
- loader的三种配置方式
在这篇 webpack处理css资源 文章中使用几个常用的loader 来编译 css 代码. 但其实 loader 的配置方式不止一种,一起来看看其它方式~ 在 webpack.config.js ...
- Cilium系列-16-CiliumNetworkPolicy 实战演练
系列文章 Cilium 系列文章 前言 今天我们进入 Cilium 安全相关主题, 基于 Cilium 官方的<星球大战> Demo 做详细的 CiliumNetworkPolicy 实战 ...