【网络安全】【密码学】【北京航空航天大学】实验二、数论基础(中)【C语言和Java实现】

本文主要是介绍【网络安全】【密码学】【北京航空航天大学】实验二、数论基础(中)【C语言和Java实现】,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

实验二、数论基础(中)

一、实验内容

1、扩展欧几里得算法(Extended Euclid’s Algorithm)

(1)、算法原理

已知整数 a , b ,扩展的欧几里得算法可以在求得 a , b最大公约数的同时,找到一对整数 x , y ,使得 a , b , x , y 满足如下等式:ax + by = d = gcd(a,b), 其中 gcd(a, b)ab 的最大公约数。

(2)、算法流程

本算法的大致流程如下图所示:

在这里插入图片描述

(3)、 算法的代码实现(C语言)

# include <stdio.h>int r2, s2, t2;void Extended_Euclid(int a, int b);int main(){int a, b;printf("请输入整数a:\n");scanf("%d", &a);printf("请输入整数b:\n");scanf("%d", &b);Extended_Euclid(a, b);printf("a和b的最大公因子为: %d\n", r2);printf("满足ax + by = gcd(a, b)的因子x和y分别为: %d %d\n", s2, t2);return 0;
}void Extended_Euclid(int a, int b){int r, s, t;int r1, s1, t1;int tmp1, tmp2, tmp3;int q;r = a;s = 1;t = 0;r1 = b;s1 = 0;t1 = 1;while(r1 != 0){q = r / r1;tmp1 = r - q * r1;tmp2 = s - q * s1;tmp3 = t - q * t1;r = r1;s = s1;t = t1;r1 = tmp1;s1 = tmp2;t1 = tmp3;}r2 = r;s2 = s;t2 = t;return;
}

(4)、算法测试

测试点1:a = 7, b = 5

在这里插入图片描述

测试点2:a = 31, b = -13

在这里插入图片描述

测试点3:a = 24, b = 36

在这里插入图片描述

(5)、一点思考

线性系数x和y不是唯一的,比如样例3中既可以是24 * (-1) + 36 * 1 = 12,也可以是24 * 2 + 36 * (-1) = 12. 如何能使算法找出所有满足条件的解?

2、简单幂取模算法(Simple Exponentiation-Module Algorithm)

(1)、算法原理

每次做乘法操作时都取模,即“乘一次模一次,循环往复”。数学表达式为 d = (((x^(n-1))mod m)*x) mod m

(2)、算法流程

本算法的大致流程如下图所示:

在这里插入图片描述

(3)、算法的代码实现(C语言)

#include <stdio.h>int main(){int x, n, m;int ans;int i;printf("请输入底数x的值:\n");scanf_s("%d", &x);printf("请输入指数n的值:\n");scanf_s("%d", &n);printf("请输入模数m的值:\n");scanf_s("%d", &m);ans = 1;for(i = 1;i <= n;i ++){ans = (ans * x) % m;}printf("%d", ans);return 0;
}

(4)、算法测试

测试点1:x = 7, n = 16, m = 3

运行时截图:

在这里插入图片描述

测试点2:x = 5, n = 1003, m = 31

运行时截图:

在这里插入图片描述
2、快速幂取模算法(Fast Exponentiation-Module Algorithm)

(1)、算法原理

常规的幂取模算法包含过多的乘法以及取模运算,计算步骤多,导致算法的效率很低。根据模运算和幂运算的性质,可以将幂次(指数n)用2进制进行表示,然后再迭代进行求模幂,从而减少乘法和取模的次数。

(2)、算法流程

本算法的大致流程如下图所示:

在这里插入图片描述

(3)、算法的代码实现(C语言)

#include <stdio.h>int main()
{int x, n, m;int d = 1;printf("请输入底数x的值:\n");scanf_s("%d", &x);printf("请输入指数n的值:\n");scanf_s("%d", &n);printf("请输入模数m的值:\n");scanf_s("%d", &m);while(n > 0){if((n % 2) == 1){d = (d * x) % m;n = (n - 1) / 2;}else{n = n / 2;}x = (x * x) % m;}printf("快速幂取模计算结果:\n");printf("%d", d);return 0;
}

(4)、算法测试
测试点1:x = 7, n = 16, m = 3

运行时截图:

在这里插入图片描述测试点2:x = 5, n = 1003, m = 31

运行时截图:

在这里插入图片描述

二、参考文献

