【应用密码学】实验四 公钥密码1——数学基础

一、实验要求与目的

学习快速模幂运算、扩展欧几里得、中国剩余定理的算法思想以及代码实现。

二、实验内容与步骤记录(只记录关键步骤与结果,可截图,但注意排版与图片大小)

1.快速模幂运算的设计思路

快速模幂运算的核心思想是利用二进制表示和平方乘法来减少乘法运算的次数。具体步骤如下:将指数 b 表示为二进制形式。例如,b=13 的二进制表示为 1101。

 

通过这种表示,可以将幂运算分解为若干次平方和乘法。

从最低位开始逐位处理指数的二进制表示:如果当前位是 1,将当前的 a 乘到结果中。不管当前位是 0 还是 1,都将 a 平方(即 a=a^2modm),并右移一位(相当于除以 2)。在每一步中,都对结果和中间值取模 m,以避免数值过大导致溢出。使用一个循环来处理指数的每一位。循环条件是 b>0,每次循环都将 b 右移一位,直到 b 为 0。

2.扩展欧几里得算法的设计思路:

扩展欧几里得算法是基于经典的欧几里得算法(辗转相除法)进行扩展的。欧几里得算法用于计算两个整数 a 和 b 的最大公约数(gcd(a,b)),其核心思想是利用递归关系: gcd(a,b)=gcd(b,a mod b) 直到 a mod b=0,此时 b 即为最大公约数。目标是找到整数 x 和 y,使得: ax+by=gcd(a,b) 这实际上是将最大公约数表示为 a 和 b 的线性组合。算法通过递归的方式逐步求解 x 和 y。

假设已知: gcd(b,a mod b)=b⋅x1​+(a modb)⋅y1​。根据欧几里得算法的递归关系,可以推导出:gcd(a,b)=gcd(b,a mod b)。因此: ax+by=b⋅x1​+(a mod b)⋅y1​。进一步展开 a mod b=a−b⋅⌊b/a​⌋,可以得到: ax+by=b⋅x1​+(a−b⋅⌊b/a​⌋)⋅y1​,整理后得到: x=y1​ y=x1​−⌊b/a​⌋⋅y1。当 a=0 时,递归终止,此时: gcd(0,b)=b 对应的线性组合为: 0⋅x+b⋅y=b 因此,x=0,y=1。

通过递归调用扩展欧几里得算法,逐步求解 x 和 y,直到找到满足 ax+by=gcd(a,b) 的整数解。如果 gcd(a,b)=1,则找到了满足 ax+by=1 的解。结果如下图:

3.中国剩余定理设计思路:

首先计算所有模数(除数)的乘积 M,即 M=∏i​divisor[i]。这是中国剩余定理的关键基础,因为最终的解将在这个范围内。

对于每个同余方程 x≡remainder[i] (mod divisor[i]),计算 Mi​=M/divisor[i],即 M 除以当前模数的商。然后使用 gmpy2.invert 求 Mi​ 在模 divisor[i] 下的逆元 k。根据中国剩余定理的构造方法,将每个同余方程的解表示为 remainder[i]×k×Mi​,并将所有这些项相加,得到一个可能的解 n。

最终的解 n 可能大于 M,因此通过 nmodM 取最小非负解 nmin​。返回 nmin​,即满足所有同余方程的最小非负整数解。

三、源代码记录

快速模幂运算

def fast_modular_exponentiation(a, b, m):result = 1 base = a % m  while b > 0:if b % 2 == 1:  result = (result * base) % mbase = (base * base) % m  # 将 base 平方并模 mb //= 2  # 将指数 b 右移一位(相当于除以 2)return resulta = 3
b = 13
m = 17
result = fast_modular_exponentiation(a, b, m)
print(f"{a}^{b} mod {m} = {result}")

扩展欧几里得算法

