没有合适的资源?快使用搜索试试~ 我知道了~
首页实验四:RSA加、解密算法实现
实验四:RSA加、解密算法实现
需积分: 18 26 下载量 62 浏览量
更新于2023-05-26
评论 1
收藏 87KB DOCX 举报
通过上机操作,使同学生对公钥加密算法RSA密码体制的加、解过程有一个更加清晰地认识。通过本次实验,加深学生对公钥密码体制的认识,为后面的学习打下基础。
资源详情
资源评论
资源推荐
实验四:RSA 加、解密算法实现
姓名 班级 学号
实验目的
通过上机操作,使同学生对公钥加密算法 RSA 密码体制的加、解过程有一个更加清晰地认
识。通过本次实验,加深学生对公钥密码体制的认识,为后面的学习打下基础。
实验内容及要求
1 、 在 RSA 密 码 体 制 中 , 有 , 其 中 、 均 为 素 数 , 现 给 定
p=1874113084280153735306658132040384611093897935132757017046995662677
351096773572253280762088015535511593 , q=60191029407054636927655161587
756444761379072535783988270411169569692878072820829948978476393524028
6491,以及公钥 =58997,试求出私钥 ,使得 .
2、使用上述密钥,随机选取消息 ,分别对其进行加密和解密操作。
实验结果(可续页)(包括实验代码、实验结果)
一、算法提要:
1.扩展欧几里德算法:求 e 模 n 的逆 b.
void rsa(int e[MAX],int g[MAX],int *d)
{
int r[MAX],n1[MAX],n2[MAX],k[MAX],w[MAX];
int i,t[MAX],b1[MAX],b2[MAX],temp[MAX];
mov(g,n1);
mov(e,n2);
for(i=0;i<MAX;i++)
k[i]=w[i]=r[i]=temp[i]=b1[i]=b2[i]=t[i]=0;
b1[MAX-1]=0;b1[0]=0;
b2[MAX-1]=1;b2[0]=1;
while(1)
{
for(i=0;i<MAX;i++)
k[i]=w[i]=0;
divt(n1,n2,k,w);
for(i=0;i<MAX;i++)
temp[i]=0;
mult(k,n2,temp);
for(i=0;i<MAX;i++)
r[i]=0;
sub(n1,temp,r);
if((r[MAX-1]==1) && (r[0]==0))
{
break;
}
else
{
mov(n2,n1);
mov( r,n2);
mov(b2, t);
for(i=0;i<MAX;i++)
temp[i]=0;
mult(k,b2,temp);
for(i=0;i<MAX;i++)
b2[i]=0;
sub(b1,temp,b2);
mov(t,b1);
}
}
for(i=0;i<MAX;i++)
t[i]=0;
add(b2,g,t);
for(i=0;i<MAX;i++)
temp[i]=d[i]=0;
divt(t,g,temp,d);
printf("公钥 d = ");
for(i=0;i<d[MAX-1];i++)
printf("%d",d[d[MAX-1]-i-1]);
printf("\n\n");
}
2、用平方-乘方法解决 m=a^p mod n 的函数问题。
void expmod(int a[MAX] ,int p[MAX] ,int n[MAX],int *m)
{
int t[MAX],l[MAX],temp[MAX];
int w[MAX],s[MAX],c[MAX],b[MAX],i;
for(i=0;i<MAX-1;i++)
b[i]=l[i]=t[i]=w[i]=0;
t[0]=2;t[MAX-1]=1;
l[0]=1;l[MAX-1]=1;
mov(l,temp);
mov(a,m);
mov(p,b);
while(cmp(b,l)!=0)
{
for(i=0;i<MAX;i++)
w[i]=c[i]=0;
divt(b,t,w,c);
mov(w,b);
if(cmp(c,l)==0)
{
for(i=0;i<MAX;i++)
w[i]=0;
mult(temp,m,w);
mov(w,temp);
for(i=0;i<MAX;i++)
w[i]=c[i]=0;
divt(temp,n,w,c);
mov(c,temp);
}
for(i=0;i<MAX;i++)
s[i]=0;
mult(m,m,s);
for(i=0;i<MAX;i++)
c[i]=0;
divt(s,n,w,c);
mov (c,m);
}
for(i=0;i<MAX;i++)
s[i]=0;
mult(m,temp,s);
for(i=0;i<MAX;i++)
c[i]=0;
divt(s,n,w,c);
mov (c,m);
m[MAX-2]=a[MAX-2];
return;
}
二、运行结果
三、实验分析
本次实验的最大难点是大数运算,一般情况下计算机处理的最大整型为 64 位(二进
制)=18446744073709551616,而 C++并不提供大数的数据结构,一开始上网查到可以
引入第三方库文件 gmp 大数库,然而我按照网上的教程安装文件、配置环境,结果还是使用
不了该头文件,最后放弃改用数组来存储数据,所以代码就比较繁琐,相应的运算都要基于数
组自己来定义。
四、附录(完整代码)
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<time.h>
#include<math.h>
#include<malloc.h>
#define MAX 500
#define LEN sizeof(struct Link)
void sub(int a[MAX],int b[MAX] ,int c[MAX] );
struct Link
{
int bignum[MAX];
//bignum[MAX-2]用来标记正负号,1 正,0 负 bignum[MAX-1]来标记实际长
struct Link *next;
};
void print( int a[MAX] )
{
剩余18页未读,继续阅读
璀灬璨
- 粉丝: 5
- 资源: 20
上传资源 快速赚钱
- 我的内容管理 收起
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
会员权益专享
最新资源
- zigbee-cluster-library-specification
- JSBSim Reference Manual
- c++校园超市商品信息管理系统课程设计说明书(含源代码) (2).pdf
- 建筑供配电系统相关课件.pptx
- 企业管理规章制度及管理模式.doc
- vb打开摄像头.doc
- 云计算-可信计算中认证协议改进方案.pdf
- [详细完整版]单片机编程4.ppt
- c语言常用算法.pdf
- c++经典程序代码大全.pdf
- 单片机数字时钟资料.doc
- 11项目管理前沿1.0.pptx
- 基于ssm的“魅力”繁峙宣传网站的设计与实现论文.doc
- 智慧交通综合解决方案.pptx
- 建筑防潮设计-PowerPointPresentati.pptx
- SPC统计过程控制程序.pptx
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0