#include <iostream>
#include<bitset>
#include<string>
using namespace std;
void leftmov(string &r) //左移函数
{
bitset<28> bits1(r,0,28);
bitset<28> bits2(r,0,1);
bitset<28> bits3(r,28,28);
bitset<28> bits4(r,28,1);
bits1 = bits1<<1;
bits3 = bits3<<1;
bits1 = bits2|bits1;
bits3 = bits3|bits4;
r = bits1.to_string() +bits3.to_string();
}
void xor(string &r1,string &r2) //f函数内异或函数
{
bitset<48> m1(r1);
bitset<48> m2(r2);
m2 = m1^m2;
r2 = m2.to_string();
}
void xor2(string &r3,string &r4) //左右32位异或函数
{
bitset<32> m3(r3);
bitset<32> m4(r4);
m4 = m3^m4;
r4 = m4.to_string();
}
void ox_to_b(string &ppx,string &ppz) //16进制字符串转换2进制函数
{ string ppl[16];
for(int zz = 0;zz<16;zz++) ppl[zz] ='0000';
for(int cv = 0;cv<16;cv++)
{
switch(ppx[cv]){
case '0': ppl[cv] = "0000";break;
case '1': ppl[cv] = "0001";break;
case '2': ppl[cv] = "0010";break;
case '3': ppl[cv] = "0011";break;
case '4': ppl[cv] = "0100";break;
case '5': ppl[cv] = "0101";break;
case '6': ppl[cv] = "0110";break;
case '7': ppl[cv] = "0111";break;
case '8': ppl[cv] = "1000";break;
case '9': ppl[cv] = "1001";break;
case 'A': ppl[cv] = "1010";break;
case 'a': ppl[cv] = "1010";break;
case 'B': ppl[cv] = "1011";break;
case 'b': ppl[cv] = "1011";break;
case 'C': ppl[cv] = "1100";break;
case 'c': ppl[cv] = "1100";break;
case 'D': ppl[cv] = "1101";break;
case 'd': ppl[cv] = "1101";break;
case 'E': ppl[cv] = "1110";break;
case 'e': ppl[cv] = "1110";break;
case 'F': ppl[cv] = "1111";break;
default: ppl[cv] = "1111";break;}
}
ppz = ppl[0] +ppl[1]+ppl[2]+ppl[3]+ppl[4]+ppl[5]+ppl[6]+ppl[7]+ppl[8]+ppl[9]+ppl[10]+ppl[11]+ppl[12]+ppl[13]+ppl[14]+ppl[15];
}//2017.3.30
void main()
//0011000100110010001100110011010000110101001101100011011100111000(64位密钥)
//3132333435363738(16)
//0011000000110001001100100011001100110100001101010011011000110111(64位明文)
//3031323334353637(16)
//1000101110110100011110100000110011110000101010010110001001101101(64位密文)
//以上是实验数
{
unsigned int z1[56] = { 57,49,41,33,25,17,9, //置换选择1表
1,58,50,42,34,26,18,
10,2,59,51,43,35,27,
19,11,3,60,52,44,36,
63,55,47,39,31,23,15,
7,62,54,46,38,30,22,
14,6,61,53,45,37,29,
21,13,5,28,20,12,4};
unsigned int z2[48] = {14,17,11,24,1,5, //置换选择2表
3,28,15,6,21,10,
23,19,12,4,26,8,
16,7,27,20,13,2,
41,52,31,37,47,55,
30,40,51,45,33,48,
44,49,39,56,34,53,
46,42,50,36,29,32};
unsigned int cirs[16] = {1,1,2,2,2,2,2,2,1,2,2,2,2,2,2,1}; //左移位数表
unsigned int ip[64] = {58,50,42,34,26,18,10,2, //初始置换IP表
60,52,44,36,28,20,12,4,
62,54,46,38,30,22,14,6,
64,56,48,40,32,24,16,8,
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,};
unsigned int xip[64] = {40,8,48,16,56,24,64,32, //逆初始置换IP表
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};
unsigned int xe[48] = {32,1,2,3,4,5, //选择运算E表
4,5,6,7,8,9,
8,9,10,11,12,13,
12,13,14,15,16,17,
16,17,18,19,20,21,
20,21,22,23,24,25,
24,25,26,27,28,29,
28,29,30,31,32,1};
//s盒表
unsigned int sbox[16][64] = {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,
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 };
unsigned int P[32] = {16,7,20,21, //置换运算P表
29,12,28,17,
1,15,23,26,
5,18,31,10,
2,8,24,14,
32,27,3,9,
19,13,30,6,
22,11,4,25};
//开始
int skt; //第一部分:密钥
string s1(64,'1');
string ssg(16,'1');
cout<<"请选择:1.输入64位2进制密钥:"<<endl<<" 2.输入16位16进制密钥"<<endl; //选择输入
cin>>skt;
if(skt==1)
{
cout<<"请输入64位2进制密钥:"<<endl;
cin>>s1;
}
else
{
cout<<"请输入16位16进制密钥:"<<endl;
cin>>ssg;
ox_to_b(ssg,s1);
cout<<s1<<endl; //s1为64位初始密钥字符串
}
string s2(56,'1');
string key[16];
for(int g = 0;g<16;g++)
key[g] ="111111111111111111111111111111111111111111111111";
string sb[8]; //s盒内4位字符串初始化
for(int n = 0;n<8;n++)
sb[n] = "1111";
for(int i = 0;i<56;i++) //置换选择1
{
s2[i] = s1[z1[i]-1];
}
for(int e = 0;e<16;e++) //循环左移
{
if(cirs[e]==1)
{leftmov(s2);}
else
{
leftmov(s2);
leftmov(s2);
}
for(int u = 0;u<48;u++) //置换选择2
{key[e][u] = s2[z2[u]-1];}
}
for(int t = 0;t<16;t++)
cout<<"k"<<t<<":"<<key[t]<<endl; //输出全部密钥
//密钥模块2017.3.25/1:20
string ming(64,'1'); //第二部分:明文
string uu(16,'1');
int ok; //明文输入选择
cout<<"请选择1.输入16位16进制明文"<<endl<<" 2.输入64位2进制明文"<<endl;
cin>>ok;
if(ok == 1)
{
cout<<"请输入16位16进制明文:"<<endl;
cin>>uu;
ox_to_b(uu,ming);
cout<<ming<<endl;
}
else{
cout<<"请输入64位2进制明文:"<<endl;
cin>>ming;
}
string ming2(64,'1'); //ming是明文
for(int h = 0;h<64;h++) //初始ip置换
{ming2[h] = ming[ip[h]-1];}
string le(32,'1');
string be(32,'1');
string se(48,'1');
string nb(32,'1');
for(int j = 0;j<32;j++)
{be[j] = ming2[32+j];
le[j] = ming2[j];}
cout<<"L0:"<<le<<endl;
cout<<"R0:"<<be<<endl;
cout<<endl;
for(int mmp = 0;mmp<16;mmp++) //DES整体核心循环
{
for(int r = 0;r<48;r++)
{se[r] = be[xe[r]-1];}
xor(key[mmp],se);
string k1 = "11";
for(int p = 0;p<8;p++) //s盒
{
k1[0] = se[6*p];
k1[1] = se[6*p+5];
bitset<2> c9(k1);
bitset<4> omg(se,6*p+1,4);
bitset<4> rng(sbox[p][c9.to_ulong()*16+omg.to_ulong()]);
sb[p] = rng.to_string();
}
string mid = sb[0]+sb[1]+sb[2] +sb[3] +sb[4]+sb[5] +sb[6] +sb[7];
for(int ig = 0;ig<32;ig++) //置换运算P
nb[ig] = mid[P[ig]-1];
xor2(le,nb); //左右32位异或
le = be;
be = nb;
if(mmp!=15)
{cout<<"L"<<(mmp+1)<<":"<<le<<endl; //输出L0,R0
cout<<"R"<<(mmp+1)<<":"<<be<<endl;
cout<<endl;}
}
nb = le; //L16,R16输出
le = be;
be = nb;
cout<<"L16:"<<le<<endl;
cout<<"R16:"<<be<<endl;
cout<<endl;
string fin = le+be;
string fina(64,'1');
for(int d = 0;d<64;d++) //逆初始置换
fina[d] = fin[xip[d]-1];
cout<<"密文为:"<<fina<<endl;
//2017.3.28
#include <iostream>
#include<bitset>
#include<string>
using namespace std;
void leftmov(string &r) //左移函数
{
bitset<28> bits1(r,0,28);
bitset<28> bits2(r,0,1);
bitset<28> bits3(r,28,28);
bitset<28> bits4(r,28,1);
bits1 = bits1<<1;
bits3 = bits3<<1;
bits1 = bits2|bits1;
bits3 = bits3|bits4;
r = bits1.to_string() +bits3.to_string();
}
void xor(string &r1,string &r2) //f函数内异或函数
{
bitset<48> m1(r1);
bitset<48> m2(r2);
m2 = m1^m2;
r2 = m2.to_string();
}
void xor2(string &r3,string &r4) //左右32位异或函数
{
bitset<32> m3(r3);
bitset<32> m4(r4);
m4 = m3^m4;
r4 = m4.to_string();
}
void ox_to_b(string &ppx,string &ppz) //16进制字符串转换2进制函数
{ string ppl[16];
for(int zz = 0;zz<16;zz++) ppl[zz] ='0000';
for(int cv = 0;cv<16;cv++)
{
switch(ppx[cv]){
case '0': ppl[cv] = "0000";break;
case '1': ppl[cv] = "0001";break;
case '2': ppl[cv] = "0010";break;
case '3': ppl[cv] = "0011";break;
case '4': ppl[cv] = "0100";break;
case '5': ppl[cv] = "0101";break;
case '6': ppl[cv] = "0110";break;
case '7': ppl[cv] = "0111";break;
case '8': ppl[cv] = "1000";break;
case '9': ppl[cv] = "1001";break;
case 'A': ppl[cv] = "1010";break;
case 'a': ppl[cv] = "1010";break;
case 'B': ppl[cv] = "1011";break;
case 'b': ppl[cv] = "1011";break;
case 'C': ppl[cv] = "1100";break;
case 'c': ppl[cv] = "1100";break;
case 'D': ppl[cv] = "1101";break;
case 'd': ppl[cv] = "1101";break;
case 'E': ppl[cv] = "1110";break;
case 'e': ppl[cv] = "1110";break;
case 'F': ppl[cv] = "1111";break;
default: ppl[cv] = "1111";break;}
}
ppz = ppl[0] +ppl[1]+ppl[2]+ppl[3]+ppl[4]+ppl[5]+ppl[6]+ppl[7]+ppl[8]+ppl[9]+ppl[10]+ppl[11]+ppl[12]+ppl[13]+ppl[14]+ppl[15];
}//2017.3.30
void main()
//0011000100110010001100110011010000110101001101100011011100111000(64位密钥)
//3132333435363738
//0011000000110001001100100011001100110100001101010011011000110111(64位明文)
//3031323334353637
//1000101110110100011110100000110011110000101010010110001001101101(64位密文)
//8bb47a0cf0a9626d
//以上是实验数
{
unsigned int z1[56] = { 57,49,41,33,25,17,9, //置换选择1表
1,58,50,42,34,26,18,
10,2,59,51,43,35,27,
19,11,3,60,52,44,36,
63,55,47,39,31,23,15,
7,62,54,46,38,30,22,
14,6,61,53,45,37,29,
21,13,5,28,20,12,4};
unsigned int z2[48] = {14,17,11,24,1,5, //置换选择2表
3,28,15,6,21,10,
23,19,12,4,26,8,
16,7,27,20,13,2,
41,52,31,37,47,55,
30,40,51,45,33,48,
44,49,39,56,34,53,
46,42,50,36,29,32};
unsigned int cirs[16] = {1,1,2,2,2,2,2,2,1,2,2,2,2,2,2,1}; //左移位数表
unsigned int ip[64] = {58,50,42,34,26,18,10,2, //初始置换IP表
60,52,44,36,28,20,12,4,
62,54,46,38,30,22,14,6,
64,56,48,40,32,24,16,8,
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,};
unsigned int xip[64] = {40,8,48,16,56,24,64,32, //逆初始置换IP表
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};
unsigned int xe[48] = {32,1,2,3,4,5, //选择运算E表
4,5,6,7,8,9,
8,9,10,11,12,13,
12,13,14,15,16,17,
16,17,18,19,20,21,
20,21,22,23,24,25,
24,25,26,27,28,29,
28,29,30,31,32,1};
//s盒表
unsigned int sbox[16][64] = {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,
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 };
unsigned int P[32] = {16,7,20,21, //置换运算P表
29,12,28,17,
1,15,23,26,
5,18,31,10,
2,8,24,14,
32,27,3,9,
19,13,30,6,
22,11,4,25};
//开始
int skt; //第一部分:密钥
int kt;
string s1(64,'1');
string ssg(16,'1');
string temp(64,'1');
cout<<"请选择:1.加密"<<endl<<" 2.解密"<<endl;
cin>>kt;
cout<<"请选择:1.输入64位2进制密钥:"<<endl<<" 2.输入16位16进制密钥"<<endl; //选择输入
cin>>skt;
if(skt==1)
{
cout<<"请输入64位2进制密钥:"<<endl;
cin>>s1;
}
else
{
cout<<"请输入16位16进制密钥:"<<endl;
cin>>ssg;
ox_to_b(ssg,s1);
cout<<s1<<endl; //s1为64位初始密钥字符串
}
string s2(56,'1');
string key[16];
for(int g = 0;g<16;g++)
key[g] ="111111111111111111111111111111111111111111111111";
string sb[8]; //s盒内4位字符串初始化
for(int n = 0;n<8;n++)
sb[n] = "1111";
for(int i = 0;i<56;i++) //置换选择1
{
s2[i] = s1[z1[i]-1];
}
for(int e = 0;e<16;e++) //循环左移
{
if(cirs[e]==1)
{leftmov(s2);}
else
{
leftmov(s2);
leftmov(s2);
}
for(int u = 0;u<48;u++) //置换选择2
{key[e][u] = s2[z2[u]-1];}
}
if(kt==2)
{for(int jj = 0;jj<8;jj++) //解密密钥逆置
{
temp=key[jj];
key[jj] = key[15-jj];
key[15-jj] = temp;
}
}
for(int t = 0;t<16;t++)
cout<<"k"<<t<<":"<<key[t]<<endl; //输出全部密钥
//密钥模块2017.3.25/1:20
string ming(64,'1'); //第二部分:明文或密文
string uu(16,'1');
int ok; //明文或密文输入选择
if(kt==1)
{
cout<<"请选择1.输入16位16进制明文"<<endl<<" 2.输入64位2进制明文"<<endl;
cin>>ok;
if(ok == 1)
{
cout<<"请输入16位16进制明文:"<<endl;
cin>>uu;
ox_to_b(uu,ming);
cout<<ming<<endl;
}
else{
cout<<"请输入64位2进制明文:"<<endl;
cin>>ming;
}
}
else
{
cout<<"请选择1.输入16位16进制密文"<<endl<<" 2.输入64位2进制密文"<<endl;
cin>>ok;
if(ok == 1)
{
cout<<"请输入16位16进制密文:"<<endl;
cin>>uu;
ox_to_b(uu,ming);
cout<<ming<<endl;
}
else{
cout<<"请输入64位2进制密文:"<<endl;
cin>>ming;
}
}
string ming2(64,'1'); //ming是明文
for(int h = 0;h<64;h++) //初始ip置换
{ming2[h] = ming[ip[h]-1];}
string le(32,'1');
string be(32,'1');
string se(48,'1');
string nb(32,'1');
for(int j = 0;j<32;j++)
{be[j] = ming2[32+j];
le[j] = ming2[j];}
cout<<"L0:"<<le<<endl;
cout<<"R0:"<<be<<endl;
cout<<endl;
for(int mmp = 0;mmp<16;mmp++) //DES整体核心循环
{
for(int r = 0;r<48;r++)
{se[r] = be[xe[r]-1];}
xor(key[mmp],se);
string k1 = "11";
for(int p = 0;p<8;p++) //s盒
{
k1[0] = se[6*p];
k1[1] = se[6*p+5];
bitset<2> c9(k1);
bitset<4> omg(se,6*p+1,4);
bitset<4> rng(sbox[p][c9.to_ulong()*16+omg.to_ulong()]);
sb[p] = rng.to_string();
}
string mid = sb[0]+sb[1]+sb[2] +sb[3] +sb[4]+sb[5] +sb[6] +sb[7];
for(int ig = 0;ig<32;ig++) //置换运算P
nb[ig] = mid[P[ig]-1];
xor2(le,nb); //左右32位异或
le = be;
be = nb;
if(mmp!=15)
{cout<<"L"<<(mmp+1)<<":"<<le<<endl; //输出L0,R0
cout<<"R"<<(mmp+1)<<":"<<be<<endl;
cout<<endl;}
}
nb = le; //L16,R16输出
le = be;
be = nb;
cout<<"L16:"<<le<<endl;
cout<<"R16:"<<be<<endl;
cout<<endl;
string fin = le+be;
string fina(64,'1');
for(int d = 0;d<64;d++) //逆初始置换
fina[d] = fin[xip[d]-1];
if(kt==1)
cout<<"密文为:"<<fina<<endl;
else
cout<<"明文为:"<<fina<<endl;
//2017.3.28
}
由于DES是对合运算,解密只需要在原来的基础上,把密钥逆置就ok了。
#include<bitset>
#include<string>
using namespace std;
void leftmov(string &r) //左移函数
{
bitset<28> bits1(r,0,28);
bitset<28> bits2(r,0,1);
bitset<28> bits3(r,28,28);
bitset<28> bits4(r,28,1);
bits1 = bits1<<1;
bits3 = bits3<<1;
bits1 = bits2|bits1;
bits3 = bits3|bits4;
r = bits1.to_string() +bits3.to_string();
}
void xor(string &r1,string &r2) //f函数内异或函数
{
bitset<48> m1(r1);
bitset<48> m2(r2);
m2 = m1^m2;
r2 = m2.to_string();
}
void xor2(string &r3,string &r4) //左右32位异或函数
{
bitset<32> m3(r3);
bitset<32> m4(r4);
m4 = m3^m4;
r4 = m4.to_string();
}
void ox_to_b(string &ppx,string &ppz) //16进制字符串转换2进制函数
{ string ppl[16];
for(int zz = 0;zz<16;zz++) ppl[zz] ='0000';
for(int cv = 0;cv<16;cv++)
{
switch(ppx[cv]){
case '0': ppl[cv] = "0000";break;
case '1': ppl[cv] = "0001";break;
case '2': ppl[cv] = "0010";break;
case '3': ppl[cv] = "0011";break;
case '4': ppl[cv] = "0100";break;
case '5': ppl[cv] = "0101";break;
case '6': ppl[cv] = "0110";break;
case '7': ppl[cv] = "0111";break;
case '8': ppl[cv] = "1000";break;
case '9': ppl[cv] = "1001";break;
case 'A': ppl[cv] = "1010";break;
case 'a': ppl[cv] = "1010";break;
case 'B': ppl[cv] = "1011";break;
case 'b': ppl[cv] = "1011";break;
case 'C': ppl[cv] = "1100";break;
case 'c': ppl[cv] = "1100";break;
case 'D': ppl[cv] = "1101";break;
case 'd': ppl[cv] = "1101";break;
case 'E': ppl[cv] = "1110";break;
case 'e': ppl[cv] = "1110";break;
case 'F': ppl[cv] = "1111";break;
default: ppl[cv] = "1111";break;}
}
ppz = ppl[0] +ppl[1]+ppl[2]+ppl[3]+ppl[4]+ppl[5]+ppl[6]+ppl[7]+ppl[8]+ppl[9]+ppl[10]+ppl[11]+ppl[12]+ppl[13]+ppl[14]+ppl[15];
}//2017.3.30
void main()
//0011000100110010001100110011010000110101001101100011011100111000(64位密钥)
//3132333435363738(16)
//0011000000110001001100100011001100110100001101010011011000110111(64位明文)
//3031323334353637(16)
//1000101110110100011110100000110011110000101010010110001001101101(64位密文)
//以上是实验数
{
unsigned int z1[56] = { 57,49,41,33,25,17,9, //置换选择1表
1,58,50,42,34,26,18,
10,2,59,51,43,35,27,
19,11,3,60,52,44,36,
63,55,47,39,31,23,15,
7,62,54,46,38,30,22,
14,6,61,53,45,37,29,
21,13,5,28,20,12,4};
unsigned int z2[48] = {14,17,11,24,1,5, //置换选择2表
3,28,15,6,21,10,
23,19,12,4,26,8,
16,7,27,20,13,2,
41,52,31,37,47,55,
30,40,51,45,33,48,
44,49,39,56,34,53,
46,42,50,36,29,32};
unsigned int cirs[16] = {1,1,2,2,2,2,2,2,1,2,2,2,2,2,2,1}; //左移位数表
unsigned int ip[64] = {58,50,42,34,26,18,10,2, //初始置换IP表
60,52,44,36,28,20,12,4,
62,54,46,38,30,22,14,6,
64,56,48,40,32,24,16,8,
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,};
unsigned int xip[64] = {40,8,48,16,56,24,64,32, //逆初始置换IP表
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};
unsigned int xe[48] = {32,1,2,3,4,5, //选择运算E表
4,5,6,7,8,9,
8,9,10,11,12,13,
12,13,14,15,16,17,
16,17,18,19,20,21,
20,21,22,23,24,25,
24,25,26,27,28,29,
28,29,30,31,32,1};
//s盒表
unsigned int sbox[16][64] = {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,
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 };
unsigned int P[32] = {16,7,20,21, //置换运算P表
29,12,28,17,
1,15,23,26,
5,18,31,10,
2,8,24,14,
32,27,3,9,
19,13,30,6,
22,11,4,25};
//开始
int skt; //第一部分:密钥
string s1(64,'1');
string ssg(16,'1');
cout<<"请选择:1.输入64位2进制密钥:"<<endl<<" 2.输入16位16进制密钥"<<endl; //选择输入
cin>>skt;
if(skt==1)
{
cout<<"请输入64位2进制密钥:"<<endl;
cin>>s1;
}
else
{
cout<<"请输入16位16进制密钥:"<<endl;
cin>>ssg;
ox_to_b(ssg,s1);
cout<<s1<<endl; //s1为64位初始密钥字符串
}
string s2(56,'1');
string key[16];
for(int g = 0;g<16;g++)
key[g] ="111111111111111111111111111111111111111111111111";
string sb[8]; //s盒内4位字符串初始化
for(int n = 0;n<8;n++)
sb[n] = "1111";
for(int i = 0;i<56;i++) //置换选择1
{
s2[i] = s1[z1[i]-1];
}
for(int e = 0;e<16;e++) //循环左移
{
if(cirs[e]==1)
{leftmov(s2);}
else
{
leftmov(s2);
leftmov(s2);
}
for(int u = 0;u<48;u++) //置换选择2
{key[e][u] = s2[z2[u]-1];}
}
for(int t = 0;t<16;t++)
cout<<"k"<<t<<":"<<key[t]<<endl; //输出全部密钥
//密钥模块2017.3.25/1:20
string ming(64,'1'); //第二部分:明文
string uu(16,'1');
int ok; //明文输入选择
cout<<"请选择1.输入16位16进制明文"<<endl<<" 2.输入64位2进制明文"<<endl;
cin>>ok;
if(ok == 1)
{
cout<<"请输入16位16进制明文:"<<endl;
cin>>uu;
ox_to_b(uu,ming);
cout<<ming<<endl;
}
else{
cout<<"请输入64位2进制明文:"<<endl;
cin>>ming;
}
string ming2(64,'1'); //ming是明文
for(int h = 0;h<64;h++) //初始ip置换
{ming2[h] = ming[ip[h]-1];}
string le(32,'1');
string be(32,'1');
string se(48,'1');
string nb(32,'1');
for(int j = 0;j<32;j++)
{be[j] = ming2[32+j];
le[j] = ming2[j];}
cout<<"L0:"<<le<<endl;
cout<<"R0:"<<be<<endl;
cout<<endl;
for(int mmp = 0;mmp<16;mmp++) //DES整体核心循环
{
for(int r = 0;r<48;r++)
{se[r] = be[xe[r]-1];}
xor(key[mmp],se);
string k1 = "11";
for(int p = 0;p<8;p++) //s盒
{
k1[0] = se[6*p];
k1[1] = se[6*p+5];
bitset<2> c9(k1);
bitset<4> omg(se,6*p+1,4);
bitset<4> rng(sbox[p][c9.to_ulong()*16+omg.to_ulong()]);
sb[p] = rng.to_string();
}
string mid = sb[0]+sb[1]+sb[2] +sb[3] +sb[4]+sb[5] +sb[6] +sb[7];
for(int ig = 0;ig<32;ig++) //置换运算P
nb[ig] = mid[P[ig]-1];
xor2(le,nb); //左右32位异或
le = be;
be = nb;
if(mmp!=15)
{cout<<"L"<<(mmp+1)<<":"<<le<<endl; //输出L0,R0
cout<<"R"<<(mmp+1)<<":"<<be<<endl;
cout<<endl;}
}
nb = le; //L16,R16输出
le = be;
be = nb;
cout<<"L16:"<<le<<endl;
cout<<"R16:"<<be<<endl;
cout<<endl;
string fin = le+be;
string fina(64,'1');
for(int d = 0;d<64;d++) //逆初始置换
fina[d] = fin[xip[d]-1];
cout<<"密文为:"<<fina<<endl;
//2017.3.28
}
感悟:DES不愧为经典密码。
印象最深的是s盒非线性变换后的P扩散,进一步加大了密码破译的难度。
s盒的设计实在巧妙,佩服。
待续 。。。。。。。
by hubu David 2017
—————————————————————————————
____________________________________________________
____________________________________________________
____________________________分割线_____________________
2017年4月29日
修改后的DES算法,完整加解密
#include <iostream>
#include<bitset>
#include<string>
using namespace std;
void leftmov(string &r) //左移函数
{
bitset<28> bits1(r,0,28);
bitset<28> bits2(r,0,1);
bitset<28> bits3(r,28,28);
bitset<28> bits4(r,28,1);
bits1 = bits1<<1;
bits3 = bits3<<1;
bits1 = bits2|bits1;
bits3 = bits3|bits4;
r = bits1.to_string() +bits3.to_string();
}
void xor(string &r1,string &r2) //f函数内异或函数
{
bitset<48> m1(r1);
bitset<48> m2(r2);
m2 = m1^m2;
r2 = m2.to_string();
}
void xor2(string &r3,string &r4) //左右32位异或函数
{
bitset<32> m3(r3);
bitset<32> m4(r4);
m4 = m3^m4;
r4 = m4.to_string();
}
void ox_to_b(string &ppx,string &ppz) //16进制字符串转换2进制函数
{ string ppl[16];
for(int zz = 0;zz<16;zz++) ppl[zz] ='0000';
for(int cv = 0;cv<16;cv++)
{
switch(ppx[cv]){
case '0': ppl[cv] = "0000";break;
case '1': ppl[cv] = "0001";break;
case '2': ppl[cv] = "0010";break;
case '3': ppl[cv] = "0011";break;
case '4': ppl[cv] = "0100";break;
case '5': ppl[cv] = "0101";break;
case '6': ppl[cv] = "0110";break;
case '7': ppl[cv] = "0111";break;
case '8': ppl[cv] = "1000";break;
case '9': ppl[cv] = "1001";break;
case 'A': ppl[cv] = "1010";break;
case 'a': ppl[cv] = "1010";break;
case 'B': ppl[cv] = "1011";break;
case 'b': ppl[cv] = "1011";break;
case 'C': ppl[cv] = "1100";break;
case 'c': ppl[cv] = "1100";break;
case 'D': ppl[cv] = "1101";break;
case 'd': ppl[cv] = "1101";break;
case 'E': ppl[cv] = "1110";break;
case 'e': ppl[cv] = "1110";break;
case 'F': ppl[cv] = "1111";break;
default: ppl[cv] = "1111";break;}
}
ppz = ppl[0] +ppl[1]+ppl[2]+ppl[3]+ppl[4]+ppl[5]+ppl[6]+ppl[7]+ppl[8]+ppl[9]+ppl[10]+ppl[11]+ppl[12]+ppl[13]+ppl[14]+ppl[15];
}//2017.3.30
void main()
//0011000100110010001100110011010000110101001101100011011100111000(64位密钥)
//3132333435363738
//0011000000110001001100100011001100110100001101010011011000110111(64位明文)
//3031323334353637
//1000101110110100011110100000110011110000101010010110001001101101(64位密文)
//8bb47a0cf0a9626d
//以上是实验数
{
unsigned int z1[56] = { 57,49,41,33,25,17,9, //置换选择1表
1,58,50,42,34,26,18,
10,2,59,51,43,35,27,
19,11,3,60,52,44,36,
63,55,47,39,31,23,15,
7,62,54,46,38,30,22,
14,6,61,53,45,37,29,
21,13,5,28,20,12,4};
unsigned int z2[48] = {14,17,11,24,1,5, //置换选择2表
3,28,15,6,21,10,
23,19,12,4,26,8,
16,7,27,20,13,2,
41,52,31,37,47,55,
30,40,51,45,33,48,
44,49,39,56,34,53,
46,42,50,36,29,32};
unsigned int cirs[16] = {1,1,2,2,2,2,2,2,1,2,2,2,2,2,2,1}; //左移位数表
unsigned int ip[64] = {58,50,42,34,26,18,10,2, //初始置换IP表
60,52,44,36,28,20,12,4,
62,54,46,38,30,22,14,6,
64,56,48,40,32,24,16,8,
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,};
unsigned int xip[64] = {40,8,48,16,56,24,64,32, //逆初始置换IP表
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};
unsigned int xe[48] = {32,1,2,3,4,5, //选择运算E表
4,5,6,7,8,9,
8,9,10,11,12,13,
12,13,14,15,16,17,
16,17,18,19,20,21,
20,21,22,23,24,25,
24,25,26,27,28,29,
28,29,30,31,32,1};
//s盒表
unsigned int sbox[16][64] = {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,
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 };
unsigned int P[32] = {16,7,20,21, //置换运算P表
29,12,28,17,
1,15,23,26,
5,18,31,10,
2,8,24,14,
32,27,3,9,
19,13,30,6,
22,11,4,25};
//开始
int skt; //第一部分:密钥
int kt;
string s1(64,'1');
string ssg(16,'1');
string temp(64,'1');
cout<<"请选择:1.加密"<<endl<<" 2.解密"<<endl;
cin>>kt;
cout<<"请选择:1.输入64位2进制密钥:"<<endl<<" 2.输入16位16进制密钥"<<endl; //选择输入
cin>>skt;
if(skt==1)
{
cout<<"请输入64位2进制密钥:"<<endl;
cin>>s1;
}
else
{
cout<<"请输入16位16进制密钥:"<<endl;
cin>>ssg;
ox_to_b(ssg,s1);
cout<<s1<<endl; //s1为64位初始密钥字符串
}
string s2(56,'1');
string key[16];
for(int g = 0;g<16;g++)
key[g] ="111111111111111111111111111111111111111111111111";
string sb[8]; //s盒内4位字符串初始化
for(int n = 0;n<8;n++)
sb[n] = "1111";
for(int i = 0;i<56;i++) //置换选择1
{
s2[i] = s1[z1[i]-1];
}
for(int e = 0;e<16;e++) //循环左移
{
if(cirs[e]==1)
{leftmov(s2);}
else
{
leftmov(s2);
leftmov(s2);
}
for(int u = 0;u<48;u++) //置换选择2
{key[e][u] = s2[z2[u]-1];}
}
if(kt==2)
{for(int jj = 0;jj<8;jj++) //解密密钥逆置
{
temp=key[jj];
key[jj] = key[15-jj];
key[15-jj] = temp;
}
}
for(int t = 0;t<16;t++)
cout<<"k"<<t<<":"<<key[t]<<endl; //输出全部密钥
//密钥模块2017.3.25/1:20
string ming(64,'1'); //第二部分:明文或密文
string uu(16,'1');
int ok; //明文或密文输入选择
if(kt==1)
{
cout<<"请选择1.输入16位16进制明文"<<endl<<" 2.输入64位2进制明文"<<endl;
cin>>ok;
if(ok == 1)
{
cout<<"请输入16位16进制明文:"<<endl;
cin>>uu;
ox_to_b(uu,ming);
cout<<ming<<endl;
}
else{
cout<<"请输入64位2进制明文:"<<endl;
cin>>ming;
}
}
else
{
cout<<"请选择1.输入16位16进制密文"<<endl<<" 2.输入64位2进制密文"<<endl;
cin>>ok;
if(ok == 1)
{
cout<<"请输入16位16进制密文:"<<endl;
cin>>uu;
ox_to_b(uu,ming);
cout<<ming<<endl;
}
else{
cout<<"请输入64位2进制密文:"<<endl;
cin>>ming;
}
}
string ming2(64,'1'); //ming是明文
for(int h = 0;h<64;h++) //初始ip置换
{ming2[h] = ming[ip[h]-1];}
string le(32,'1');
string be(32,'1');
string se(48,'1');
string nb(32,'1');
for(int j = 0;j<32;j++)
{be[j] = ming2[32+j];
le[j] = ming2[j];}
cout<<"L0:"<<le<<endl;
cout<<"R0:"<<be<<endl;
cout<<endl;
for(int mmp = 0;mmp<16;mmp++) //DES整体核心循环
{
for(int r = 0;r<48;r++)
{se[r] = be[xe[r]-1];}
xor(key[mmp],se);
string k1 = "11";
for(int p = 0;p<8;p++) //s盒
{
k1[0] = se[6*p];
k1[1] = se[6*p+5];
bitset<2> c9(k1);
bitset<4> omg(se,6*p+1,4);
bitset<4> rng(sbox[p][c9.to_ulong()*16+omg.to_ulong()]);
sb[p] = rng.to_string();
}
string mid = sb[0]+sb[1]+sb[2] +sb[3] +sb[4]+sb[5] +sb[6] +sb[7];
for(int ig = 0;ig<32;ig++) //置换运算P
nb[ig] = mid[P[ig]-1];
xor2(le,nb); //左右32位异或
le = be;
be = nb;
if(mmp!=15)
{cout<<"L"<<(mmp+1)<<":"<<le<<endl; //输出L0,R0
cout<<"R"<<(mmp+1)<<":"<<be<<endl;
cout<<endl;}
}
nb = le; //L16,R16输出
le = be;
be = nb;
cout<<"L16:"<<le<<endl;
cout<<"R16:"<<be<<endl;
cout<<endl;
string fin = le+be;
string fina(64,'1');
for(int d = 0;d<64;d++) //逆初始置换
fina[d] = fin[xip[d]-1];
if(kt==1)
cout<<"密文为:"<<fina<<endl;
else
cout<<"明文为:"<<fina<<endl;
//2017.3.28
}
由于DES是对合运算,解密只需要在原来的基础上,把密钥逆置就ok了。