Des source code of the four encryption algorithms-C ++

Source: Internet
Author: User

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. //////////////////////////////////////// //////////////////////////////////

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.