密码学实验报告 重庆大学.docx

上传人:b****2 文档编号:3214699 上传时间:2023-05-05 格式:DOCX 页数:41 大小:443.55KB
下载 相关 举报
密码学实验报告 重庆大学.docx_第1页
第1页 / 共41页
密码学实验报告 重庆大学.docx_第2页
第2页 / 共41页
密码学实验报告 重庆大学.docx_第3页
第3页 / 共41页
密码学实验报告 重庆大学.docx_第4页
第4页 / 共41页
密码学实验报告 重庆大学.docx_第5页
第5页 / 共41页
密码学实验报告 重庆大学.docx_第6页
第6页 / 共41页
密码学实验报告 重庆大学.docx_第7页
第7页 / 共41页
密码学实验报告 重庆大学.docx_第8页
第8页 / 共41页
密码学实验报告 重庆大学.docx_第9页
第9页 / 共41页
密码学实验报告 重庆大学.docx_第10页
第10页 / 共41页
密码学实验报告 重庆大学.docx_第11页
第11页 / 共41页
密码学实验报告 重庆大学.docx_第12页
第12页 / 共41页
密码学实验报告 重庆大学.docx_第13页
第13页 / 共41页
密码学实验报告 重庆大学.docx_第14页
第14页 / 共41页
密码学实验报告 重庆大学.docx_第15页
第15页 / 共41页
密码学实验报告 重庆大学.docx_第16页
第16页 / 共41页
密码学实验报告 重庆大学.docx_第17页
第17页 / 共41页
密码学实验报告 重庆大学.docx_第18页
第18页 / 共41页
密码学实验报告 重庆大学.docx_第19页
第19页 / 共41页
密码学实验报告 重庆大学.docx_第20页
第20页 / 共41页
亲,该文档总共41页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

密码学实验报告 重庆大学.docx

《密码学实验报告 重庆大学.docx》由会员分享,可在线阅读,更多相关《密码学实验报告 重庆大学.docx(41页珍藏版)》请在冰点文库上搜索。

密码学实验报告 重庆大学.docx

密码学实验报告重庆大学

#include

#include

#include

usingnamespacestd;

intFindlocation(charc);

vectortable;

intmain()

