C + + Implement DES encryption algorithm instance parse _c language

Source: Internet
Author: User

The example described in this paper is a program code to implement DES encryption algorithm, in C + +, des encryption is a more commonly used encryption algorithm, and the application is very extensive. This CPP file can meet your DES encryption needs, the code is accompanied by a rich annotation, I believe that for everyone to understand the Des can play a great help.

The specific implementation code is as follows:

#include "memory.h" #include "stdio.h" enum {encrypt,decrypt};//encrypt: Encryption, decrypt: decrypting void Des_run (char Out[8],char in[
8],bool type=encrypt);
Set key void Des_setkey (const char key[8]); static void F_func (BOOL in[32],const bool ki[48])//f function static void S_func (BOOL out[32],const bool in[48]);//s box instead of/transformation STA
TIC void transform (bool *out, bool *in, const char *table, int len); static void Xor (BOOL *ina, const BOOL *INB, int len);/xor or static void Rotatel (bool *in, int len, int loop);/loop left//byte group conversion
The bitwise group is static void Bytetobit (bool *out,const char *in, int bits);
The bit groups are converted to byte group static void Bittobyte (char *out, const bool *in, int bits); Permutation IP Table const static char ip_table[64]={ 58,50,42,34,26,18,10,2,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,4
3,35,27,19,11,3,61,53,45,37,29,21,13,5,63,55,47,39,31,23,15,7}; Inverse permutation IP-1 table const static CHAR ipr_table[64]={ 40,8,48,16,56,24,64,32,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}; E-bit Select table static const char e_table[48]={32,1, 2, 3, 4, 5, 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}; P-Transposition Table const static CHAR p_table[32]={
16,7,20,21,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}; 
   PC1-Select Table const static char pc1_table[56]={57,49,41,33,25,17,9,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};
   PC2-Select Table const static char pc2_table[48]={14,17,11,24,1,5,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};
Left shift Table const static char loop_table[16]={1,1,2,2,2,2,2,2,1,2,2,2,2,2,2,1}; s Box const static char s_box[8][4][16]={//S1 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, 3, 5, 0, 8, 2, 4, 9, 1, 7, 5, 3, 0,//s2 6, 15, 1, 8, 14, 6, 11, 3, 4, 9, 7, 2 3, 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 , 2, 8, 1, 3, 4, 2, one, 6, 7, 0, 5,, 9,//s3 10, 0, 9, 14, 6, 3, 15, 5, 1, 13, 12, 7, 1 1, 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 4, 7, 1, 0, 6, 9, 8, 7, 4, 3, 5, 2, 7, 13, 14, 3, 0, 6, 9, 10, 1, 2, 8, 5, 11,//S4 , 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, 4, 3, 0, 6, 1, 8, 9, 4, 5, one, 7, 2,//S5 2, 12, 4, 1, 7, 10, 11, 6, 8, 5, 3, 15, 13, 0, 1 4, 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, 2, 6, 0, 9, ten, 4, 5, 3,//S6 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, Ten, one, 1, 7, 6, 0, 8,//S7, 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,  9, 5, 0, 2, 3,//S8, 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
, 12, 9, 0, 3, 5, 6, 11}; static bool Subkey[16][48];//16 circle key void Des_run (char Out[8],char in[8], bool type) {static bool M[64],tmp[32],*li=&m[0], *ri=&m[32];
    Bytetobit (m,in,64);
    Transform (m,m,ip_table,64);
           if (Type==encrypt) {for (int i=0;i<16;i++) {memcpy (tmp,ri,32);
           F_func (Ri,subkey[i]);
           XOR (RI,LI,32);
       memcpy (li,tmp,32);
           }}else{for (int i=15;i>=0;i--) {memcpy (tmp,li,32);
           F_func (Li,subkey[i]);
           XOR (LI,RI,32);
       memcpy (ri,tmp,32);
    } transform (m,m,ipr_table,64);
Bittobyte (out,m,64);
    } void Des_setkey (const char key[8]) {static bool k[64], *kl=&k[0], *kr=&k[28];
    Bytetobit (k,key,64);
    Transform (k,k,pc1_table,56);
       for (int i=0;i<16;i++) {Rotatel (kl,28,loop_table[i]);
       Rotatel (Kr,28,loop_table[i]);
    Transform (subkey[i],k,pc2_table,48);
    } void F_func (bool in[32],const bool ki[48]) {static bool mr[48];
    Transform (mr,in,e_table,48);
    XOR (MR,KI,48);
    S_func (IN,MR);
Transform (in,in,p_table,32); } void S_fUNC (BOOL out[32],const bool in[48]) {for (char i=0,j,k;i<8;i++,in+=6,out+=4) {j= (in[0]<<1) +in[5];
       k= (in[1]<<3) + (IN[2]&LT;&LT;2) + (in[3]<<1) +in[4];
    Bytetobit (out,&s_box[i][j][k],4);
    } void Transform (bool *out,bool *in,const char *table,int len) {static bool tmp[256];
    for (int i=0;i<len;i++) tmp[i]=in[table[i]-1];
memcpy (Out,tmp,len); } void XOR (bool *ina,const bool *inb,int len) {for (int i=0;i<len;i++) ina[i]^=inb[i];} void Rotatel (BOOL *
    In,int Len,int loop) {static bool tmp[256];
    memcpy (Tmp,in,loop);
    memcpy (In,in+loop,len-loop);
memcpy (In+len-loop,tmp,loop); } void Bytetobit (bool *out,const char *in,int bits) {for (int i=0;i<bits;i++) out[i]= (in[i/8]>> (i%8))
&1;
    } void Bittobyte (char *out,const bool *in,int bits) {memset (out,0, (bits+7)/8);
for (int i=0;i<bits;i++) out[i/8]|=in[i]<< (i%8); } void Main () {char key[8]={' P ', 'R ', ' O ', ' g ', ' r ', ' A ', ' m '},str[8];
    Puts ("*****************des***********************");
    printf ("\ n");
    printf ("\ n");
    Puts ("Please input your words");
    Gets (str);
    printf ("\ n");
    Puts ("****************************************");
    Des_setkey (key);
    Des_run (Str,str,encrypt);
    Puts ("After encrypting:");
    Puts (str);
    printf ("\ n");
    Puts ("****************************************");
    Puts ("After decrypting:");
    Des_run (Str,str,decrypt);
    Puts (str);
    printf ("\ n");
    Puts ("****************************************");
printf ("\ n");

 }

Interested friends can test and run the example of this article, I believe that the C + + program can play a certain role in helping.

Contact Us

The content source of this page is from Internet, which doesn't represent Alibaba Cloud's opinion; products and services mentioned on that page don't have any relationship with Alibaba Cloud. If the content of the page makes you feel confusing, please write us an email, we will handle the problem within 5 days after receiving your email.

If you find any instances of plagiarism from the community, please send an email to: info-contact@alibabacloud.com and provide relevant evidence. A staff member will contact you within 5 working days.

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.