收藏 分销(赏)

DES加密算法与解密带流程图.doc

上传人:天**** 文档编号:3380404 上传时间:2024-07-03 格式:DOC 页数:10 大小:251KB 下载积分:8 金币
下载 相关 举报
DES加密算法与解密带流程图.doc_第1页
第1页 / 共10页
DES加密算法与解密带流程图.doc_第2页
第2页 / 共10页


点击查看更多>>
资源描述
一、DES加密及解密算法程序源代码: #include <iostream> 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, 29, 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, 33, 1, 41, 9, 49, 17, 57, 25 }; const static char S_Box[8][64] = { //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 */ {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, 14, 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, 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, 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, 14, 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, 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, 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 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, 14, 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 }; //设置全局变量,16轮密钥 bool key[16][48]={{0}}; void ByteToBit(bool *Out,char *In,int bits) //字节到位转换函数 { int i; for(i=0;i<bits;i++) Out[i]=(In[i/8]>>(i%8))&1; } void BitToByte(char *Out,bool *In,int bits) //位到字节转换函数 { int i; for(i=0;i<bits/8;i++) Out[i]=0; for(i=0;i<bits;i++) Out[i/8]|=In[i]<<(i%8); } void Xor(bool *InA,const bool *InB,int length) //按位异或 { for(int i=0;i<length;i++) InA[i]^=InB[i]; } void keyfc(char *In) //密钥生成函数 { int i,j=0,mov,k,m; bool* key0 = new bool[56]; bool* keyin = new bool[64]; bool temp; ByteToBit(keyin,In,64); //字节到位的转换 for(i=0;i<56;i++) //密钥压缩为56位 key0[i]=keyin[KeyRar_Table[i]-1]; for(i=0;i<16;i++) //16轮密钥产生 { if(i==0||i==1||i==8||i==15) mov=1; else mov=2; for(k=0;k<mov;k++) //分左右两块循环左移 { for(m=0;m<8;m++) { temp=key0[m*7]; for(j=m*7;j<m*7+7;j++) key0[j]=key0[j+1]; key0[m*7+6]=temp; } temp=key0[0]; for(m=0;m<27;m++) key0[m]=key0[m+1]; key0[27]=temp; temp=key0[28]; for(m=28;m<55;m++) key0[m]=key0[m+1]; key0[55]=temp; } for(j=0;j<48;j++) //压缩置换并储存 key[i][j]=key0[Rar_Table[j]-1]; } delete[] key0; delete[] keyin; } void DES(char Out[8],char In[8],bool Type)//加密核心程序,Type=0时加密,反之解密 { bool* MW = new bool[64]; bool* tmp = new bool[32]; bool* PMW = new bool[64]; bool* kzmw = new bool[48]; bool* keytem = new bool[48]; bool* ss = new bool[32]; int hang,lie,i; ByteToBit(PMW,In,64); for(int j=0;j<64;j++) { MW[j]=PMW[IP_Table[j]-1]; //初始置换 } bool *Li=&MW[0],*Ri=&MW[32]; for(i=0;i<48;i++) //右明文扩展置换 kzmw[i]=Ri[Exp_Table[i]-1]; if(Type==0) //DES加密过程 { for(int lun=0;lun<16;lun++) { for(i=0;i<32;i++) ss[i]=Ri[i]; for(i=0;i<48;i++) //右明文扩展置换 kzmw[i]=Ri[Exp_Table[i]-1]; for(i=0;i<48;i++) keytem[i]=key[lun][i]; Xor(kzmw,keytem,48); /*S盒置换*/ for(i=0;i<8;i++) { hang=kzmw[i*6]*2+kzmw[i*6+5]; lie =kzmw[i*6+1]*8+kzmw[i*6+2]*4+kzmw[i*6+3]*2+kzmw[i*6+4]; tmp[i*4+3]=S_Box[i][(hang+1)*16+lie]%2; tmp[i*4+2]=(S_Box[i][(hang+1)*16+lie]/2)%2; tmp[i*4+1]=(S_Box[i][(hang+1)*16+lie]/4)%2; tmp[i*4]=(S_Box[i][(hang+1)*16+lie]/8)%2; } for(i=0;i<32;i++) //P置换 Ri[i]=tmp[P_Table[i]-1]; Xor(Ri,Li,32); //异或 for(i=0;i<32;i++) //交换左右明文 { Li[i]=ss[i]; } } for(i=0;i<32;i++) { tmp[i]=Li[i]; Li[i]=Ri[i]; Ri[i]=tmp[i]; } for(i=0;i<64;i++) PMW[i]=MW[Final_Table[i]-1]; BitToByte(Out,PMW,64); //位到字节的转换 } else //DES解密过程 { for(int lun=15;lun>=0;lun--) { for(i=0;i<32;i++) ss[i]=Ri[i]; for(i=0;i<48;i++) //右明文扩展置换 kzmw[i]=Ri[Exp_Table[i]-1]; for(i=0;i<48;i++) keytem[i]=key[lun][i]; Xor(kzmw,keytem,48); /*S盒置换*/ for(i=0;i<8;i++) { hang=kzmw[i*6]*2+kzmw[i*6+5]; lie =kzmw[i*6+1]*8+kzmw[i*6+2]*4+kzmw[i*6+3]*2+kzmw[i*6+4]; tmp[i*4+3]=S_Box[i][(hang+1)*16+lie]%2; tmp[i*4+2]=(S_Box[i][(hang+1)*16+lie]/2)%2; tmp[i*4+1]=(S_Box[i][(hang+1)*16+lie]/4)%2; tmp[i*4]=(S_Box[i][(hang+1)*16+lie]/8)%2; } for(i=0;i<32;i++) //P置换 Ri[i]=tmp[P_Table[i]-1]; Xor(Ri,Li,32); //异或 for(i=0;i<32;i++) //交换左右明文 { Li[i]=ss[i]; } } for(i=0;i<32;i++) { tmp[i]=Li[i]; Li[i]=Ri[i]; Ri[i]=tmp[i]; } for(i=0;i<64;i++) PMW[i]=MW[Final_Table[i]-1]; BitToByte(Out,PMW,64); //位到字节的转换 } 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)&0xfffffff8) ) ) return false; keyfc(Key); for(int i=0,j=datalength%8; i<j; ++i,Out+=8,In+=8) DES(Out, In, Type); return true; } int main() { char* Ki = new char[8]; char Enter[]="This is the test of DES!"; char* Print = new char[200]; int len = sizeof(Enter); int i_mf; cout << "请输入密钥(8位):" <<"\n"; for(i_mf=0;i_mf<8;i_mf++) cin >> Ki[i_mf]; cout << "\n"; RunDes(Print,Enter,len,Ki,0);//加密 cout << "----加密前----" << "\n"; for(i_mf=0;i_mf<len;i_mf++) cout << Enter[i_mf]; cout << "\n\n"; cout << "----加密后----" << "\n"; for(i_mf=0;i_mf<len;i_mf++) cout<<Print[i_mf]; cout << "\n\n"; //此处进行不同密钥输入测试 cout << "请输入密钥(8位):" <<"\n"; for(i_mf=0;i_mf<8;i_mf++) cin >> Ki[i_mf]; cout << "\n"; RunDes(Enter,Print,len,Ki,1);//解密 cout << "----解密后----" << "\n"; for(i_mf=0;i_mf<len;i_mf++) cout << Enter[i_mf]; cout << endl; delete[] Ki; delete[] Print; return 0; } 二、程序编译、运行结果图: 三、程序总体框架图: 四、程序实现流程图:
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 包罗万象 > 大杂烩

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2026 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服