1、基于C+的DES加密算法实现今天偶尔想到数据加密技术,刚才简单讨论了一下MD5和SHA,这里顺便提一下双向加密的标准DES。以前在一个宽带流媒体服务器项目中用到了DES加密,虽然使用环境相对单纯,但算法实现本身是具有普遍意义的。下述程序是很久以前在RSA公司的网站找到的,效率很高,稳定性较好,便一直在实践中使用。首先在头文件中定义一个DES类:/des.h#ifndef _DES_H #define _DES_H class DESpublic: / Encrypt/decrypt the data in data, according to the key. / Caller is resp
2、onsible for confirming the buffer size of data / points to is 8*blocks bytes. / The data encrypted/decrypted is stored in data. / The return code is 1:success, other:failed. int encrypt ( unsigned char key8, unsigned char* data, int blocks = 1 ); int decrypt ( unsigned char key8, unsigned char* data
3、, int blocks = 1 ); / Encrypt/decrypt any size data,according to a special method. / Before calling yencrypt, copy data to a new buffer with size / calculated by extend. int yencrypt ( unsigned char key8, unsigned char* data, int size ); int ydecrypt ( unsigned char key8, unsigned char* in, int bloc
4、ks, int* size = 0 ); int extend ( int size ) return (size/8+1)*8; ; private: void des(unsigned char* in, unsigned char* out, int blocks); void des_block(unsigned char* in, unsigned char* out); private: unsigned long KnL32;enum Mode ENCRYPT, DECRYPT ; void deskey(unsigned char key8, Mode md); void us
5、ekey(unsigned long *); void cookey(unsigned long *); private: void scrunch(unsigned char *, unsigned long *); void unscrun(unsigned long *, unsigned char *); void desfunc(unsigned long *, unsigned long *); private: static unsigned char Df_Key24; static unsigned short bytebit8; static unsigned long b
6、igbyte24; static unsigned char pc156; static unsigned char totrot16; static unsigned char pc248; static unsigned long SP164; static unsigned long SP264; static unsigned long SP364; static unsigned long SP464; static unsigned long SP564; static unsigned long SP664; static unsigned long SP764; static
7、unsigned long SP864; ; #endif 而后,具体实现DES类:/des.cpp#include #include Sinodes.hint DES:encrypt ( unsigned char key8, unsigned char* data, int blocks )if (!data)|(blocks1)return 0;deskey ( key, ENCRYPT );des ( data, data, blocks);return 1;int DES:decrypt ( unsigned char key8, unsigned char* data, int b
8、locks )if (!data)|(blocks1)return 0;deskey ( key, DECRYPT );des ( data, data, blocks);return 1;int DES:yencrypt ( unsigned char key8, unsigned char* data, int size )if (!data)|(size1)return 0;/ The last char of data is bitwise complemented and filled the rest/ buffer.If size is 16, it will extend to
9、 24,and 17 still 24.char lastChar = *(data+size-1);int blocks = size/8+1;memset(data+size, lastChar, blocks*8-size);deskey( key, ENCRYPT );return encrypt ( data, data, blocks);int DES:ydecrypt ( unsigned char key8, unsigned char* data, int blocks, int* size )if ( (!data) | (blocks0)&(datapos=endChar
10、)pos-;if ( datapos != endChar )return 0;*size = pos+1;return 1;/ -/ des/ Encrpts/Decrypts(according to the key currently loaded int the/ internal key register) SOME blocks of eight bytes at address in/ into the block at address out. They can be the same./ in/ out/ block Number of blocks./ -void DES:
11、des ( unsigned char* in, unsigned char* out, int blocks )for (int i = 0; i blocks; i+,in+=8,out+=8)des_block(in,out);/ -/ des_block/ Encrpts/Decrypts(according to the key currently loaded int the/ internal key register) one block of eight bytes at address in/ into the block at address out. They can
12、be the same./ in/ out/ -void DES:des_block(unsigned char *in, unsigned char *out)unsigned long work2;scrunch(in, work);desfunc(work, KnL);unscrun(work, out);/ -/ deskey/ Sets the internal key register (KnR) according to the hexadecimal/ key contained in the 8 bytes of hexkey, according to the DES,/
13、for encryption or decrytion according to MODE/ key is the 64 bits key./ md means encryption or decryption./ -void DES:deskey(unsigned char key8, Mode md)register int ii, j, l, m, n;unsigned char pc1m56, pcr56;unsigned long kn32;for (j = 0; j 3 & bytebitm) ? 1:0;for (ii = 0; ii 16; ii+) if (md = DECR
14、YP) m = (15 - ii) 1;else m = ii 1;n = m + 1;knm = knn = 0L;for (j = 0; j 28; j+) l = j + totrotii;if (l 28) pcrj = pc1ml;else pcrj = pc1ml - 28;for (j = 28; j 56; j+) l = j + totrotii;if (l 56) pcrj = pc1ml;else pcrj = pc1ml - 28;for (j = 0; j 24; j+) if (pcr pc2j ) knm |= bigbytej;if (pcr pc2j+24 )
15、 knn |= bigbytej;cookey(kn);return;/ -/ cookey/ Only called by deskey./ -void DES:cookey(register unsigned long *raw1)register unsigned long *cook, *raw0;unsigned long dough32;register int i;cook = dough;for (i = 0; i 16; i+, raw1+) raw0 = raw1+;*cook = (*raw0 & 0x00fc0000L) 6;*cook |= (*raw0 & 0x00
16、000fc0L) 10;*cook+ |= (*raw1 & 0x00000fc0L) 6;*cook = (*raw0 & 0x0003f000L) 12;*cook |= (*raw0 & 0x0000003fL) 4;*cook+ |= (*raw1 & 0x0000003fL);usekey(dough);return;/ -/ usekey/ Only called by cookey./ Loads the interal key register with the data in cookedkey./ -void DES:usekey(register unsigned lon
17、g *from)register unsigned long *to, *endp;to = KnL, endp = &KnL32;while (to endp) *to+ = *from+;return;void DES:scrunch(register unsigned char *outof, register unsigned long *into )*into = (*outof+ & 0xffL) 24;*into |= (*outof+ & 0xffL) 16;*into |= (*outof+ & 0xffL) 8;*into+ |= (*outof+ & 0xffL);*in
18、to = (*outof+ & 0xffL) 24;*into |= (*outof+ & 0xffL) 16;*into |= (*outof+ & 0xffL) 24) & 0xffL;*into+ = (*outof 16) & 0xffL;*into+ = (*outof 8) & 0xffL;*into+ = *outof+ & 0xffL;*into+ = (*outof 24) & 0xffL;*into+ = (*outof 16) & 0xffL;*into+ = (*outof 8) & 0xffL;*into = *outof & 0xffL;return;void DE
19、S:desfunc(register unsigned long *block,register unsigned long *keys)register unsigned long fval, work, right, leftt;register int round;leftt = block0;right = block1;work = (leftt 4) right) & 0x0f0f0f0fL;right = work;leftt = (work 16) right) & 0x0000ffffL;right = work;leftt = (work 2) leftt) & 0x333
20、33333L;leftt = work;right = (work 8) leftt) & 0x00ff00ffL;leftt = work;right = (work 8);right = (right 31) & 1L) & 0xffffffffL;work = (leftt right) & 0xaaaaaaaaL;leftt = work;right = work;leftt = (leftt 31) & 1L) & 0xffffffffL;for (round = 0; round 8; round+) work = (right 4);work = *keys+;fval = SP
21、7work & 0x3fL;fval |= SP5(work 8) & 0x3fL;fval |= SP3(work 16) & 0x3fL;fval |= SP1(work 24) & 0x3fL;work = right *keys+;fval |= SP8work & 0x3fL;fval |= SP6(work 8) & 0x3fL;fval |= SP4(work 16) & 0x3fL;fval |= SP2(work 24) & 0x3fL;leftt = fval;work = (leftt 4);work = *keys+;fval = SP7work & 0x3fL;fva
22、l |= SP5(work 8) & 0x3fL;fval |= SP3(work 16) & 0x3fL;fval |= SP1(work 24) & 0x3fL;work = leftt *keys+;fval |= SP8work & 0x3fL;fval |= SP6(work 8) & 0x3fL;fval |= SP4(work 16) & 0x3fL;fval |= SP2(work 24) & 0x3fL;right = fval;right = (right 1);work = (leftt right) & 0xaaaaaaaaL;leftt = work;right =
23、work;leftt = (leftt 1);work = (leftt 8) right) & 0x00ff00ffL;right = work;leftt = (work 2) right) & 0x33333333L;right = work;leftt = (work 16) leftt) & 0x0000ffffL;leftt = work;right = (work 4) leftt) & 0x0f0f0f0fL;leftt = work;right = (work 4);*block+ = right;*block = leftt;return;/ -/ Initial of s
24、tatic data members. These data will be used by all the/ instances of class,and can not be changed./ -unsigned char DES:Df_Key24 = 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10,0x89, 0xab, 0xcd, 0xef, 0x01, 0x23, 0x45, 0x67 ;unsigned short DES:bytebit8 = 0200, 0100, 040, 020, 010, 04, 02, 01 ;unsigned long DES:bigbyte24 = 0x800000L, 0x400000L,
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1