用c++实现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(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了。



















































  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值