1、failed. int encrypt ( char key8, char* data, int blocks = 1 ); int decrypt ( char key8, char* data, 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 ( char key8, char*
2、data, int size ); int ydecrypt ( char key8, char* in, int blocks, 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); unsigned long KnL32; enum Mode ENCRYPT, DECRYP
3、T ; void deskey(unsigned char key8, Mode md); void usekey(unsigned long *); void cookey(unsigned long *); void scrunch(unsigned char *, unsigned long *); void unscrun(unsigned long *, unsigned char *); void desfunc(unsigned long *, unsigned long *); static unsigned char Df_Key24; static unsigned sho
4、rt bytebit8; static unsigned long bigbyte24; 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;
5、static unsigned long SP764; static unsigned long SP864;#endif #include #include des.hint DES:encrypt ( char key8, char* data, int blocks ) if (!data)|(blocks1) return 0; deskey ( key, ENCRYPT ); des ( data, data, blocks); return 1;decrypt ( char key8, char* data, int blocks ) deskey ( key, DECRYPT )
6、;yencrypt ( char key8, char* data, int size ) data)|(size / The last char of data is bitwise complemented and filled the rest / buffer.If size is 16, it will extend to 24,and 17 still 24. char lastChar = *(data+size-1); int blocks = size/8+1; memset (data+size, lastChar, blocks*8-size); return encry
7、pt ( data, data, blocks);ydecrypt ( char key8, char* data, int blocks, int* size ) if ( (!data) | (blocks0)&(datapos=endChar) pos-; if ( datapos != endChar ) *size = pos+1; / - / des / Encrpts/Decrypts(according to the key currently loaded int the / internal key register) SOME blocks of eight bytes
8、at address in/ into the block at address out. They can be the same. / / inoutblock Number of blocks. void DES: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 / internal key register) one block of eight bytes at addres
9、s 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, / for encryption or decr
10、ytion according to MODE is the 64 bits key. md means encryption or decryption. deskey(unsigned char key8, Mode md) /* Thanks to James Gillogly &am p; Phil Karn! */ register int i, j, l, m, n; unsigned char pc1m56, pcr56; unsigned long kn32; for (j = 0; j 3 & bytebitm) ? 1:0; for (i = 0; 16; i+) if (
11、md = DECRYPT) m = (15 - i) 1; else m = i n = m + 1; knm = knn = 0L; 28; l = j + totroti; if (l 28) pcrj = pc1ml; else pcrj = pc1ml - 28; for (j = 28; 56) pcrj = pc1ml; 24; if (pcr pc2j ) knm |= bigbytej; if (pcr pc2j+24 ) knn |= bigbytej; cookey(kn); return;/ cookey / Only called by deskey. cookey(r
12、egister unsigned long *raw1) register unsigned long *cook, *raw0; unsigned long dough32; register int i; cook = dough; i+, raw1+) raw0 = raw1+; *cook = (*raw0 & 0x00fc0000L) 6; *cook |= (*raw0 & 0x00000fc0L) *cook+ |= (*raw1 & 0x00000fc0L) 0x0003f000L) 12; 0x0000003fL) 4; 0x0000003fL); usekey(dough)
13、;/ usekey / Only called by cookey. / Loads the interal key register with the data in cookedkey. usekey(register unsigned long *from) register unsigned long *to, *endp; to = KnL, endp = &KnL32; while (to endp) *to+ = *from+;scrunch(register unsigned char *outof, register unsigned long *int o ) *into
14、= (*outof+ & 0xffL) 24) & 0xffL; 16) & 8) & *into+ = *outof+ & *into = *outof &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
15、; leftt = (work 2) leftt) & 0x33333333L; leftt = work; right = (work 2); 8) leftt) & 0x00ff00ffL; 8); right = (right 31) & 1L) & 0xffffffffL; work = (leftt right) & 0xaaaaaaaaL; leftt = (leftt for (round = 0; round round+) work = (right work = *keys+; fval = SP7work & 0x3fL; fval |= SP5(work fval |=
16、 SP3(work fval |= SP1(work work = right *keys+; fval |= SP8work & fval |= SP6(work fval |= SP4(work fval |= SP2(work leftt = fval; work = (leftt work = leftt *keys+; right = fval; right = (right 1); leftt = (leftt 8) right) & 2) right) & 16) leftt) & 4) leftt) & *block+ = right; *block = leftt;/ Initial of static data members. These data will be used by all the / in
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1