Des. h file:
//////////////////////////////////////// //// // * Provided by Zhu Meng bin, national University of Technology Email: zmb.tsubasa@gmail.comThis product is free for use. */////////////////////////////////////// /// // # ifndef des_h # define des_h //! Enum bool {false, true };/*! If bool is not supported, use this or just replace with Char and use 1 for true, 0 for false; @ see Enum {encrypt, decrypt}; */Enum {encrypt, decrypt};/* @ brief 16 circle key */static bool subkey [2] [16] [48]; // 16 circle key/* @ Brief 3 DES sign */static bool is3des; // 3 DES sign static char TMP [256]; static char counter ey [16]; typedef bool (* psubkey) [16] [48]; Class _ declspec (dllexport) des {public: des ();~ Des ();//! Type-encrypt: encryption, decrypt: decryption /*! Length of the output buffer (out)> = (datalen + 7)/8) * 8, that is, the smallest positive integer in that is greater than datalen and is a multiple of 8 can be = out, after encryption/decryption, the system will automatically encrypt/decrypt the content in the input buffer (in) three times when keylen> 8. Otherwise, standard DES encryption/Decryption will be used. after 16 bytes are exceeded, only the first 16 bytes are taken. @ see bool des_go (char * Out, char * In, long datalen, const char * Key, int keylen, bool type = encrypt ); */bool des_go (char * Out, char * In, long datalen, const char * Key, int keylen, bool type = encrypt); Private :/*! @ Brief standard DES encryption/Decryption @ see static void des (Char out [8], char in [8], const psubkey, bool type ); */static void des (Char out [8], char in [8], const psubkey, bool type); // standard DES encryption/Decryption /*! @ Brief set the key @ see static void setkey (const char * Key, int Len); */static void setkey (const char * Key, int Len ); // set the key /*! @ Brief set the subkey @ see static void setsubkey (psubkey, const char key [8]); */static void setsubkey (psubkey, const char key [8]); // set the sub-key /*! @ Brief F function @ see static void f_func (bool in [32], const bool Ki [48]); */static void f_func (bool in [32], const bool Ki [48]); // F function /*! @ Brief S box instead of @ see static void s_func (bool out [32], const bool in [48]); */static void s_func (bool out [32], const bool in [48]); // S box instead /*! @ Brief transform @ see static void transform (bool * Out, bool * In, const char * Table, int Len); */static void transform (bool * Out, bool * In, const char * Table, int Len); // transform /*! @ Brief or @ see static void XOR (bool * Ina, const bool * INB, int Len); */static void XOR (bool * Ina, const bool * INB, int Len); // returns or /*! @ Brief loop shift left @ see static void rotatel (bool * In, int Len, int loop); */static void rotatel (bool * In, int Len, int loop ); // move the loop left /*! @ Brief byte group to bit group @ see static void bytetobit (bool * Out, const char * In, int bits); */static void bytetobit (bool * Out, const char * In, int bits); // converts a byte group to a bit group /*! @ Brief bit group to byte group @ see static void bittobyte (char * Out, const bool * In, int bits); */static void bittobyte (char * Out, const bool * In, int bits); // bit group to byte group }; //////////////////////////////////////// //////////////////////////////////////// //////////////////////////////////////// /// // # endif
Des. cpp file:
//////////////////////////////////////// //// // * Provided by Zhu Meng bin, national University of Technology Email: zmb.tsubasa@gmail.comThis product is free for use. */////////////////////////////////////// /// // # include "Memory ". H "# include" DES. H "////////////////////////////////////// /// // initial Permutation ipconst 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, 43, 35, 27, 19, 11, 3, 61, 53, 45, 37, 29, 21, 13, 5, 63, 55, 47, 39, 31, 23, 15, 7}; // final permutation IP ^-1 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}; // expansion operation matrixstatic 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, 2 9, 30, 31, 32, 1}; // 32-bit permutation function p used on the output of the S-boxes 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}; // permuted choice table (key) const static char pcted 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}; // permuted choice key (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}; // number left rotations of pC1 const Static char loop_table [16] = {,}; // The (in) famous S-boxes 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, 12, 9, 7, 3, 10, 5, 0, 15, 12, 8, 2, 4, 9, 1, 7, 5, 11, 3, 14, 10, 0, 6, 13, // S2 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, // S3 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, // S4 7, 13, 1 4, 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, // S5 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, // 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, 9, 5, 15, 10, 11, 14, 1, 7, 6, 0, 8, 13, // 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, 4, 10, 7, 9, 5, 0, 15, 14, 2, 3, 12, // 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, 10, 8, 13, 15, 12, 9, 0, 3, 5, 6, 11 }; //////////////////////////////////////// /// // code starts: //////////////////////// //////////////////////////////////////// /// // Des:: des () {} des ::~ Des () {} bool des: des_go (char * Out, char * In, long datalen, const char * Key, int keylen, bool type) {If (! (Out & in & Key & (datalen = (datalen + 7) & 0xfffffff8) return false; setkey (Key, keylen); If (! Is3des) {// desfor (long I = 0, j = datalen> 3; I <j; ++ I, out ++ = 8, in + = 8) des (out, in, & subkey [0], type);} else {// three DES encryption: add (key0)-solution (key1)-add (key0) decryption: decrypt (key0)-add (key1)-decrypt (key0) for (long I = 0, j = datalen> 3; I <j; ++ I, out + = 8, in + = 8) {des (out, in, & subkey [0], type); des (Out, out, & subkey [1],! Type); des (Out, out, & subkey [0], type) ;}} return true;} void des: setkey (const char * Key, int Len) {memset (memory ey, 0, 16); memcpy (memory ey, key, Len> 16? 16: Len); setsubkey (& subkey [0], & Consumer ey [0]); is3des = Len> 8? (Setsubkey (& subkey [1], & deskey [8]), true): false;} void des: des (Char out [8], char in [8], const psubkey, 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, (* psubkey) [I]); XOR (Ri, Li, 32); memcpy (Li, TMP, 32) ;}} else {for (INT I = 15; I> = 0; -- I) {memcpy (TMP, Li, 32); f_func (Li, (* psubkey) [I]); XOR (Li, RI, 32); memcpy (Ri, TMP, 32) ;}} transform (M, M, ipr_table, 64 ); bittobyte (Out, M, 64);} void des: setsubkey (psubkey, 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 (* psubkey) [I], K, pc2_table, 48) ;}} void des: 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 des: 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] <2) + (in [3] <1) + in [4]; bytetobit (Out, & s_box [I] [J] [K], 4) ;}} void des: Transform (bool * Out, bool * In, const char * table, int Len) {for (INT I = 0; I <Len; ++ I) TMP [I] = in [Table [I]-1]; memcpy (Out, TMP, len);} void des: XOR (bool * Ina, const bool * INB, int Len) {for (INT I = 0; I <Len; ++ I) ina [I] ^ = INB [I];} void des: rotatel (bool * In, int Len, int loop) {memcpy (TMP, In, loop ); memcpy (in, in + loop, len-loop); memcpy (in + len-loop, TMP, loop);} void des: bytetobit (bool * Out, const char * In, int bits) {for (INT I = 0; I <bits; ++ I) out [I] = (in [I> 3]> (I & 7) & 1;} void des: bittobyte (char * Out, const bool * In, int bits) {memset (Out, 0, BITs> 3); For (INT I = 0; I <bits; ++ I) out [I> 3] | = in [I] <(I & 7 );} //////////////////////////////////////// /// // code ends. //////////////////////////////////////// //////////////////////////////////