实验五报告: 利用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. (内附示例源码)如何通过electron构建桌面跨平台音视频应用

    近年来,视频直播.直播带货.在线教育.在线医疗等音视频领域的相关行业都非常热门,成为大众瞩目的焦点. 在不久的将来,音视频技术渗透于各行各业,无处不在.从IoT网络到个人用户的移动设备,音视频技术以不 ...

  2. ISP-AF相关-聚焦区域选择-清晰度评价

    1.镜头相关 镜头类型 变焦类型: 定焦.手动变焦.自动变焦 光圈: 固定光圈.手动光圈.自动光圈 视场角: 鱼眼镜头.超广角镜头.广角镜头.标准镜头.长焦镜头.超长焦镜头(由大至小) 光圈: 超星光 ...

  3. Hexo博客Next主题配置加载优化性能提升

    主题源加载优化 把在NexT主题的_config.yml里面的: # Uri of fonts host. E.g. //fonts.googleapis.com (Default) host: 改为 ...

  4. 揭秘 .NET 中的 TimerQueue(上)

    前言 TimerQueue 是.NET中实现定时任务的核心组件,它是一个定时任务的管理器,负责存储和调度定时任务.它被用于实现很多 .NET 中的定时任务,比如 System.Threading.Ti ...

  5. 带你掌握利用Terraform不同数据源扩展应用场景

    本文分享自华为云社区<利用Terraform不同数据源扩展应用场景>,作者: kaliarch . 一 背景 在生产环境中使用Terraform进行基础设施编排,通常又一些信息是通过其他外 ...

  6. Redis的设计与实现(5)-整数集合

    整数集合(intset)是集合键的底层实现之一: 当一个集合只包含整数值元素, 并且这个集合的元素数量不多时, Redis 就会使用整数集合作为集合键的底层实现. 整数集合 (intset) 是 Re ...

  7. XCTF-CGfsb

    考察知识点 PWN.格式化字符串漏洞 题目链接 https://adworld.xctf.org.cn/task/answer?type=pwn&number=2&grade=0&am ...

  8. pandas取出包含某个值的所有行

    pandas取出包含某个值的所有行df = df[df["from_account"].str.contains("fcwhx")] pandas取出不包含某个 ...

  9. bash: pip3:未找到命令

    输入以下命令: 1 sudo apt-get install python3-pip 参考链接: https://www.cnblogs.com/banshaohuan/p/10963547.html

  10. __wakeup()魔术方法绕过(CVE-2016-7124)

    __wakeup()魔术方法绕过(CVE-2016-7124) 漏洞简介 在php反序列化数据过程中,如果类中存在__wakeup方法,调用 unserilize() 方法前则先调用__wakeup方 ...