密码学--RSA

news2025/5/10 19:22:16

一、实验目的

1.随机生成明文和加密密钥

2.利用C语言实现素数选择(素性判断)的算法

3.利用C语言实现快速模幂运算的算法(模重复平方法)

4.利用孙子定理实现解密程序

5.利用C语言实现RSA算法

6.利用RSA算法进行数据加/解密

二、实验内容

1、题目内容描述

实现快速模幂乘法计算ax mod m;

实现Euclid算法计算gcd(a,b);

随机生成正整数,用Miller_Rabin算法进行素性判断,安全参数t=10,得到通过检验的两个素数p和q,计算出n,φ(n),dp,dq和inv_p;

实现扩展Euclid算法,当公钥e = 7时,计算出私钥d;

随机生成明文数字,利用快速模幂乘法,计算出密文,利用孙子定理解密出明文。

2、关键代码的设计、实现与执行

设计思路:

先生成随机生成密钥以时间设置随机数生成器的种子,以确保每次运行程序时生成的随机数序列都是不同的。p大于 100确保p是一个足够大的素数;并调用最大公约数函数:gcd(),检查p-1和e的最大公约数为 1,即为了确保p和e是互质的;再调用primetest()函数,进行素性判断rand()%Max是为了将随机生成的p,q控制在一定范围内,以免溢出int范围,关键代码如下:(此处只以p为例,在p生成后,以同样的方法生成q,只是换一个字母)

srand(time(NULL));//以时间为种子,以确保每次生成的随机数不同

do

{

if((p>100)&&(gcd(p-1,e)==1)&&(primetest(p,t)==1))//确保p足够大,且与e互质,并调用素性检验的函数,要求p为素数

break;//p满足上述条件则即可跳出循环

p=rand()%Max;//若p未满足上述条件则重新生成

}while(1);//只有在p到达条件成功生成后才会跳出循环

紧接着就是上面提到的计算最大公约数的函数,只要最大公约数为1,则证明两个数互质,关键代码如下:(也就是前面两个实验:仿射密码和希尔密码用到的求最大公约数的函数)

if(a<b)//交换数

{

temp=a;

a=b;

b=temp;

}

while(b!=0)

{

temp=a%b;

a=b;

b=temp;

}

return a;//得到最大公因数

然后是上面提到过的素性检验部分,t是实验题目中给出的安全参数,即实验t次,然后以r/2不断循环,在循环期间s++,r右移,再循环安全参数t次,检测传入的数x是否通过素性检测,这样检测q,p两个数,关键代码如下:

if(!(x&1))//检查 x 是否为偶数(只有偶数与1进行按位与操作结果才为0)。如果是偶数,函数返回 0,表示 x 不是质数

return 0;

while(!(r&1))// r 除以2的余数不为1。这意味着循环会一直执行直到 r 为奇数。

{

s++;

r>>=1;//在循环体内,首先 s 被增加1,然后 r 右移一位(相当于除以2)。这是在寻找 x 的位数。

}

for(i=0;i<t;i++)//安全参数t,则重复执行 t 次

{

a=rand()%(x-2)+2;//在循环体内,生成一个在[2, x-2] 范围内的随机整数并赋值给 a。

if(gcd(2,x)>1)//检查X是否数质数,2太小了,也排除在外

return 0;

int b=quickpower(a,r,x);//调用快速幂运算

if(b==1||b==x-1)//通过检测

continue;

for(j=0;j<s;j++)

{

b=b*b%x;

if(b==x-1)//通过检测

break;

}

if(j==s)//表示X不是质数

return 0;

}

return 1;

在已知当公钥e = 7时,计算出私钥d上述已经得到了p,q,即可算出dn=(p-1)*(q-1),然后对计算出e模dn的逆元即是私钥d,关键代码如下:

int dn=(p-1)*(q-1);

int d=inverse_a(e,dn);

在加密解密的时候都运用了快速模幂算法,初始值为1,从指数二进制最低位开始,每步都把底数平方,遇到1就乘以底数,但是在快速模幂平方或者×原本的数的时候,由于p,q是两个大质数,所有有溢出风险,即再添加一个快速模乘的函数,代替快速模幂里面的乘法,关键代码如下:

