用c++实现DES基本算法

本文介绍了使用C++实现DES基本加密算法的过程,重点讨论了DES中的S盒非线性变换和P扩散如何增强密码安全性。作者对DES的巧妙设计表达了赞赏。
摘要由CSDN通过智能技术生成
#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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值