def extended_gcd(a, b):if a == 0:return (0, 1, b)else:x1, y1, gcd = extended_gcd(b % a, a)x = y1 - (b // a) * x1y = x1return (x, y, gcd)# 用户手动输入 a 和 b
a = int(input("请输入整数a: "))
b = int(input("请输入整数b: "))# 使用函数求解 ax + by = gcd(a, b)
x, y, gcd = extended_gcd(a, b)if gcd == 1:print(f"找到 x = {x}, y = {y} 使得 {a}x + {b}y = 1")
else:print(f"没有整数解,因为 gcd({a}, {b}) = {gcd} 不等于 1")

中国剩余定理

import gmpy2
divisor=[3,5,7]
remainder=[2,3,2]def CRT(divisor, remainder):mul = 1for d in divisor:mul *= d  # 计算除数列中所有元素的乘积n = 0for i in range(len(divisor)):k = gmpy2.invert(mul // divisor[i], divisor[i])n += remainder[i] * k * (mul // divisor[i])n_min = n % mulreturn n_min# 调用函数并打印结果
result = CRT(divisor, remainder)
print("The smallest solution is:", result)

四、实验思考

求两个数的最大公因数是否还有其他算法?

答:更相减损术是一种古老的求最大公因数的方法,其核心思想是通过反复相减来逐步减小两个数的大小,直到它们相等,此时的值即为最大公因数。具体操作是:每次用较大的数减去较小的数,然后用得到的差替换原来的较大数,继续进行相减操作,直到两个数相等为止。这种方法简单直观,无需复杂的数学运算,仅通过减法即可实现,特别适合于手工计算或在不支持除法运算的环境中使用。

二进制GCD算法,也称为Stein算法,是一种高效计算最大公因数的方法,它通过位运算和减法操作来逐步简化问题。算法的核心思想是利用二进制的特性,首先判断两个数是否都是偶数,如果是,则同时除以2并记录下除的次数;接着通过减法和位移操作逐步减小两个数的差距,直到它们相等,此时的值乘以之前记录的除2的次数即为最大公因数。这种方法避免了复杂的除法运算,仅使用位移和减法,特别适合在计算机中实现,因为它充分利用了计算机对二进制运算的高效处理能力。

此外还有一些其他的方法,如利用Fibonacci数列的性质、利用同余关系等,但这些方法通常只在特定情况下使用,或者作为理论研究的工具。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/78756.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

WebSocket与Socket、TCP、HTTP的关系及区别

1.什么是WebSocket及原理 WebSocket是HTML5中新协议、新API。 WebSocket从满足基于Web的日益增长的实时通信需求应运而生,解决了客户端发起多个Http请求到服务器资源浏览器必须要在经过长时间的轮询问题,实现里多路复用,是全双工、双向、单套…

基于C++的IOT网关和平台4:github项目ctGateway交互协议

初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github:codetoys,所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C++的,可以在任何平台上使用。 源码指引:github源码指引_初级代码游戏的博客-CSDN博客 系…

【PPT制作利器】DeepSeek + Kimi生成一个初始的PPT文件

如何基于DeepSeek Kimi进行PPT制作 步骤: Step1:基于DeepSeek生成文本,提问 Step2基于生成的文本,用Kimi中PPT助手一键生成PPT 进行PPT渲染-自动渲染 可选择更改模版 生成PPT在桌面 介绍的比较详细,就是这个PPT模版…

拷贝多个Excel单元格区域为图片并粘贴到Word

Excel工作表Sheet1中有两个报表,相应单元格区域分别定义名称为Report1和Report2,如下图所示。 现在需要将图片拷贝图片粘贴到新建的Word文档中。 示例代码如下。 Sub Demo()Dim oWordApp As ObjectDim ws As Worksheet: Set ws ThisWorkbook.Sheets(&…

Spring是如何传播事务的?什么是事务传播行为

Spring是如何传播事务的? Spring框架通过声明式事务管理来传播事务,主要依赖于AOP(面向切面编程)和事务拦截器来实现。Spring的事务传播机制是基于Java Transaction API (JTA) 或者本地资源管理器(如Hibernate、JDBC等…

Python-pandas-操作Excel文件(读取数据/写入数据)及Excel表格列名操作详细分享

Python-pandas-操作Excel文件(读取数据/写入数据) 提示:帮帮志会陆续更新非常多的IT技术知识,希望分享的内容对您有用。本章分享的是pandas的使用语法。前后每一小节的内容是存在的有:学习and理解的关联性。【帮帮志系列文章】:每…

PHP分页显示数据,在phpMyadmin中添加数据

<?php $conmysqli_connect(localhost,root,,stu); mysqli_query($con,"set names utf8"); //设置字符集为utf8 $sql"select * from teacher"; $resultmysqli_query($con,$sql); $countmysqli_num_rows($result); //记录总条数$count。 $pagesize10;//每…

智能参谋部系统架构和业务场景功能实现

将以一个基于微服务和云原生理念、深度集成人工智能组件、强调实时性与韧性的系统架构为基础,详细阐述如何落地“智能参谋部”的各项能力。这不是一个简单的软件堆叠,而是一个有机整合了数据、知识、模型、流程与人员的复杂体系。 系统愿景:“智能参谋部”——基于AI赋能的…

企业级RAG架构设计:从FAISS索引到HyDE优化的全链路拆解,金融/医疗领域RAG落地案例与避坑指南(附架构图)

本文较长&#xff0c;纯干货&#xff0c;建议点赞收藏&#xff0c;以免遗失。更多AI大模型应用开发学习内容&#xff0c;尽在聚客AI学院。 一. RAG技术概述 1.1 什么是RAG&#xff1f; RAG&#xff08;Retrieval-Augmented Generation&#xff0c;检索增强生成&#xff09; 是…

Spring Boot Validation实战详解:从入门到自定义规则

目录 一、Spring Boot Validation简介 1.1 什么是spring-boot-starter-validation&#xff1f; 1.2 核心优势 二、快速集成与配置 2.1 添加依赖 2.2 基础配置 三、核心注解详解 3.1 常用校验注解 3.2 嵌套对象校验 四、实战开发步骤 4.1 DTO类定义校验规则 4.2 Cont…

理清缓存穿透、缓存击穿、缓存雪崩、缓存不一致的本质与解决方案

在构建高性能系统中&#xff0c;缓存&#xff08;如Redis&#xff09; 是不可或缺的关键组件&#xff0c;它大幅减轻了数据库压力、加快了响应速度。然而&#xff0c;在高并发环境下&#xff0c;缓存也可能带来一系列棘手的问题&#xff0c;如&#xff1a;缓存穿透、缓存击穿、…

PyTorch_构建线性回归

使用 PyTorch 的 API 来手动构建一个线性回归的假设函数&#xff0c;数据加载器&#xff0c;损失函数&#xff0c;优化方法&#xff0c;绘制训练过程中的损失变化。 数据构建 import torch from sklearn.datasets import make_regression import matplotlib.pyplot as plt i…

005-nlohmann/json 基础方法-C++开源库108杰

《二、基础方法》&#xff1a;节点访问、值获取、显式 vs 隐式、异常处理、迭代器、类型检测、异常处理……一节课搞定C处理JSON数据85%的需求…… JSON 字段的简单类型包括&#xff1a;number、boolean、string 和 null&#xff08;即空值&#xff09;&#xff1b;复杂类型则有…

HarmonyOS 5.0 分布式数据协同与跨设备同步​​

大家好&#xff0c;我是 V 哥。 使用 Mate 70有一段时间了&#xff0c;系统的丝滑使用起来那是爽得不要不要的&#xff0c;随着越来越多的应用适配&#xff0c;目前使用起来已经和4.3的兼容版本功能差异无碍了&#xff0c;还有些纯血鸿蒙独特的能力很是好用&#xff0c;比如&am…

Linux云计算训练营笔记day02(Linux、计算机网络、进制)

Linux 是一个操作系统 Linux版本 RedHat Rocky Linux CentOS7 Linux Ubuntu Linux Debian Linux Deepin Linux 登录用户 管理员 root a 普通用户 nsd a 打开终端 放大: ctrl shift 缩小: ctrl - 命令行提示符 [rootlocalhost ~]# ~ 家目录 /root 当前登录的用户…

macOS 安装了Docker Desktop版终端docker 命令没办法使用

macOS 安装了Docker Desktop版终端docker 命令没办法使用 1、检查Docker Desktop能否正常运行。 确保Docker Desktop能正常运行。 2、检查环境变量是否添加 1、添加环境变量 如果环境变量中没有包含Docker的路径&#xff0c;你可以手动添加。首先&#xff0c;找到Docker的…

Gradio全解20——Streaming:流式传输的多媒体应用(5)——基于WebRTC的摄像头实时目标检测

Gradio全解20——Streaming&#xff1a;流式传输的多媒体应用&#xff08;5&#xff09;——基于WebRTC的摄像头实时目标检测 本篇摘要20. Streaming&#xff1a;流式传输的多媒体应用20.5 基于WebRTC的摄像头实时目标检测20.5.1 环境配置及说明1. WebRTC2. TURN服务器 20.5.2 …

OSCP - Proving Grounds - NoName

主要知识点 linux命令注入SUID find提权 具体步骤 从nmap开始搜集信息&#xff0c;只开放了一个80端口 Nmap scan report for 192.168.171.15 Host is up (0.40s latency). Not shown: 65534 closed tcp ports (reset) PORT STATE SERVICE VERSION 80/tcp open http …

c++_csp-j算法 (6)_高精度算法(加减乘除)

高精度算法 C++高精度算法是指在C++编程语言中实现高精度计算的算法。在C++中,通常整数的范围是有限的,超出这个范围的整数计算会导致溢出。高精度算法的出现,使得C++程序能够处理超出常规整数范围的大整数计算,包括高精度加法、减法、乘法、除法等运算。 在C++中实现高精…

从OpenMP中的不兼容,窥探AI应用开发中的并行编程

在AI相关的项目开发中,偶然遇到下面这个问题: OMP: Error #15: Initializing libomp.dylib, but found libiomp5.dylib already initialized. OMP: Hint This means that multiple copies of the OpenMP runtime have been linked into the progr am. That is dangerous, sin…