实验五报告: 利用math和random模块实现RSA加密算法

实验目标

本实验的主要目标是熟悉RSA(Rivest-Shamir-Adleman)密码算法的编写,其中包括求最大公因子、模逆的扩展欧几里得算法、素性检测算法、生成大素数、生成RSA公私钥对以及RSA加密和解密。

实验要求

通过编写Python代码,实现以下功能:

  1. 编写一个函数用于求两个数的最大公因子(最大公约数)。
  2. 编写一个函数用于计算模逆的扩展欧几里得算法。
  3. 编写rabin-miller素性检测算法函数。
  4. 编写一个函数用于生成大素数。
  5. 编写一个函数用于生成RSA公私钥对。
  6. 编写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加密算法的更多相关文章

  1. python数学math和random模块

    math模块 关注公众号"轻松学编程"了解更多. 在使用math模块时要先导入 # 导入模块 import math 1.math.ceil(num) 对num进行向上取整 num ...

  2. Python基础系列讲解——random模块随机数的生成

    随机数参与的应用场景大家一定不会陌生,比如密码加盐时会在原密码上关联一串随机数,蒙特卡洛算法会通过随机数采样等等.Python内置的random模块提供了生成随机数的方法,使用这些方法时需要导入ran ...

  3. Python 入门之 内置模块 -- random模块

    Python 入门之 内置模块 -- random模块 1.random模块 import random # random -- 随机数 (1)选择1-50之间随机的整数 print(random.r ...

  4. Python测试开发之random模块

    random模块是一个生成随机数.随机字符的模块,平时被使用的也非常多,下面是random模块的常用方法: random.random()生成一个0-1的随机小数,如果想要对随机小数保留两位小数,可以 ...

  5. 小白的Python之路 day5 random模块和string模块详解

    random模块详解 一.概述 首先我们看到这个单词是随机的意思,他在python中的主要用于一些随机数,或者需要写一些随机数的代码,下面我们就来整理他的一些用法 二.常用方法 1. random.r ...

  6. python标准库之random模块

    Python中的random模块用于生成随机数. 下面具体介绍random模块的功能: 1.random.random() #用于生成一个0到1的 随机浮点数:0<= n < 1.0 1 ...

  7. python学习 生成随机函数 random模块的用法

    random模块是用于生成随机数 常用函数 函数 含义 random() 生成一个[0,1.0)之间的随机浮点数 uniform(a,b) 生成一个a到b之间的随机浮点数 randint(a,b) 生 ...

  8. 第12.4节 Python伪随机数数生成器random模块导览

    random模块实现了各种分布的伪随机数生成器,常用功能包括: random.seed(a=None, version=2):初始化随机数生成器,如果 a 被省略或为 None ,则使用当前系统时间. ...

  9. python第八课——random模块的使用

    2.2.如何获取随机整数值? 引入random模块的使用 randint(a,b)函数:作用:返回给程序一个[a,b]范围内的随机整数注意:含头含尾闭区间 思路步骤: 第一步:导入random模块到相 ...

  10. Python 学习笔记之random 模块

    要使用Random 模块里的一些随机数方法需要先导入random 模块. 下面是几种常用的随机数方法: 以生成随机8位密码,包括大小写字母,数字为例 pwd = ''.join(random.samp ...

随机推荐

  1. Java扩展Nginx之六:两大filter

    欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 本篇概览 本文是<Java扩展Nginx> ...

  2. 通过Jmeter压测存储过程

    通过Jmeter压测存储过程 一.存储过程准备: 1.建立一个空表: CREATE TABLE test_data ( id NUMBER, name VARCHAR2(50), age NUMBER ...

  3. Spring—bean的作用域

    beans的作用域 单例模式(Spring默认模式) <?xml version="1.0" encoding="UTF-8"?> <bean ...

  4. Cilium系列-5-Cilium替换KubeProxy

    系列文章 Cilium 系列文章 前言 将 Kubernetes 的 CNI 从其他组件切换为 Cilium, 已经可以有效地提升网络的性能. 但是通过对 Cilium 不同模式的切换/功能的启用, ...

  5. js闭包的一些笔记

    闭包 闭包是一个可以访问外部作用域的内部函数,即使这个外部作用域已经执行结束 作用域 作用域决定这个变量的生命周期及其可见性.当我们创建一个函数,就会生成一个新的作用域. 通过var创建的变量只有函数 ...

  6. 树形DP + 换根DP

    树形DP--基础 P1352 没有上司的舞会 设 \(f[i][0/1]\) 表示第 \(i\) 个人不去或者去. 如果第 \(i\) 个人没去,那么下属可去可不去,所以 \(f[i][0] = \s ...

  7. Linux-基本常用命令2

    cat  查看文件内容 cat -n  查看文件内容并且显示行数 more 用vi的形式查看文件内容 less  类似于vim查看文件内容 echo 输出内容到控制台 echo -e  支持反斜线控制 ...

  8. 下一代MES系统架构分析与选型参考

    本文分享自华为云社区<工业互联网系列(十一):下一代MES系统架构分析与选型参考>,作者:云起MAE . 目前国内制造执行系统MES市场尚处于"功能机"混战年代,市场集 ...

  9. [ABC128D] equeue

    2023-01-14 题目 题目传送门 翻译 翻译 难度&重要性(1~10):4 题目来源 AtCoder 题目算法 暴力,贪心 解题思路 由题意可以得出,数据只有 \(n \leq 50,k ...

  10. 【Ubuntu】Ubuntu 配置记录

    目录 系统文件夹改回英文 Ubuntu 镜像 pypi 镜像 临时使用 设为默认 Doxygen + Graphviz 分析代码并画图 Graphviz 安装 Doxygen 安装 配置 运行 系统文 ...