1、DES加密算法与解密一、DES加密及解密算法程序源代码:#include using namespace std;const static char IP_Table = /IP_Table置换 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, 2
2、9, 21, 13, 5, 63, 55, 47, 39, 31, 23, 15, 7; const static char Final_Table = /最终置换 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,
3、33, 1, 41, 9, 49, 17, 57, 25;const static char S_Box864 = /s_box /* S1 */ 14, 4, 13, 1, 2, 15, 11, 8, 3, 10, 6, 12, 5, 9, 0, 7, 0, 15, 7, 4, 14, 2, 13, 1, 10, 6, 12, 11, 9, 5, 3, 8, 4, 1, 14, 8, 13, 6, 2, 11, 15, 12, 9, 7, 3, 10, 5, 0, 15, 12, 8, 2, 4, 9, 1, 7, 5, 11, 3, 14, 10, 0, 6, 13, /* S2 */ 1
4、5, 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, 14, 6, 3, 15, 5, 1, 13, 12, 7, 11, 4, 2, 8, 13, 7, 0, 9, 3, 4, 6,
5、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, 2, 12, 1, 10, 14, 9, 10, 6, 9, 0, 12, 11, 7, 13, 15, 1, 3, 14, 5
6、, 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, 11, 8, 12, 7, 1, 14, 2, 13, 6, 15, 0, 9, 10, 4, 5, 3, /* S6 */ 1
7、2, 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, 14, 15, 0, 8, 13, 3, 12, 9, 7, 5, 10, 6, 1, 13, 0, 11, 7, 4, 9, 1,
8、 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, 11, 0, 14, 9, 2, 7, 11, 4, 1, 9, 12, 14, 2, 0, 6, 10, 13, 15
9、, 3, 5, 8, 2, 1, 14, 7, 4, 10, 8, 13, 15, 12, 9, 0, 3, 5, 6, 11;const 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, 44, 49, 39, 56, 34, 53, 46, 42, 50, 36, 29, 32;const static char
10、 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, 1;const static char P_Table= /P置换 16, 7, 20, 21, 29, 12, 28, 17, 1, 15, 23, 26, 5, 18, 31, 10, 2, 8, 24, 1
11、4, 32, 27, 3, 9, 19, 13, 30, 6, 22, 11, 4, 25;const 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, 14, 6, 61, 53, 45, 37, 29, 21, 13, 5, 28, 20, 12, 4;/设置全局变量
12、,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) /位到字节转换函数 int i; for(i=0;ibits/8;i+) Outi=0; for(i=0;ibits;i+) Outi/8|=Ini(i%8);void Xor(bool *InA,const bool *InB,int length) /按位异或 for(int i=0;ilength;i+)
13、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); /字节到位的转换 for(i=0;i56;i+) /密钥压缩为56位 key0i=keyinKeyRar_Tablei-1; for(i=0;i16;i+) /16轮密钥产生 if(i=0|i=1|i=8|i=15) mov=1; else mov=2; for(k=0;kmov;k+) /分左右两块循环左移
14、for(m=0;m8;m+) temp=key0m*7; for(j=m*7;jm*7+7;j+) key0j=key0j+1; key0m*7+6=temp; temp=key00; for(m=0;m27;m+) key0m=key0m+1; key027=temp; temp=key028; for(m=28;m55;m+) key0m=key0m+1; key055=temp; for(j=0;j48;j+) /压缩置换并储存 keyij=key0Rar_Tablej-1; delete key0; delete keyin;void DES(char Out8,char In8,bo
15、ol Type)/加密核心程序,Type=0时加密,反之解密 bool* 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;j64;j+) MWj=PMWIP_Tablej-1; /初始置换 bool *Li=&MW0,*Ri=&MW32; for(i=0;i48;i+
16、) /右明文扩展置换 kzmwi=RiExp_Tablei-1; if(Type=0) /DES加密过程 for(int lun=0;lun16;lun+) for(i=0;i32;i+) ssi=Rii; for(i=0;i48;i+) /右明文扩展置换 kzmwi=RiExp_Tablei-1; for(i=0;i48;i+) keytemi=keyluni; Xor(kzmw,keytem,48); /*S盒置换*/ for(i=0;i8;i+) hang=kzmwi*6*2+kzmwi*6+5; lie =kzmwi*6+1*8+kzmwi*6+2*4+kzmwi*6+3*2+kzmw
17、i*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=(S_Boxi(hang+1)*16+lie/8)%2; for(i=0;i32;i+) /P置换 Rii=tmpP_Tablei-1; Xor(Ri,Li,32); /异或 for(i=0;i32;i+) /交换左右明文 Lii=ssi; for(i=0;i32;i+) tmpi=Lii; Lii=Rii; Rii=tmpi; for(i=0;i=
18、0;lun-) for(i=0;i32;i+) ssi=Rii; for(i=0;i48;i+) /右明文扩展置换 kzmwi=RiExp_Tablei-1; for(i=0;i48;i+) keytemi=keyluni; Xor(kzmw,keytem,48); /*S盒置换*/ for(i=0;i8;i+) 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+li
19、e/2)%2; tmpi*4+1=(S_Boxi(hang+1)*16+lie/4)%2; tmpi*4=(S_Boxi(hang+1)*16+lie/8)%2; for(i=0;i32;i+) /P置换 Rii=tmpP_Tablei-1; Xor(Ri,Li,32); /异或 for(i=0;i32;i+) /交换左右明文 Lii=ssi; for(i=0;i32;i+) tmpi=Lii; Lii=Rii; Rii=tmpi; for(i=0;i64;i+) PMWi=MWFinal_Tablei-1; BitToByte(Out,PMW,64); /位到字节的转换 delete MW;
20、 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)&0xfffffff8) ) ) return false; keyfc(Key); for(int i=0,j=datalength%8; ij; +i,Out+=8,In+=8)
21、 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; cout n; RunDes(Print,Enter,len,Ki,0);/加密 cout -加密前- n; for(i_mf=0;i_mflen;i_mf+) cout Enteri
22、_mf; cout nn; cout -加密后- n; for(i_mf=0;i_mflen;i_mf+) coutPrinti_mf; cout nn; /此处进行不同密钥输入测试 cout 请输入密钥(8位): n; for(i_mf=0;i_mf Kii_mf; cout n; RunDes(Enter,Print,len,Ki,1);/解密 cout -解密后- n; for(i_mf=0;i_mflen;i_mf+) cout Enteri_mf; cout endl; delete Ki; delete Print; return 0;二、程序编译、运行结果图:三、程序总体框架图:四、程序实现流程图:
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1