当前位置: 首页 > 图文教程 > 开发语言 > VC++ > 轻松实现DES算法查看器
| 轻松实现DES算法查看器 下载源代码 ////////////////////////////////////////////////////////////////////////CenterWindow(GetDesktopWindow()); ::SendMessage(m_listdata.m_hWnd, LVM_SETEXTENDEDLISTVIEWSTYLE, LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES, LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES); m_listdata.InsertColumn(0,"NO.",LVCFMT_LEFT,30); m_listdata.InsertColumn(1,"L0",LVCFMT_LEFT,40); m_listdata.InsertColumn(2,"R0",LVCFMT_LEFT,40); m_listdata.InsertColumn(3,"F函数值",LVCFMT_LEFT,60); m_listdata.InsertColumn(4,"密钥Ki",LVCFMT_LEFT,50); m_listdata.InsertColumn(5,"S盒",LVCFMT_LEFT,45);////////////////////////////////////////////////////////////////////////加密的过程中,需要对明文和密文检测,是否含有无法加密的字符,如中文字符,或者是否满足8位这个条件(本人并未对数据做未满8位以0补的处理): ////////////////////////////////////////////////////////////////////////// // 对输入的数据进行验证 if(m_old.GetLength()!=8) { MessageBox("请输入8位明文", "友情提示"); return; } if(m_key.GetLength()!=8) { MessageBox("请输入8位密文", "友情提示"); return; }对明文处理,将对应的ASCII码转化为二进制,并对中文字符的判断:////////////////////////////////////////////////////////////////////////// /// 此处对明文处理,将对应的ASCII码转化为二进制 int flag=true; for(int i=0; i<8; i++) { char ch=m_old.GetAt(i); if(ch&0x80&&flag) { MessageBox("含有中文字符,加密错误不负责任!", "友情提示"); flag=false; //return; } memset(tmp, 0, 8); for(int j=0; j<8; j++) { tmp[j]=(ch%2+2)%2; ch/=2; } for(j=7; j>=0; j--) { old[i*8+7-j]=tmp[j]; } } 为了实现加密解密迭代算法的共享,本人做了如下处理: /// 此处开始16迭代算法 isDecrypt=false; for(i=1; i<=16; i++) { CDESDlg::Iterate(i); }在16次迭代算法中,大部分操作是重复的,所以采取了上述的做法!在这里,本人把迭代算法的代码全部写在这里:void CDESDlg::Iterate(int numOfIteration){ ////////////////////////////////////////////////////////////////////////// /// 此处迭代生成子密钥ki int j=2; // 移位次数 if( numOfIteration==1||numOfIteration==2|| numOfIteration==9||numOfIteration==16) { j=1; } ////////////////////////////////////////////////////////////////////////// //如果为解密,迭代移位的次序变换相反方向 if(isDecrypt) { if(numOfIteration==16) { j=0; } else if(numOfIteration==15||numOfIteration==8||numOfIteration==1) { j=-1; } else { j=-2; } } // 省略此部分代码....... // 生成子密钥Ki,存储到数组k1[48]中去 ////////////////////////////////////////////////////////////////////////// // 将Ri-1扩充成48位并与Ki相加并模2 memset(re, 0, 48); for(i=0; i<48; i++) { re[i]=(R0[E_Table[i]-1]+k1[i])%2; > |