1、 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, 1
2、4, 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, 14, 3, 0, 6, 9, 10, 1, 2, 8, 5, 11, 12, 4, 15, 13, 8, 11, 5, 6, 15, 0, 3, 4, 7,
3、 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,
4、 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, 1
5、4, 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、, 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, 11const static char Rar_Table = /压缩置换 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,
7、44, 49, 39, 56, 34, 53, 46, 42, 50, 36, 29, 32const static char Exp_Table = /扩展置换 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, 1const static char P_Table= /P置换 16, 7, 20,
8、 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, 25const static char KeyRar_Table= 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
9、, 14, 6, 61, 53, 45, 37, 29, 21, 13, 5, 28, 20, 12, 4/设置全局变量,16轮密钥bool key1648=0;void ByteToBit(bool *Out,char *In,int bits) /字节到位转换函数 int i; for(i=0;i(i%8)&1;void BitToByte(char *Out,bool *In,int bits) /位到字节转换函数bits/8; Outi=0; Outi/8|=Ini(i%8);void Xor(bool *InA,const bool *InB,int length) /按位异或 fo
10、r(int i=0;length; InAi=InBi;void keyfc(char *In) /密钥生成函数 int i,j=0,mov,k,m; bool* key0 = new bool56; bool* keyin = new bool64; bool temp; ByteToBit(keyin,In,64); /字节到位的转换56;i+) /密钥压缩为56位 key0i=keyinKeyRar_Tablei-1;16;i+) /16轮密钥产生 if(i=0|i=1|i=8|i=15) mov=1; else mov=2; for(k=0;kmov;k+) /分左右两块循环左移 fo
11、r(m=0;m8;m+) temp=key0m*7; for(j=m*7;jm*7+7;j+) key0j=key0j+1; key0m*7+6=temp; temp=key00;27; key0m=key0m+1; key027=temp; temp=key028; for(m=28;55; key055=temp; for(j=0;48;j+) /压缩置换并储存 keyij=key0Rar_Tablej-1; delete key0; delete keyin;void DES(char Out8,char In8,bool Type)/加密核心程序,Type=0时加密,反之解密 bool
12、* MW = new bool64; bool* tmp = new bool32; bool* PMW = new bool64; bool* kzmw = new bool48; bool* keytem = new bool48; bool* ss = new bool32; int hang,lie,i; ByteToBit(PMW,In,64); for(int j=0;64; MWj=PMWIP_Tablej-1; /初始置换 bool *Li=&MW0,*Ri=&MW32;i+) /右明文扩展置换 kzmwi=RiExp_Tablei-1; if(Type=0) /DES加密过程
13、 for(int lun=0;lun=0;lun-) ssi=Rii; kzmwi=RiExp_Tablei-1; keytemi=keyluni; Xor(kzmw,keytem,48); /*S盒置换*/ hang=kzmwi*6*2+kzmwi*6+5; lie =kzmwi*6+1*8+kzmwi*6+2*4+kzmwi*6+3*2+kzmwi*6+4; tmpi*4+3=S_Boxi(hang+1)*16+lie%2; tmpi*4+2=(S_Boxi(hang+1)*16+lie/2)%2; tmpi*4+1=(S_Boxi(hang+1)*16+lie/4)%2; tmpi*4=
14、(S_Boxi(hang+1)*16+lie/8)%2; Rii=tmpP_Tablei-1; Xor(Ri,Li,32); /位到字节的转换 delete MW; delete tmp; delete PMW; delete kzmw; delete keytem; delete ss;bool RunDes(char *Out, char *In, int datalength, char *Key, bool Type) /加密运行函数,判断输入以及对输入文本8字节分割 if( !( Out & In & Key & (datalength=(datalength+7)&0xffffff
15、f8) ) ) return false; keyfc(Key); for(int i=0,j=datalength%8; ij; +i,Out+=8,In+=8) DES(Out, In, Type); return true;int main() char* Ki = new char8; char Enter=This is the test of DES!; char* Print = new char200; int len = sizeof(Enter); int i_mf; cout 请输入密钥(8位): n for(i_mf=0;i_mf Kii_mf; RunDes(Print,Enter,len,Ki,0);/加密-加密前-len; cout Enteri_mf;nn-加密后- coutPrinti_mf; /此处进行不同密钥输入测试 RunDes(Enter,Print,len,Ki,1);/解密-解密后- endl; delete Ki; delete Print; return 0;二、程序编译、运行结果图:三、程序总体框架图:四、程序实现流程图:
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1