Diffie-Hellman密钥交换综合实验报告.docx
《Diffie-Hellman密钥交换综合实验报告.docx》由会员分享,可在线阅读,更多相关《Diffie-Hellman密钥交换综合实验报告.docx(12页珍藏版)》请在冰点文库上搜索。
(网络安全方案设计基础)实验报告
#代码可运行
时间:
2021年5月12日1-2节地点:
软件实验室
姓名
班级
学号
指导教师
实验成绩
小李
物联网18-1
180*******
***
实验名称
Diffie-Hellman密钥交换算法
实验目的
1、了解和掌握Diffie-Hellman算法原理及过程;
2、通过密钥交换算法实现对称加解密密钥的保密传输;
3、能够编写代码实现Diffie-Hellman算法,并实现数据保密传输。
实验内容
1、编写Diffie-Hellman程序,协商出用于收、发双方的加、解密密钥K;
2、模拟发送端A,用协商出的密钥K,通过对称加密算法(具体算法不限)将文本文件加密;模拟接收端B,用协商出的密钥K,对接收到的密文解密。
实
验
过
程
#include
#include
/*函数声明*/
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);
intusera();
intuserb();
intXa=3,Xb=5,Ya,Yb;
/*初始化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<256;i++)key[i]=k[i%len];
}
if(len>256){
for(i=0;i<256;i++)key[i]=k[i];
}
}
/*打乱S盒*/
voidUpsetSbox(unsignedcharsbox[],unsignedcharkey[]){
intj=0,i;
unsignedchartemp;
intn;
for(i=0;i<256;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};
unsignedchartemp;
charch=fgetc(fp1);
while(ch!
=EOF){
printf("%c",ch);
i=(i+1)%256;
temp2=j+(int)sbox[i];
j=temp2%256;
temp=sbox[i];
sbox[i]=sbox[j];
sbox[j]=temp;
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);
}
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);
printf("\n加密成功,加密内容存于“Ciphertext.txt”中\n\n");
}
/*解密总函数*/
voidDataDecrypt(unsignedchar*k1,unsignedchar*key,unsignedchar*sbox,FILE*fp1,FILE*fp2){
intlen=strlen(k1);
KeyExpansion(key,k1,len);
InitSbox(sbox);
UpsetSbox(sbox,key);
printf("\n密文为:
");
DataProcess(sbox,fp1,fp2);
fclose(fp1);
fclose(fp2);
printf("\n解密成功,解密内容存于“Plaintext.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){
FILE*file=fopen(name,"rb+");
if(file==NULL)
return0;
rewind(file);//移动指针到开头
fread(data,sizeof(char),size,file);//读出一个数组
fclose(file);
return1;
}
intmain(intargc,constchar*argv[]){
intq=11,alpha=2;
unsignedchark1res;
unsignedchark2res;
/**********RC4变量***********/
unsignedcharkey1[25]={0x00},key2[25]={0x00};
unsignedcharkey[256]={0x00};
unsignedcharsbox[256]={0x00};
FILE*fp1,*fp2;
intflag=1,i;
/*************A端操作****************/
printf("**************A端操作**************\n");
printf("q=11,a=2,Xa=3\n");
//计算Ya
Ya=pow(alpha,Xa);
Ya=Ya%q;
printf("计算得出:
Ya=(a)^Xamodq=%d\n",Ya);
printf("把Ya发送给B端.....\n");
/*************B端操作****************/
printf("**************B端操作**************\n");
printf("q=11,a=2,Xb=5\n");
//计算Yb
Yb=pow(alpha,Xb);
Yb=Yb%q;
printf("计算得出:
Yb=(a)^Xbmodq=%d\n",Yb);
printf("把Yb发送给A端.....\n\n");
/************A\B端收到数据后解密*****************/
printf("**************A\B端计算秘钥结果**************\n");
//把Yb给程序A并解出秘钥
k1res=usera(alpha,q);
//把Ya给程序B并解出秘钥
k2res=userb(alpha,q);
key1[0]=k1res;
key2[0]=k2res;
printf("\nA程序收到Yb后计算,得到秘钥Ka:
%d",k1res);
printf("\nB程序收到Ya后计算,得到秘钥Kb:
%d\n",k1res);
/*****************RC4加密********************/
/**********加密***********/
printf("\n*****************A端进行RC4加密********************\n");
fp1=fopen("Source.txt","r");
if(fp1==NULL){
printf("打开源文件失败!
\n");
getchar();
exit(0);
}
fp2=fopen("Ciphertext.txt","w");
if(fp2==NULL){
printf("打开加密后文件失败!
\n");
getchar();
exit(0);
}
printf("利用Ka加密进行加密");
DataEncrypt(key1,key,sbox,fp1,fp2);
/*********解密**********/
printf("*****************B端进行RC4解密********************\n");
fp1=fopen("Ciphertext.txt","r");
if(fp1==NULL){
printf("打开加密后文件失败!
\n");
getchar();
exit(0);
}
fp2=fopen("Plaintext.txt","w");
if(fp2==NULL){
printf("打开解密后文件失败!
\n");
getchar();
exit(0);
}
//read_file("Key.txt",key2,11);
printf("利用Kb加密进行解密");
DataDecrypt(key2,key,sbox,fp1,fp2);
/*************************************/
return0;
}
intusera(alpha,q)
{
intk1=pow(Yb,Xa);
k1=k1%q;
returnk1;
}
intuserb(alpha,q)
{
intk2=pow(Ya,Xb);
k2=k2%q;
returnk2;
}
实
验
结
果
主代码的运行结果(图1):
图1
存储明文的文件(图2):
图2
存储密文的文件(图3):
图3
存储解密结果的文件(图4)
图4
分析与
总结
通过这次实验,更深入了解了Diffie-Hellman算法Diffie-Hellman密钥协议算法是一种确保共享密钥安全穿越不安全网络的方法。
这个机制的巧妙在于需要安全通信的双方可以用这个方法确定对称密钥。
然后可以用这个密钥进行加密和解密。
但是注意,这个密钥交换协议/算法只能用于密钥的交换,而不能进行消息的加密和解密。
双方确定要用的密钥后,要使用其他对称密钥操作加密算法实际加密和解密消息。