DiffieHellman密钥交换算法综合实验报告Word文档格式.docx
- 文档编号:18732400
- 上传时间:2022-12-31
- 格式:DOCX
- 页数:13
- 大小:64.97KB
DiffieHellman密钥交换算法综合实验报告Word文档格式.docx
《DiffieHellman密钥交换算法综合实验报告Word文档格式.docx》由会员分享,可在线阅读,更多相关《DiffieHellman密钥交换算法综合实验报告Word文档格式.docx(13页珍藏版)》请在冰豆网上搜索。
过
程
A端的代码
#include<
stdio.h>
math.h>
intXa=3,Xb=5,Ya,Yb;
/**********A端通过Yb计算Ka*************/
intusera(alpha,q)
{
intk1=pow(Yb,Xa);
k1=k1%q;
returnk1;
}
/**********B端通过Ya计算Kb*************/
intuserb(alpha,q)
intk2=pow(Ya,Xb);
k2=k2%q;
returnk2;
/******************************/
/*函数声明*/
voidInitSbox(unsignedcharsbox[]);
voidKeyExpansion(unsignedcharkey[],char*k,intlen);
voidUpsetSbox(unsignedcharsbox[],unsignedcharkey[]);
voidDataProcess(unsignedcharsbox[],FILE*fp1,FILE*fp2);
voidDataEncrypt(char*k,unsignedchar*key,unsignedchar*sbox,FILE*fp1,FILE*fp2);
voidDataDecrypt(char*k1,unsignedchar*key,unsignedchar*sbox,FILE*fp1,FILE*fp2);
intwrite_file(charname[],chardata[],intsize);
intread_file(charname[],chardata[],intsize);
/*初始化S盒*/
voidInitSbox(unsignedcharsbox[]){
inti;
for(i=0;
i<
256;
i++)sbox[i]=i;
/*密钥填充256数组*/
voidKeyExpansion(unsignedcharkey[],char*k,intlen){
inti;
if(len<
=256){
for(i=0;
i++)key[i]=k[i%len];
}
if(len>
256){
i++)key[i]=k[i];
/*打乱S盒*/
voidUpsetSbox(unsignedcharsbox[],unsignedcharkey[]){
intj=0,i;
unsignedchartemp;
intn;
i++){
n=j+(int)sbox[i]+(int)key[i];
j=n%256;
temp=sbox[i];
sbox[i]=sbox[j];
sbox[j]=temp;
/*加解密数据*/
voidDataProcess(unsignedcharsbox[],FILE*fp1,FILE*fp2){//0加密,1解密
inti=0,j=0,size=0;
inttemp2,temp1,t;
chark,cipherchar,data_Stream[100]={0x00};
charch=fgetc(fp1);
while(ch!
=EOF){
i=(i+1)%256;
temp2=j+(int)sbox[i];
j=temp2%256;
temp1=(int)sbox[i]+(int)sbox[j];
t=temp1%256;
data_Stream[size++]=k=sbox[t];
cipherchar=ch^k;
fputc(cipherchar,fp2);
ch=fgetc(fp1);
printf("
%c"
ch);
write_file("
Stream.txt"
data_Stream,size);
/*加密总函数*/
voidDataEncrypt(unsignedchar*k,unsignedchar*key,unsignedchar*sbox,FILE*fp1,FILE*fp2){
intlen=strlen(k);
KeyExpansion(key,k,len);
InitSbox(sbox);
UpsetSbox(sbox,key);
printf("
\n明文为:
"
);
DataProcess(sbox,fp1,fp2);
fclose(fp1);
fclose(fp2);
\n加密成功,加密内容存于“miwen.txt”中\n\n"
/*******文件的写操作**********/
intwrite_file(charname[],chardata[],intsize){
FILE*file=fopen(name,"
ab+"
if(file==NULL)
return0;
fwrite(data,sizeof(char),size,file);
//写入一个数组
rewind(file);
//移动指针到开头
fclose(file);
return1;
/******文件的操作*******/
intread_file(unsignedcharname[],chardata[],intsize){
rb+"
fread(data,sizeof(char),size,file);
//读出一个数组
intmain(intargc,constchar*argv[]){
intq=11,alpha=2;
intKa;
unsignedcharkey1[25]={0x00},key2[25]={0x00};
unsignedcharkey[256]={0x00};
unsignedcharsbox[256]={0x00};
FILE*fp1,*fp2;
intflag=1,i;
printf("
A用户端\n"
q=11,a=2\n"
//CalculatingYa
Ya=pow(alpha,Xa);
Ya=Ya%q;
计算得到Ya=%d\n"
Ya);
请输入B端的公钥Yb:
scanf("
%d"
&
Yb);
Ka=usera(alpha,q);
计算得到最终公钥K=%d"
Ka);
key1[0]=Ka;
/**********加密***********/
fp1=fopen("
mingwen.txt"
"
r"
if(fp1==NULL){
打开源文件失败!
\n"
getchar();
exit(0);
fp2=fopen("
miwen.txt"
w"
if(fp2==NULL){
打开加密后文件失败!
DataEncrypt(key1,key,sbox,fp1,fp2);
/********************************B端代码************************************/
intXb=5,Ya,Yb;
/*解密总函数*/
voidDataDecrypt(unsignedchar*k1,unsignedchar*key,unsignedchar*sbox,FILE*fp1,FILE*fp2){
intlen=strlen(k1);
KeyExpansion(key,k1,len);
\n密文为:
\n解密成功,内容存于“jiemi.txt”中!
\n\n"
intKb;
B用户端\n"
//CalculatingYb
Yb=pow(alpha,Xb);
Yb=Yb%q;
计算得到Yb=%d\n"
Yb);
请输入A端的公钥Ya:
Ya);
Kb=userb(alpha,q);
计算得到最终秘钥K=%d\n"
Kb);
key2[0]=Kb;
/*********解密**********/
fp1=fopen("
if(fp1==NULL){
fp2=fopen("
jiemi.txt"
if(fp2==NULL){
打开解密后文件失败!
}
DataDecrypt(key2,key,sbox,fp1,fp2);
结
果
代码的运行结果(图1、图2):
图1
(图2)
存储明文的文件(图3):
图3
存储密文的文件(图4):
图4
解密后的文件(图5):
图5
分析与
总结
通过本次实验,我更加了解了Diffie-Hellman算法的原理及过程。
主要思路:
1、在A、B两个程序中,定义了q、a变量,并赋初值。
实现q、a的公开。
2、通过手动输入Ya和Yb实现交换。
3、双方在计算得到共享秘钥K后。
4、A端读取mingwen.txt文件中的数据,并对数据通过RC4加密,加密后的文件存于miwen.txt中。
5、B端计算出共享秘钥后,读取miwen.txt文件中的数据,并对其进行解密,并把解密后的数据保存于jiemi.txt中。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- DiffieHellman 密钥 交换 算法 综合 实验 报告