1、《密码编码学与网络安全——原理与实践(第七版)》(Cryptography and Network Security, Principles and Practice, Seventh Edition),【美】威廉 斯托林斯 William Stallings 著,王后珍等 译,北京,电子工业出版社,2017年12月。

2、《密码学实验教程》,郭华 刘建伟等 主编,北京,电子工业出版社,2021年1月。

这篇关于【网络安全】【密码学】【北京航空航天大学】实验二、数论基础(中)【C语言和Java实现】的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/598184

相关文章

使用Python实现IP地址和端口状态检测与监控

《使用Python实现IP地址和端口状态检测与监控》在网络运维和服务器管理中,IP地址和端口的可用性监控是保障业务连续性的基础需求,本文将带你用Python从零打造一个高可用IP监控系统,感兴趣的小伙... 目录概述:为什么需要IP监控系统使用步骤说明1. 环境准备2. 系统部署3. 核心功能配置系统效果展

Java 实用工具类Spring 的 AnnotationUtils详解

《Java实用工具类Spring的AnnotationUtils详解》Spring框架提供了一个强大的注解工具类org.springframework.core.annotation.Annot... 目录前言一、AnnotationUtils 的常用方法二、常见应用场景三、与 JDK 原生注解 API 的

Java controller接口出入参时间序列化转换操作方法(两种)

《Javacontroller接口出入参时间序列化转换操作方法(两种)》:本文主要介绍Javacontroller接口出入参时间序列化转换操作方法,本文给大家列举两种简单方法,感兴趣的朋友一起看... 目录方式一、使用注解方式二、统一配置场景:在controller编写的接口,在前后端交互过程中一般都会涉及

Java中的StringBuilder之如何高效构建字符串

《Java中的StringBuilder之如何高效构建字符串》本文将深入浅出地介绍StringBuilder的使用方法、性能优势以及相关字符串处理技术,结合代码示例帮助读者更好地理解和应用,希望对大家... 目录关键点什么是 StringBuilder?为什么需要 StringBuilder?如何使用 St

Python实现微信自动锁定工具

《Python实现微信自动锁定工具》在数字化办公时代,微信已成为职场沟通的重要工具,但临时离开时忘记锁屏可能导致敏感信息泄露,下面我们就来看看如何使用Python打造一个微信自动锁定工具吧... 目录引言:当微信隐私遇到自动化守护效果展示核心功能全景图技术亮点深度解析1. 无操作检测引擎2. 微信路径智能获

使用Java将各种数据写入Excel表格的操作示例

《使用Java将各种数据写入Excel表格的操作示例》在数据处理与管理领域,Excel凭借其强大的功能和广泛的应用,成为了数据存储与展示的重要工具,在Java开发过程中,常常需要将不同类型的数据,本文... 目录前言安装免费Java库1. 写入文本、或数值到 Excel单元格2. 写入数组到 Excel表格

Java并发编程之如何优雅关闭钩子Shutdown Hook

《Java并发编程之如何优雅关闭钩子ShutdownHook》这篇文章主要为大家详细介绍了Java如何实现优雅关闭钩子ShutdownHook,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起... 目录关闭钩子简介关闭钩子应用场景数据库连接实战演示使用关闭钩子的注意事项开源框架中的关闭钩子机制1.

Python中pywin32 常用窗口操作的实现

《Python中pywin32常用窗口操作的实现》本文主要介绍了Python中pywin32常用窗口操作的实现,pywin32主要的作用是供Python开发者快速调用WindowsAPI的一个... 目录获取窗口句柄获取最前端窗口句柄获取指定坐标处的窗口根据窗口的完整标题匹配获取句柄根据窗口的类别匹配获取句

Maven中引入 springboot 相关依赖的方式(最新推荐)

《Maven中引入springboot相关依赖的方式(最新推荐)》:本文主要介绍Maven中引入springboot相关依赖的方式(最新推荐),本文给大家介绍的非常详细,对大家的学习或工作具有... 目录Maven中引入 springboot 相关依赖的方式1. 不使用版本管理(不推荐)2、使用版本管理(推

Java 中的 @SneakyThrows 注解使用方法(简化异常处理的利与弊)

《Java中的@SneakyThrows注解使用方法(简化异常处理的利与弊)》为了简化异常处理,Lombok提供了一个强大的注解@SneakyThrows,本文将详细介绍@SneakyThro... 目录1. @SneakyThrows 简介 1.1 什么是 Lombok?2. @SneakyThrows