ImageVerifierCode 换一换
格式:DOCX , 页数:27 ,大小:21.18KB ,
资源ID:6178090      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/6178090.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(基于C++的DES加密算法实现.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

基于C++的DES加密算法实现.docx

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