{

intFindlocation(charc);

charinbuf;

intj;

stringM;

stringC;

cout<<"请在以下所显示的内容中选择要输入的内容:

\n";

for(inti=65;i<91;i++)

{

table.push_back(char(i));

}

for(i=0;i<26;i++)

{

cout<

}

cout<<"\n请输入密钥:

\n";

cin>>inbuf;

cout<<"请输入操作类型:

(1.加密2.解密)\n";

cin>>j;

if(j==1)

{

cout<<"请输入明文:

\n";

cin>>M;

for(i=0;i<(M.length());i++)

{

charm=char(M[i]);

C+=(Findlocation(inbuf)+Findlocation(m))%26+64;

}

cout<<"密文:

\n";

cout<

}

if(j==2)

{

cout<<"请输入密文:

\n";

cin>>C;

for(i=0;i

{

charc=char(C[i]);

if(Findlocation(c)-Findlocation(inbuf)!

=0)

{

M+=(Findlocation(c)-Findlocation(inbuf))%26+64;

}

else

{

M+=(Findlocation(c)-Findlocation(inbuf))%26+26+64;

}

}

cout<<"明文:

\n";

cout<

}

return0;

}

intFindlocation(charc)

{

for(inti=0;i<26;i++)

{

if(table[i]==c)

returni+1;

}

return0;

}

#include

voidmain()

{

intf[2][6]={1,2,3,4,5,6,5,6,4,1,2,3};

inti,j,k;

chara[255][6],b[255][6],d[255][6],e[255][6];

printf("密钥是:

\n");

for(i=0;i<2;i++)

{

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

{

printf("%d,",f[i][j]);

}

printf("\n");

}

printf("请输入文本信息并以#号结束\n");

for(i=0;i<255;i++)

{

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

{

scanf("%c",&a[i][j]);

if(a[i][j]=='#')

break;

}

if(a[i][j]=='#')

break;

}

printf("对文本信息进行加密:

\n");

printf("*********************\n");

printf("你输入的明文数组是:

\n");

for(i=0;i<255;i++)

{

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

{

if(a[i][j]!

='#')

printf("%c",a[i][j]);

else

break;

}

printf("\n");

if(a[i][j]=='#')

break;

}

intc,h;

c=i;

h=i;

for(i=0;i<=c;i++)

{

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

{

k=f[1][j]-1;

b[i][j]=a[i][k];

}

}

printf("加密后的密文数组是:

\n");

for(i=0;i<=c;i++)

{

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

{

printf("%c",b[i][j]);

}

printf("\n");

}

printf("密文是:

\n");

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

{

for(i=0;i<=c;i++)

{

printf("%c",b[i][j]);

}

}

printf("\n");

printf("对文本信息进行解密:

\n");

printf("*********************\n");

printf("你输入密文的数组是:

\n");

charp[255];

intnum=0;

for(i=0;i<=c;i++)

{

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

{

p[num]=a[i][j];

num++;

if(p[num]=='#')

break;

}

if(p[num]=='#')

break;

}

num=0;

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

{

for(i=0;i<=h;i++)

{

d[i][j]=p[num];

num++;

}

}

for(i=0;i<=h;i++)

{

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

{

printf("%c",d[i][j]);

}

printf("\n");

}

printf("解密后的明文数组为:

\n");

for(i=0;i<=h;i++)

{

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

{

k=f[1][j]-1;

e[i][j]=d[i][k];

}

}

for(i=0;i<=h;i++)

{

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

{

printf("%c",e[i][j]);

}

printf("\n");

}

printf("明文是:

\n");

for(i=0;i<=h;i++)

{

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

printf("%c",e[i][j]);

}

printf("\n");

}

//DES加密

#include

#include

#include

#include

#include

#include"windows.h"

usingnamespacestd;

staticunsignedchar

PC1[56]={56,48,40,32,24,16,8,

0,57,49,41,33,25,17,

9,1,58,50,42,34,26,

18,10,2,59,51,43,35,

62,54,46,38,30,22,14,

6,61,53,45,37,29,21,

13,5,60,52,44,36,28,

20,12,4,27,19,11,3},//PC-1将64位秘钥转为56位(去掉校验位)

shift[16]={1,1,2,2,2,2,2,2,1,2,2,2,2,2,2,1},//移位次数

PC2[48]={13,16,10,23,0,4,

2,27,14,5,20,9,

22,18,11,3,25,7,

15,6,26,19,12,1,

40,51,30,36,46,54,

29,39,50,44,32,47,

43,48,38,55,33,52,

45,41,49,35,28,31},//PC-256位秘钥压缩到48位

IP[64]={57,49,41,33,25,17,9,1,

59,51,43,35,27,19,11,3,

61,53,45,37,29,21,13,5,

63,55,47,39,31,23,15,7,

56,48,40,32,24,16,8,0,

58,50,42,34,26,18,10,2,

60,52,44,36,28,20,12,4,

62,54,46,38,30,22,14,6},//初始置换IP

E[48]={31,0,1,2,3,4,

3,4,5,6,7,8,

7,8,9,10,11,12,

11,12,13,14,15,16,

15,16,17,18,19,20,

19,20,21,22,23,24,

23,24,25,26,27,28,

27,28,29,30,31,0},//EBit-SelectionTable

//S盒

S1[4][16]={14,4,13,1,2,15,11,8,3,10,6,12,5,9,0,7,

0,15,7,4,14,2,13,1,10,6,12,11,9,5,3,8,

4,1,14,8,13,6,2,11,15,12,9,7,3,10,5,0,

15,12,8,2,4,9,1,7,5,11,3,14,10,0,6,13},

S2[4][16]={15,1,8,14,6,11,3,4,9,7,2,13,12,0,5,10,

3,13,4,7,15,2,8,14,12,0,1,10,6,9,11,5,

0,14,7,11,10,4,13,1,5,8,12,6,9,3,2,15,

13,8,10,1,3,15,4,2,11,6,7,12,0,5,14,9},

S3[4][16]={10,0,9,14,6,3,15,5,1,13,12,7,11,4,2,8,

13,7,0,9,3,4,6,10,2,8,5,14,12,11,15,1,

13,6,4,9,8,15,3,0,11,1,2,12,5,10,14,7,

1,10,13,0,6,9,8,7,4,15,14,3,11,5,2,12},

S4[4][16]={7,13,14,3,0,6,9,10,1,2,8,5,11,12,4,15,

13,8,11,5,6,15,0,3,4,7,2,12,1,10,14,9,

10,6,9,0,12,11,7,13,15,1,3,14,5,2,8,4,

3,15,0,6,10,1,13,8,9,4,5,11,12,7,2,14},

S5[4][16]={2,12,4,1,7,10,11,6,8,5,3,15,13,0,14,9,

14,11,2,12,4,7,13,1,5,0,15,10,3,9,8,6,

4,2,1,11,10,13,7,8,15,9,12,5,6,3,0,14,

11,8,12,7,1,14,2,13,6,15,0,9,10,4,5,3},

S6[4][16]={12,1,10,15,9,2,6,8,0,13,3,4,14,7,5,11,

10,15,4,2,7,12,9,5,6,1,13,14,0,11,3,8,

9,14,15,5,2,8,12,3,7,0,4,10,1,13,11,6,

4,3,2,12,9,5,15,10,11,14,1,7,6,0,8,13},

S7[4][16]={4,11,2,14,15,0,8,13,3,12,9,7,5,10,6,1,

13,0,11,7,4,9,1,10,14,3,5,12,2,15,8,6,

1,4,11,13,12,3,7,14,10,15,6,8,0,5,9,2,

6,11,13,8,1,4,10,7,9,5,0,15,14,2,3,12},

S8[4][16]={13,2,8,4,6,15,11,1,10,9,3,14,5,0,12,7,

1,15,13,8,10,3,7,4,12,5,6,11,0,14,9,2,

7,11,4,1,9,12,14,2,0,6,10,13,15,3,5,8,

2,1,14,7,4,10,8,13,15,12,9,0,3,5,6,11},

P[32]={15,6,19,20,

28,11,27,16,

0,14,22,25,

4,17,30,9,

1,7,23,13,

31,26,2,8,

18,12,29,5,

21,10,3,24},//置换P

IP_inverse[64]={39,7,47,15,55,23,63,31,

38,6,46,14,54,22,62,30,

37,5,45,13,53,21,61,29,

36,4,44,12,52,20,60,28,

35,3,43,11,51,19,59,27,

34,2,42,10,50,18,58,26,

33,1,41,9,49,17,57,25,

32,0,40,8,48,16,56,24};//IP的逆置换

voidlrotate(char*array,intlength,intcount)

//将array数组(length个元素)循环左移count次

{

vectortemp;

temp.resize(length);

for(inti=0;i

temp[i]=array[i+count];

for(i=0;i

temp[length-count+i]=array[i];

}

for(i=0;i

//cout

array[i]=temp[i];

}

}

//------------------------------------------------------------------------------

classDES

{

private:

intsubKeys[17][48];//16个子密钥

intreadBMP(FILE*bmp,char*strBuf);//从BMP文件中一次读出8个字节信息到buf中

intwriteBMP(FILE*bmp,char*strOld,intnobj);//将nobj字节信息写到BMP文件中

public:

DES(char*skey);//构造函数,用于生成密钥

voidprintKey();//输出密钥仅供测试使用

voidcryptography(FILE*fin,FILE*fout,intmode);//加\解密函数,0为加密1为解密

};

DES:

:

DES(char*skey)

{

charkey[64],key_without_check[56],//原始密钥、去掉校验位的密钥

C[17][28],D[17][28],CD[17][56];//密钥的左右两部分

inti=0;

//============================密钥处理部分==============================

//8字节密钥转为64位的字符数组

while(*skey!

=NULL){

charcharacter=*skey;

for(intj=128,s=7;j>=1;j=j/2,s--)

key[i++]=(character&j)>>s;

skey++;

}

//利用PC1去掉奇偶校验位密钥变为56位

for(i=0;i<56;i++)

key_without_check[i]=key[PC1[i]];

//=============

//for(i=0;i<56;i++)

//cout

//=============

//分成左右两部分得到C0,D0

for(i=0;i<28;i++){

C[0][i]=key_without_check[i];

D[0][i]=key_without_check[i+28];

}

//循环左移,得到C1-C16,D1-D16

for(i=1;i<=16;i++){

for(intj=0;j<28;j++){

C[i][j]=C[i-1][j];

D[i][j]=D[i-1][j];

}

//左移

lrotate(C[i],28,shift[i-1]);

lrotate(D[i],28,shift[i-1]);

}

//使用PC2压缩密钥56位密钥变为48位至此,得到最终16个子密钥subKeys

for(i=1;i<=16;i++)

for(intj=0;j<28;j++){

CD[i][j]=C[i][j];

CD[i][j+28]=D[i][j];

}

for(i=1;i<=16;i++)

for(intj=0;j<48;j++)

subKeys[i][j]=CD[i][PC2[j]];

cout<<"ok!

"<

//OK====================================================================

}

voidDES:

:

printKey()

{

for(inti=1;i<=16;i++){

for(intj=0;j<48;j++)

cout<

cout<<"\n";

}

}

intDES:

:

readBMP(FILE*bmp,char*strBuf)

//从BMP文件中一次读出8个字节信息到buf中不足8个字节部分补零返回实际读入的字节数

{

intnobj;

//如果文件已经结束

if(feof(bmp)!

=0){

return-1;

}

//如果文件未结束

else{

nobj=fread(strBuf,sizeof(char),8,bmp);

//不足64字节部分补零

if(nobj<8){

for(inti=nobj;i<8;i++)

strBuf[i]=0;

}

returnnobj;

}

}

intDES:

:

writeBMP(FILE*bmp,char*strOld,intnobj)

//nobj字节信息写到BMP文件中,

{

//写入

fwrite(strOld,sizeof(char),nobj,bmp);

returnnobj;

}

voidDES:

:

cryptography(FILE*fin,FILE*fout,intmode)

//DES加解密函数,bmp为位图图像文件名

{

charstrBuf[8],strOld[8],preCipher[8]={0};//初始输入的8字节明文每次加密后产生的密文

charplain[64],//变换成64位之后的数组

M_IP[64],//经过初始置换的明文

L[17][32],R[17][32],

E_R[17][32],//扩展后的Rn

XOR_kR[17][32],//与密钥异或后的Rn

B[8][6],S_B[8][4],//8个S盒的输入输出

S[32],//S盒的完整输出

f[32],//f函数经过P置换的结果

RL[32],//交换左右部分的结果

cipher[64];//最后的密文输出

intcount=0;

//加密文件

intnobj=readBMP(fin,strBuf);

while(nobj>0){

//8字节明文s

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 解决方案 > 学习计划

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2