DES算法C++源代码.doc_第1页
DES算法C++源代码.doc_第2页
DES算法C++源代码.doc_第3页
DES算法C++源代码.doc_第4页
DES算法C++源代码.doc_第5页
免费预览已结束,剩余28页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

DES算法C+源代码文章来源:黑客中国 更新时间:2005-12-12Des.cpp/*/* DES(Data Encryption Standard) */* Written by Bunny */* Banyet Soft Labs. 1999 */* ALL RIGHTS RESERVED! */* 注意! 版权所有! 可以自由转载,但不得加以修改或删除! */* E-mail:A Http:/A */ /*/*/*注意:这只是标准DES算法的例子,所以速度并不是很快,不适用于大量数据加密的场*/*合.UNIX的密码也采用DES,不过它在里面加了点其它的东西.所以结果和DES的结果 */*不一样. 由于使用了WINDOWS类库,所以必须在WINDOWS环境下编译. */*/#include #include #include #include #include Schedle.hclass CShiftpublic:DWORDLONG mask16;int step16;CShift()for(int i=0;i28;D0=m_dwlKey&0xfffffff;for(int i=1;i(28-m_shift.stepi-1);C=(Ci-1(28-m_shift.stepi-1);D=(Di-1M_SHIFT.STEPI-1)|TMP)&0X0FFFFFFF;m_dwl_K=(C28)|D;m_dwl_K=PermuteTable(m_dwl_K,dwlKey_PC_2,48);DWORDLONG CDES:ProcessByte(unsigned char *key,BOOL shift)unsigned char tmp;DWORDLONG byte=0;int i=0;while(i8)while(*key)if(byte!=0)byte=8;tmp=*key;if(shift)tmp=1;byte|=tmp;i+;key+;if(i8)byte=8;i+;return byte;DWORDLONG CDES:PermuteTable(DWORDLONG dwlPara,DWORDLONG* dwlTable,int nDestLen)int i=0;DWORDLONG tmp=0,moveBit;while(iNDESTLEN)moveBit=1;if(dwlTable&dwlPara)moveBit=1;i-;return tmp;void CDES:PrintTable(DWORDLONG *dwlPara,int col,int row)int i,j;for(i=0;iROW;I+)printf(n);getch();for(j=0;j1;out=0;strcpy(out,strrev(out);printf(%s *:%dn,out,i-space);void CDES:ConvertTableToMask(DWORDLONG *mask,int max)int i=0;DWORDLONG nBit=1;while(mask!=0)nBit=1;nBit=max-mask;maski+=nBit;void CDES:Generate_S(void)int i;int j,m,n;m=n=0;j=1;for(i=0;i512;i+)dwlData_Sjmn=OS;n=(n+1)%16;if(!n)m=(m+1)%4;if(!m)j+;unsigned char * CDES:EncryptData(unsigned char *block)unsigned char *EncrytedData=new unsigned char(15);printf(nOriginal Data: %sn,block);m_dwlData=ProcessByte(block,0);/ PrintBit(m_dwlData);m_dwlData=PermuteTable(m_dwlData,dwlData_IP,64);EncryptKernel();/ PrintBit(m_dwlData);DWORDLONG bit6=m_dwlData;for(int i=0;i=6;EncrytedData11=0;printf(nAfter Encrypted: %s,EncrytedData);for(i=0;i=8;EncrytedData8=0;return EncrytedData;void CDES:EncryptKernel(void)int i=1;DWORDLONG L17,R17,B9,EK,PSB;L0=m_dwlData32;R0=m_dwlData&0xffffffff;for(i=1;i=16;i+)L=Ri-1;Ri-1=PermuteTable(Ri-1,dwlData_Expansion,48); /Expansion REK=Ri-1m_dwl_K; /E PermutationPSB=Generate_B(EK,B); /P PermutationR=Li-1PSB;R1632;L16=dataPara&0xffffffff;for(i=16;i=1;i-)Ri-1=L;L=PermuteTable(L,dwlData_Expansion,48); /Expansion LEK=Lm_dwl_K; /E PermutationPSB=Generate_B(EK,B); /P PermutationLi-1=RPSB;L0=32;dataPara=L0|R0;dataPara=PermuteTable(dataPara,dwlData_FP,64);/ PrintBit(dataPara);for(i=0;i=8;DescryptedData8=0;printf(nAfter Decrypted: %sn,DescryptedData);return DescryptedData;DWORDLONG CDES:Generate_B(DWORDLONG EKPara,DWORDLONG *block)int i,m,n;DWORDLONG tmp=0;for(i=8;i0;i-)block=EKPara&0x3f;m=(int)(block&0x20)4;m|=block&0x01;n=(int)(block2;block=dwlData_Smn;EKPara=6;for(i=1;i=8;i+)tmp|=block;tmp=4;tmp=PermuteTable(tmp,dwlData_P,32);return tmp;void main(void)CDES des;des.EncryptKey(12345678);unsigned char *result=des.EncryptData(unsigned char*)DemoData);des.DescryptData(result); DES算法源代码伊洛方清 发表于 2006-1-13 14:26:00看到网上到处是关于DES的英文文章,有的只是简单的翻译,可就是没有源代码,可苦了那些寻找源代码的人。在vc下建立一个控制台工程,把下面的des.hdes.c和sample.c分别存为文件就行了,然后编译,sample是一个应用des算法的例子关于des算法原理的废话就不多说了,网上那都是代码如下: /des.hvoid endes(unsigned char a8, unsigned char b8, unsigned char c8) ;void undes(unsigned char a8, unsigned char b8, unsigned char c8) ;unsigned char *byte2bit(unsigned char a8, unsigned char b8) ;unsigned char *bit2byte(unsigned char a8, unsigned char b8) ;void keychange(unsigned char x8, unsigned char y168) ;void s_replace(unsigned char a8) ;/des.cunsigned char *byte2bit(unsigned char byte64 , unsigned char bit8)/*change 64byte to 64bit(8byte)*/int i = 0 ; /*byte1*/ for(i = 0;i = 7;i+) if(byte0 = 0x1) bit0 = bit0 | 0x80 ; else bit0 = bit0 & 0x7f ; if(byte1 = 0x1) bit0 = bit0 | 0x40 ; else bit0 = bit0 & 0xbf ; if(byte2 = 0x1) bit0 = bit0 | 0x20 ; else bit0 = bit0 & 0xdf ; if(byte3 = 0x1) bit0 = bit0 | 0x10 ; else bit0 = bit0 & 0xef ; if(byte4 = 0x1) bit0 = bit0 | 0x08 ; else bit0 = bit0 & 0xf7 ; if(byte5 = 0x1) bit0 = bit0 | 0x04 ; else bit0 = bit0 & 0xfb ; if(byte6 = 0x1) bit0 = bit0 | 0x02 ; else bit0 = bit0 & 0xfd ; if(byte7 = 0x1) bit0 = bit0 | 0x01 ; else bit0 = bit0 & 0xfe ; /*byte2*/ for(i = 8;i = 15;i+) if(byte8 = 0x1) bit1 = bit1 | 0x80 ; else bit1 = bit1 & 0x7f ; if(byte9 = 0x1) bit1 = bit1 | 0x40 ; else bit1 = bit1 & 0xbf ; if(byte10 = 0x1) bit1 = bit1 | 0x20 ; else bit1 = bit1 & 0xdf ; if(byte11 = 0x1) bit1 = bit1 | 0x10 ; else bit1 = bit1 & 0xef ; if(byte12 = 0x1) bit1 = bit1 | 0x08 ; else bit1 = bit1 & 0xf7 ; if(byte13 = 0x1) bit1 = bit1 | 0x04 ; else bit1 = bit1 & 0xfb ; if(byte14 = 0x1) bit1 = bit1 | 0x02 ; else bit1 = bit1 & 0xfd ; if(byte15 = 0x1) bit1 = bit1 | 0x01 ; else bit1 = bit1 & 0xfe ; /*byte3*/ for(i = 16;i = 23 ;i+) if(byte16 = 0x1) bit2 = bit2 | 0x80 ; else bit2 = bit2 & 0x7f ; if(byte17 = 0x1) bit2 = bit2 | 0x40 ; else bit2 = bit2 & 0xbf ; if(byte18 = 0x1) bit2 = bit2 | 0x20 ; else bit2 = bit2 & 0xdf ; if(byte19 = 0x1) bit2 = bit2 | 0x10 ; else bit2 = bit2 & 0xef ; if(byte20 = 0x1) bit2 = bit2 | 0x08 ; else bit2 = bit2 & 0xf7 ; if(byte21 = 0x1) bit2 = bit2 | 0x04 ; else bit2 = bit2 & 0xfb ; if(byte22 = 0x1) bit2 = bit2 | 0x02 ; else bit2 = bit2 & 0xfd ; if(byte23 = 0x1) bit2 = bit2 | 0x01 ; else bit2 = bit2 & 0xfe ; /*byte4*/ for(i = 24;i = 31 ;i+) if(byte24 = 0x1) bit3 = bit3 | 0x80 ; else bit3 = bit3 & 0x7f ; if(byte25 = 0x1) bit3 = bit3 | 0x40 ; else bit3 = bit3 & 0xbf ; if(byte26 = 0x1) bit3 = bit3 | 0x20 ; else bit3 = bit3 & 0xdf ; if(byte27 = 0x1) bit3 = bit3 | 0x10 ; else bit3 = bit3 & 0xef ; if(byte28 = 0x1) bit3 = bit3 | 0x08 ; else bit3 = bit3 & 0xf7 ; if(byte29 = 0x1) bit3 = bit3 | 0x04 ; else bit3 = bit3 & 0xfb ; if(byte30 = 0x1) bit3 = bit3 | 0x02 ; else bit3 = bit3 & 0xfd ; if(byte31 = 0x1) bit3 = bit3 | 0x01 ; else bit3 = bit3 & 0xfe ; /*byte5*/ for(i = 32;i = 39 ;i+) if(byte32 = 0x1) bit4 = bit4 | 0x80 ; else bit4 = bit4 & 0x7f ; if(byte33 = 0x1) bit4 = bit4 | 0x40 ; else bit4 = bit4 & 0xbf ; if(byte34 = 0x1) bit4 = bit4 | 0x20 ; else bit4 = bit4 & 0xdf ; if(byte35 = 0x1) bit4 = bit4 | 0x10 ; else bit4 = bit4 & 0xef ; if(byte36 = 0x1) bit4 = bit4 | 0x08 ; else bit4 = bit4 & 0xf7 ; if(byte37 = 0x1) bit4 = bit4 | 0x04 ; else bit4 = bit4 & 0xfb ; if(byte38 = 0x1) bit4 = bit4 | 0x02 ; else bit4 = bit4 & 0xfd ; if(byte39 = 0x1) bit4 = bit4 | 0x01 ; else bit4 = bit4 & 0xfe ; /*byte6*/ for(i = 40;i = 47 ;i+) if(byte40 = 0x1) bit5 = bit5 | 0x80 ; else bit5 = bit5 & 0x7f ; if(byte41 = 0x1) bit5 = bit5 | 0x40 ; else bit5 = bit5 & 0xbf ; if(byte42 = 0x1) bit5 = bit5 | 0x20 ; else bit5 = bit5 & 0xdf ; if(byte43 = 0x1) bit5 = bit5 | 0x10 ; else bit5 = bit5 & 0xef ; if(byte44 = 0x1) bit5 = bit5 | 0x08 ; else bit5 = bit5 & 0xf7 ; if(byte45 = 0x1) bit5 = bit5 | 0x04 ; else bit5 = bit5 & 0xfb ; if(byte46 = 0x1) bit5 = bit5 | 0x02 ; else bit5 = bit5 & 0xfd ; if(byte47 = 0x1) bit5 = bit5 | 0x01 ; else bit5 = bit5 & 0xfe ; /*byte7*/ for(i = 48;i = 55 ;i+) if(byte48 = 0x1) bit6 = bit6 | 0x80 ; else bit6 = bit6 & 0x7f ; if(byte49 = 0x1) bit6 = bit6 | 0x40 ; else bit6 = bit6 & 0xbf ; if(byte50 = 0x1) bit6 = bit6 | 0x20 ; else bit6 = bit6 & 0xdf ; if(byte51 = 0x1) bit6 = bit6 | 0x10 ; else bit6 = bit6 & 0xef ; if(byte52 = 0x1) bit6 = bit6 | 0x08 ; else bit6 = bit6 & 0xf7; if(byte53 = 0x1) bit6 = bit6 | 0x04 ; else bit6 = bit6 & 0xfb ; if(byte54 = 0x1) bit6 = bit6 | 0x02 ; else bit6 = bit6 & 0xfd ; if(byte55 = 0x1) bit6 = bit6 | 0x01 ; else bit6 = bit6 & 0xfe ; /*byte8*/ for(i = 56;i = 63 ;i+) if(byte56 = 0x1) bit7 = bit7 | 0x80 ; else bit7 = bit7 & 0x7f ; if(byte57 = 0x1) bit7 = bit7 | 0x40 ; else bit7 = bit7 & 0xbf ; if(byte58 = 0x1) bit7 = bit7 | 0x20 ; else bit7 = bit7 & 0xdf ; if(byte59 = 0x1) bit7 = bit7 | 0x10 ; else bit7 = bit7 & 0xef ; if(byte60 = 0x1) bit7 = bit7 | 0x08 ; else bit7 = bit7 & 0xf7 ; if(byte61 = 0x1) bit7 = bit7 | 0x04 ; else bit7 = bit7 & 0xfb ; if(byte62 = 0x1) bit7 = bit7 | 0x02 ; else bit7 = bit7 & 0xfd ; if(byte63 = 0x1) bit7 = bit7 | 0x01 ; else bit7 = bit7 & 0xfe ; return bit ;/*end of byte2bit*/*-*/* bit2byte */*-*/unsigned char *bit2byte(unsigned char bit8 , unsigned char byte64)/*change 64bit(8byte) to 64byte*/int i=0 ; for(i=0 ; i=63 ; i+) bytei = 0x0 ; for(i=0 ; i=7 ; i+) if(biti & 0x80) = 0x80) bytei*8+0 = 0x01 ; if(biti & 0x40) = 0x40) bytei*8+1 = 0x01 ; if(biti & 0x20) = 0x20) bytei*8+2 = 0x01 ; if(biti & 0x10) = 0x10) bytei*8+3 = 0x01 ; if(biti & 0x08) = 0x08) bytei*8+4 = 0x01 ; if(biti & 0x04) = 0x04) bytei*8+5 = 0x01 ; if(biti & 0x02) = 0x02) bytei*8+6 = 0x01 ; if(biti & 0x01) = 0x01) bytei*8+7 = 0x01 ; return byte;/* end of bit2byte */*-*/* change the key */*-*/keychange(unsigned char oldkey8 , unsigned char newkey168)int i=0,j=0,k=0 ;int pc_156 = 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 ;int pc_248 = 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 ;int ccmovebit16 = 1,1,2,2,2,2,2,2,1,2,2,2,2,2,2,1 ;unsigned char oldkey_byte64 ;unsigned char oldkey_byte164 ;unsigned char oldkey_byte264 ;unsigned char oldkey_c28 ;unsigned char oldkey_d28 ;unsigned char cc_temp ;unsigned char newkey_byte1664 ;bit2byte(oldkey,oldkey_byte) ;/*change to byte*/for(i=0;i=55;i+) oldkey_byte1i = oldkey_bytepc_1i - 1 ;/*goto PC-1*/for(i=0;i c0*/for(i=28;i d0*/*cc_movebit : get c1-16,d1-16*/for(i=0;i=15;i+) for(j=1;j=ccmovebiti;j+) cc_temp = oldkey_c0 ; /*move out the first bit*/ for(k=0;k=26;k+) oldkey_ck = oldkey_ck+1 ; oldkey_c27 = cc_temp ; /*move the first bit to the last bit*/ cc_temp = oldkey_d0 ; /*move out the first bit*/ for(k=0;k=26;k+) oldkey_dk = oldkey_dk+1 ; oldkey_d27 = cc_temp ; /*move the first bit to the last bit*/ /*cc_movebit*/ /*goto pc-2 change bit*/ for(k=0;k=27;k+) oldkey_byte2k = oldkey_ck ; for(k=28;k for pc-2 change 56bit to 48bit k(i)*/ for(k=0;k=47;k+) newkey_byteik = oldkey_byte2pc_2k - 1 ; /*ready to next k(i)*/*end of one of change the 48bit key*/*byte to bit for 48bit newkey*/for(i=0;i=15;i+) byte2bit(newkey_bytei,newkeyi) ;/*end of keychange*/*-*/* data encryption */*-*/endes(unsigned char m_bit8 , unsigned char k_bit8 , unsigned char e_bit8)int ip64 = 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 ;int ip_164 = 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 ;int e48 = 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,29,30,31,32,1 ;unsigned char m_bit18 = 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 ;unsigned char m_byte64 ;unsigned char m_byte164 ;unsigned char key_n168 ;unsigned char l_bit178 ;unsigned char r_bit178 ;unsigned char e_byte64 ;unsigned char e_byte164 ;unsigned char r_byte64 ;unsigned char r_byte164 ;int i = 0 , j = 0;/*initialize*/for(i=0;i=15;i+) for(j=0;j=7;j+) l_bitij = 0x0 ; r_bitij = 0x0 ; key_nij = 0x0 ; for(i=0;i=63;i+) m_bytei = 0x0 ; m_byte1i = 0x0 ; r_bytei = 0x0 ; r_byte1i = 0x0 ; e_bytei = 0x0 ; e_byte1i = 0x0 ; keychange(k_bit,key_n) ;/*get the 48bit key x 16 (16rows x 6byte in key_n)*/bit2byte(m_bit,m_byte) ;/*change to byte*/for(i=0;i=63;i+) m_byte1i = m_byteipi - 1 ;/*goto IP swap bit*/byte2bit(m_byte1,m_bit1) ;/*re-change to bit*/for(i=0;i l0*/for(i=4;i r0*/for(i=1;i=16;i+) /*16 layer*/ for(j=0;j=3;j+) l_bitij = r_biti-1j ;/*L(n) = R(n-1)*/ /*comput f(R(n-1),k)*/ bit2byte(r_biti-1,r_byte) ; for(j=0;j=47;j+) r_byte1j = r_byteej - 1 ;/*goto E swap bit*/ byte2bit(r_byte1,r_biti-1) ;

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论