快速模幂部分:

while(b)

{

if(b&1)//检查 b 的最后一位是否为 1;对于每一次循环,我们只对 b 的最后一位为 1 的情况进行处理,相当于每次只处理一个乘法结果。

ans=(ans+res)%c;

res=(res+res)%c;

b>>=1;//右移操作,将 b 的所有位向右移动一;在每次循环中处理的是 b 的下一位。

}

return (int)ans;//函数返回ans,即最终结果

快速模乘部分:

while(b!=0){

if((b&1)!=0)//检查 b 的最后一位是否为 1

    {

ans=quickmultiply(ans,base,c);

}

base=quickmultiply(base,base,c);// base 自乘并对 c 取模

b>>=1;//右移操作,将 b 的所有位向右移动一;在每次循环中处理的是 b 的下一位。

}

return ans;

为了操作方便且不溢出,解密过程还使用了孙子定理加速解密过程,由于p,q是两个大质数,所以它们的欧拉函数就是本身减1,于是用得到的欧拉函数调用快速模幂算法的函数,得到x1和x2,

再代入式子即可得到解密后的明文,关键代码部分如下:

int dp=d%(p-1);

int dq=d%(q-1);

if(dp<0)

dp=dp+p-1;

if(dq<0)

dq=dq+q-1;//求得p,q的欧拉函数

int inv_p=inverse_a(p,q);

int inv_q=(1-p*inv_p)/q;

int c1=c%p;

int c2=c%q;

int x1=quickpower(c1,dp,p);

int x2=quickpower(c2,dq,q);//快速模幂分别求得两个x1,x2

cout<<1;

cout<<"inv_p="<<inv_p<<endl;

cout<<"inv_q="<<inv_q<<endl;

cout<<"x1="<<x1<<endl;

cout<<"x2="<<x2<<endl;

int m=(x1*q*inv_q+x2*p*inv_p)%n;//代入计算

结果截图如下:

  1. 实验结果分析

结果截图在上面过程中,可以看到每次生成的p,q都不同,且是大质数,,每次的明文也是随机生成的不同的数,可以看到过程,得到密文cipher,再经过一系列解密后得到解密后的明文,经观察可以看到,解密生成的密文与随机生成的明文是一致的,故可以得到加密解密过程正确。

三、实验思考

1、实验过程总结

相较于仿射密码和希尔密码,rsa密码算法更为复杂,虽然在这个实验中明文是数字而不是字母,需要转换,但是随机生成的p,q需要是大质数,无疑是增加了实验的难度。所以在随机生成了p,q后第一步要解决的难题就是素性检验的问题,根据理论知识,在安全参数为t的情况下,循环执行检查t次,每次随机生成范围内的数,看是否存在除1外的公因数;紧接着就是加密解密过程都涉及的快速模幂运算,将指数转换成二进制形式,从低位开始,不断平方右移,遇到1再乘底数,由于int类型的长度有限,所以在快速模幂运算中间的有两步乘法可能会出现溢出现象,可以将其改为加法,即快速模乘运算;最后的重点就是孙子定理,在解密中运用,加速解密,其中涉及到p,q的欧拉函数,将解密的式子分成两个式子减小运算量,最后再结合在一起,即得到加密过程。在前面两个实验的基础上,完成这个实验会较为轻松一点,无非就是多添了三个部分,但是此实验由于明文也是随机生成的,所以避免了文件操作。

  1. 回答实验指导书最后提出的问题

思考题1:

在这个思考题中可以看到其实就是借用了rsa算法中的快速模幂算法,按题目中已给出的n=101*157=15857,e=7,s0=2,于是得到下面的结果:

当然也可以更换题目中给出的初始值,如下:

思考题2:

在这个思考题中可以看到就是没有了解密部分,将铭文空间里的每一个数进行加密计算,看得到的结果是否和明文一致,一致就是不动点,操作结果如下:

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

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

相关文章

如何选择自己喜欢的cms

