永发信息网

高分求一个DES加密算法源程序!

答案:1  悬赏:80  手机版
解决时间 2021-04-20 10:44
  • 提问者网友:最爱你的唇
  • 2021-04-20 05:49
高分求一个能在VC上运行的DES加密算法源程序!
最佳答案
  • 五星知识达人网友:西风乍起
  • 2021-04-20 07:14

#include<iostream.h>
#include<string.h>

//s盒变换,首末两位决定行,中间四位决定列

void dd(int aa[6],int &hang,int &lie)
{
hang=aa[0]*2+aa[5];
lie=aa[1]*8+aa[2]*4+aa[3]*2+aa[4];
}


int main()
{

int cnt=0;
char mingwen[9]={"SB"};//明文8位 mingwen[9]='\0';
char key[9]={"12345678"};//密钥8位


int minint[64];//明文
int keyint[64];//密钥
int miwen[64];//密文

//明文密文转换为2进制
int i=0,j=0,m=0,n=0;
//gets(mingwen);
//gets(key);
for(i=0;i<64;i++)//用于存储明文化为二进制
minint[i]=0;
for(i=0;i<64;i++)//用于存储密钥二进制
keyint[i]=0;
for(i=0;i<8;i++)//明文化位2进制
{
int temp=(int)mingwen[i];
int z=0;
for(z=7;z>=0;z--)
{
minint[8*i+z]=temp%2;
temp=temp/2;
cnt++;
}
}
for(i=0;i<8;i++)//密钥化位2进制
{
int temp=(int)key[i];
int z;
for(z=7;z>=0;z--)
{
keyint[8*i+z]=temp%2;
temp=temp/2;
}
}






int pc1[56]={ //pc1 置换表
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};
int pc2[48]={ //pc2置换表
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 };


int beginip[64]={ //初始置换IP
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 };

int zhihuanE[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 };
int zhihuanP[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 };
int zhihuanpp[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};

int ss[8][64]={14, 4,13, 1, 2,15,11, 8, 3,10, 6,12, 5, 9, 0, 7,//s盒
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,




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,





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,




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,




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,




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,





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,




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 };










int pc1key[56]; //用于存放经pc1置换后的密钥
for(i=0;i<56;i++)
{ //进行pc-1置换
pc1key[i]=keyint[pc1[i]];
// cout<<pc1key[i]<<" ";
}


int leftkey[28];
int rightkey[28];


for(j=0;j<28;j++)//将密钥分为两部分leftkey,rightkey
{
leftkey[j]=pc1key[j];
rightkey[j]=pc1key[j+28];
}


int lun=1; //记录所进行的轮数
int movleft[17]={ 0,1,1,2,2,2,2,2,2,1,2,2,2,2,2,2,1};














int ww[64];//辅助数组ww[64],将明文做初始ip置换
for(i=0;i<64;i++)
{
ww[i]=minint[i];
}
for(i=0;i<64;i++)
minint[i]=ww[beginip[i]];


int leftmin[32];//将明文分为两部分leftmin,rightmin
int rightmin[32];


for(j=0;j<32;j++)
{
leftmin[j]=minint[j];

rightmin[j]=minint[j+32];
}









int keykey[16][48];
int s=0;
for(s=0;s<16;s++)
{





int temp=0;
int temp1[28],temp2[28];//temp1,temp2分别作为辅助数组控制密钥左半部分,右半部分左移
for(j=0;j<28;j++)
{
temp1[j]=leftkey[j];
temp2[j]=rightkey[j]; }
for(j=0;j<28;j++)
{
leftkey[j]=temp1[(j+movleft[lun]+28)%28];
rightkey[j]=temp2[(j+movleft[lun]+28)%28];
}

//将左右部分密钥合在一起
int pc2keytemp[56];
for(i=0;i<28;i++)
{
pc2keytemp[i]=leftkey[i];
pc2keytemp[i+28]=rightkey[i]; }
//进行pc2置换,得到48位子密钥
int pc2key[48];
for(i=0;i<48;i++)
{
pc2key[i]=pc2keytemp[pc2[i]];

keykey[s][i]=pc2keytemp[pc2[i]];
}







int lefttemp[32];//保存左右部分明文
int righttemp[32];
for(i=0;i<32;i++)
{
lefttemp[i]=leftmin[i];
righttemp[i]=rightmin[i];
}
//进行E表扩展置换
int kk[48];
for(i=0;i<48;i++)

kk[i]=rightmin[zhihuanE[i]];
//扩展后的48比特与子密钥异或
for(i=0;i<48;i++)
kk[i]=pc2key[i]^kk[i];
//得到的比特流分成8个6比特,
int cc[8][6];
n=0;
for(i=0;i<8;i++)
{
for(j=0;j<6;j++)
{

cc[i][j]=kk[n++];
}
}
int tt[32];
int coutt=0;
int hang=0,lie=0;
//经过s盒变换 6位输入,四位输出
for(i=0;i<8;i++)
{
dd(cc[i],hang,lie);
int xx=ss[i][hang*16+lie];
int z=3;

for(z=3;z>=0;z--)
{
tt[i*4+z]=xx%2;
xx=xx/2;
}
}
//开始置换P
int dd[32];

for(i=0;i<32;i++)
{
dd[i]=tt[zhihuanP[i]];
}




//leftmin的32位与置换P得到的32位异或
for(i=0;i<32;i++)
dd[i]=dd[i]^leftmin[i];
//异或后得到的32位作为有半部分,上一轮的有半部分作为左半部分

for(i=0;i<32;i++)
{
leftmin[i]=righttemp[i];
rightmin[i]=dd[i];
}
lun++;
}



//经过16次轮变换后将左右两部分交换
int o;
for(i=0;i<32;i++)
{
o=leftmin[i];
leftmin[i]=rightmin[i];
rightmin[i]=o;
}
//经过逆初始置换得到密文
for(i=0;i<32;i++)
{
minint[i]=leftmin[i];
minint[i+32]=rightmin[i];

}
for(i=0;i<64;i++)
{
miwen[i]=minint[zhihuanpp[i]];
}
for(i=0;i<64;i++)

cout<<miwen[i];
cout<<endl;
//将二进制转化成char型输出
char michar[8];
for(i=0;i<8;i++)
{
long int qq=0;
for(j=0;j<8;j++)

{
qq=(miwen[j+8*i]+qq)*2;
}
qq=qq/2;
michar[i]=(char)(qq);
}
cout<<"加密得到的密文为: ";
for(i=0;i<8;i++)
cout<<michar[i];
cout<<endl;
















//解密过程与加密过程算法相同,只是子密钥使用的顺序相反




lun=1;
s=0;
for(i=0;i<8;i++)
mingwen[i]=michar[i];



for(s=0;s<16;s++)
{
//对明文进行处理
int lefttemp[32];//保存左右部分明文
int righttemp[32];
for(i=0;i<32;i++)
{
lefttemp[i]=leftmin[i];
righttemp[i]=rightmin[i];
}
//进行E表扩展置换
int kk[48];
for(i=0;i<48;i++)
kk[i]=rightmin[zhihuanE[i]];
//扩展后的48比特与子密钥异或
for(i=0;i<48;i++)
kk[i]=keykey[16-lun][i]^kk[i];////注意此处密钥顺序跟加密相反////
//得到的比特流分成8个6比特
int cc[8][6];
n=0;
for(i=0;i<8;i++)//将kk分为8个6位数
{
for(j=0;j<6;j++)
{

cc[i][j]=kk[n++];
}
}
int tt[32];
int coutt=0;
int hang=0,lie=0;
for(i=0;i<8;i++)
{
dd(cc[i],hang,lie);
int xx=ss[i][hang*16+lie];
int z=3;
for(z=3;z>=0;z--)
{
tt[i*4+z]=xx%2;
xx=xx/2;
}
}


//开始置换P
int dd[32];
for(i=0;i<32;i++)

{
dd[i]=tt[zhihuanP[i]];
}




//leftmin的32位与置换P得到的32位异或
for(i=0;i<32;i++)
dd[i]=dd[i]^leftmin[i];
//异或后得到的32位作为有半部分,上一轮的有半部分作为左半部分
for(i=0;i<32;i++)
{
leftmin[i]=righttemp[i];
rightmin[i]=dd[i];

}
lun++;
}
//经过16次轮变换后将左右两部分交换
//int o;
for(i=0;i<32;i++)

{
o=leftmin[i];
leftmin[i]=rightmin[i];
rightmin[i]=o;

}
//经过逆初始置换得到密文
for(i=0;i<32;i++)
{
minint[i]=leftmin[i];
minint[i+32]=rightmin[i];
}

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

miwen[i]=minint[zhihuanpp[i]];
}

//将二进制转化成char型输出
char jiemichar[8];

for(i=0;i<8;i++)
{
long int qq=0;
for(j=0;j<8;j++)

{
qq=(miwen[j+8*i]+qq)*2;
}
qq=qq/2;
jiemichar[i]=(char)(qq);
}
cout<<"解密得到的明文为: ";

for(i=0;i<8;i++)
cout<<jiemichar[i];
cout<<endl;
return 0;

}


ps:可以自己设置明码和密钥。。




我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