选择内容管理系统cms what is cms1.whatcms.org2.IsItWP.com4.Wappalyzer5.https://builtwith.com/6.https://w3techs.com/7. https://www.netcraft.com/8.onewebtool.com如何在不使用 CMS 检测器的情况下手动检测 CMS 结论 在开始构建自己的数字足迹之前&#xff0c;大多数人会…

BUUCTF——杂项渗透之赛博朋克

下载附件&#xff0c;是一个txt。打开查看&#xff0c;数据如下&#xff1a; 感觉这个像是用十六进制编辑器打开后的图片数据。为了验证此想法&#xff0c;我用010editor打开&#xff0c;发现文件头的确是png图片的文件头。 把txt文件后缀改成png格式&#xff0c;再双击打开&am…

React 中集成 Ant Design 组件库:提升开发效率与用户体验

React 中集成 Ant Design 组件库:提升开发效率与用户体验 一、为什么选择 Ant Design 组件库?二、基础引入方式三、按需引入(优化性能)四、Ant Design Charts无缝接入图标前面提到了利用Redux提供全局维护,但如果在开发时再自己手动封装组件,不仅效率不高,可能开发的组件…

编译原理实验 之 语法分析程序自动生成工具Yacc实验

文章目录 实验环境准备复现实验例子分析总的文件架构实验任务 什么是Yacc Yacc(Yet Another Compiler Compiler)是一个语法分析程序自动生成工具&#xff0c;Yacc实验通常是在编译原理相关课程中进行的实践项目&#xff0c;旨在让学生深入理解编译器的语法分析阶段以及掌握Yac…

从“山谷论坛”看AI七剑下天山

始于2023年的美国山谷论坛(Hill and Valley Forum)峰会,以“国会山与硅谷”命名,寓意连接科技界与国家安全战略。以人工智能为代表的高科技,在逆全球化时代已成为大国的致胜高点。 论坛创办者Jacob Helberg,现在是华府的副国务卿,具体负责经济、环境和能源事务。早先曾任…

C——数组和函数实践:扫雷

此篇博客介绍用C语言写一个扫雷小游戏&#xff0c;所需要用到的知识有&#xff1a;函数、数组、选择结构、循环结构语句等。 所使用的编译器为:VS2022。 一、扫雷游戏是什么样的&#xff0c;如何玩扫雷游戏&#xff1f; 如图&#xff0c;是一个标准的扫雷游戏初始阶段。由此…

sui在windows虚拟化子系统Ubuntu和纯windows下的安装和使用

一、sui在windows虚拟化子系统Ubuntu下的安装使用&#xff08;WindowsWsl2Ubuntu24.04&#xff09; 前言&#xff1a;解释一下WSL、Ubuntu的关系 WSL&#xff08;Windows Subsystem for Linux&#xff09;是微软推出的一项功能&#xff0c;允许用户在 Windows 系统中原生运行…

智能合约在去中心化金融(DeFi)中的核心地位与挑战

近年来&#xff0c;区块链技术凭借其去中心化、不可篡改等特性&#xff0c;在全球范围内掀起了技术革新浪潮。去中心化金融&#xff08;DeFi&#xff09;作为区块链技术在金融领域的重要应用&#xff0c;自 2018 年以来呈现出爆发式增长态势。据 DeFi Pulse 数据显示&#xff0…

有关SOA和SpringCloud的区别

目录 1. 定义 2. 架构风格 3. 技术栈 4. 服务交互 5. 适用场景 前言 面向服务架构&#xff08;SOA&#xff09;是一种软件设计风格&#xff0c;它将应用程序的功能划分为一系列松散耦合的服务。这些服务可以通过标准的通信协议进行交互&#xff0c;通常是HTTP或其他消息传…

学习搭子,秘塔AI搜索

什么是秘塔AI搜索 《秘塔AI搜索》的网址&#xff1a;https://metaso.cn/ 功能&#xff1a;AI搜索和知识学习&#xff0c;其中学习部分是亮点&#xff0c;也是主要推荐理由。对应的入口&#xff1a;https://metaso.cn/study 推荐理由 界面细节做工精良《今天学点啥》板块的知…

IBM BAW(原BPM升级版)使用教程第六讲

续前篇&#xff01; 一、事件&#xff1a;Undercover Agent 在 IBM Business Automation Workflow (BAW) 中&#xff0c;Undercover Agent (UCA) 是一个非常独特和强大的概念&#xff0c;旨在实现跨流程或系统的事件处理和触发机制。Undercover Agent 主要用于 事件驱动的流程…

高并发PHP部署演进:从虚拟机到K8S的DevOps实践优化

一、虚拟机环境下的部署演进 1. 低并发场景&#xff08;QPS<10&#xff09;的简单模式 # 典型部署脚本示例 ssh userproduction "cd /var/www && git pull origin master" 技术痛点&#xff1a; 文件替换期间导致Nginx返回502错误&#xff08;统计显示…

VBA高级应用30例应用4:利用屏蔽事件来阻止自动运行事件

《VBA高级应用30例》&#xff08;版权10178985&#xff09;&#xff0c;是我推出的第十套教程&#xff0c;教程是专门针对高级学员在学习VBA过程中提高路途上的案例展开&#xff0c;这套教程案例与理论结合&#xff0c;紧贴“实战”&#xff0c;并做“战术总结”&#xff0c;以…

Centos 7.6 安装 Node.js 20 的环境配置记录

Centos 7.6 安装 Node.js 20 的环境配置记录 Centos 7在 2024 年的 6 月 30 号已经停止维护了&#xff0c;但是由于时代原因&#xff0c;很多服务还是跑在这个系统上。本篇博文记录如何在 Centos 7.6 上安装 Node20。 初步安装 node 下载 node.js 的 Linux 版本 cd ~ curl -O h…

springboot3 + mybatis-plus3 创建web项目实现表增删改查

Idea创建项目 环境配置说明 在现代化的企业级应用开发中&#xff0c;合适的开发环境配置能够极大提升开发效率和应用性能。本文介绍的环境配置为&#xff1a; 操作系统&#xff1a;Windows 11JDK&#xff1a;JDK 21Maven&#xff1a;Maven 3.9.xIDE&#xff1a;IntelliJ IDEA…

【人工智能学习之动作识别TSM训练与部署】

【人工智能学习之动作识别TSM训练与部署】 基于MMAction2动作识别项目的开发一、MMAction2的安装二、数据集制作三、模型训练1. 配置文件准备2. 关键参数修改3. 启动训练4. 启动成功 ONNX模型部署方案一、环境准备二、执行转换命令 基于MMAction2动作识别项目的开发 一、MMAct…

sqli-labs靶场18-22关(http头)

目录 less18&#xff08;user-agent&#xff09; less19&#xff08;referer&#xff09; less20&#xff08;cookie&#xff09; less21&#xff08;cookie&#xff09; less22&#xff08;cookie&#xff09; less18&#xff08;user-agent&#xff09; 这里尝试了多次…

Android系统架构模式分析

本文系统梳理Android系统架构模式的演进路径与设计哲学&#xff0c;希望能够借此探索未来系统的发展方向。有想法的同学可以留言讨论。 1 Android层次化架构体系 1.1 整体分层架构 Android系统采用五层垂直架构&#xff0c;各层之间通过严格接口定义实现解耦&#xff1a; 应用…

Web前端VSCode如何解决打开html页面中文乱码的问题(方法2)

Web前端—VSCode如何解决打开html页面中文乱码的问题&#xff08;方法2&#xff09; 1.打开VScode后&#xff0c;依次点击 文件 >> 首选项 >> 设置 2.打开设置后&#xff0c;依次点击 文本编辑器 >> 文件&#xff08;或在搜索框直接搜索“files.autoGuessEnc…

单调栈模版型题目(3)

单调栈型题目贡献法 基本模版 这是数组a中的 首先我们要明白什么叫做贡献&#xff0c;在一个数组b{1,3,5}中&#xff0c;连续包含1的连续子数组为{1}&#xff0c;{1,3}&#xff0c;{1,3,5}&#xff0c;一共有三个&#xff0c;这三个数一共能组成6个连续子数组&#xff0c;而其…