DES加密算法
- 格式:doc
- 大小:218.00 KB
- 文档页数:9
昆明理工大学理学院实验内容:1.实验/作业题目:DES加密算法的C++Builder实现2.实验/作业课时:2课时3.实验过程(包括实验环境、实验内容的描述、完成实验要求的知识或技能):实验环境:win7,C++ builder6实验内容的描述:用C++ builder实现加密完成实验要求:根据已知程序自行建立完成项目;学习相应算法4.程序结构(程序中的函数调用关系图)主要加密、解密算法:void __fastcall Tdes::Button1Click(TObject *Sender){ m_old= Edit1->Text;m_key= Edit1->Text;int i;// 对输入的数据进行验证if(m_old.Length()!=8){MessageBox(NULL,"请输入8位明文!", "友情提示",MB_OK);return;}if(m_key.Length()!=8){MessageBox(NULL,"请输入8位密文!", "友情提示",MB_OK);return;}String str; // 该字符串存储ASCII码///////////////////////////////////////////////////////////////////// /////// 初始化数组元素清0memset(L0, 0, 32);memset(R0, 0, 32);memset(k1, 0, 48);memset(Kc0, 0, 28);memset(Kd0, 0, 28);memset(re, 0, 48);memset(old, 0, 64);memset(s, 0, 48);///////////////////////////////////////////////////////////////////// /////// 此处开始加密m_new=""; //先将密文清空///////////////////////////////////////////////////////////////////// //////// 此处对明文处理,将对应的ASCII码转化为二进制int flag=true;for(int i=0; i<8; i++){char ch=m_old[i+1];if(ch&0x80&&flag){MessageBox(0,"含有中文字符,加密错误不负责任!", "友情提示",MB_OK);flag=false;//return;}memset(tmp, 0, 8);for(int j=0; j<8; j++){tmp[j]=(ch%2+2)%2;ch/=2;}for(int j=7; j>=0; j--){old[i*8+7-j]=tmp[j];}}// 此处显示明文二进制m_oldbin="";for(int i=0; i<64; i++){m_oldbin+=old[i];}//GetDlgItem(IDC_EDIT5)->SetWindowText(m_oldbin);Edit5->Text=m_oldbin;for(int i=0; i<32; i++){L0[i]=old[IP_Table[i]-1]; /// 获得L0共32位R0[i]=old[IP_Table[i+32]-1]; /// 获得R0共32位}///////////////////////////////////////////////////////////////////// //////// 此处开始对C0,D0处理for(int i=0; i<8; i++){memset(tmp, 0, 8);char ch=m_key[i+1];if(ch&0x80){MessageBox(NULL,"含有中文字符,加密失败", "友情提示",MB_OK);return;}for(int j=0; j<8; j++){tmp[j]=ch%2;ch/=2;}for(int j=7; j>=0; j--){k[i*8+7-j]=tmp[j];}}for(int i=0; i<28; i++){Kc0[i]=k[PC1_Table[i]-1]; /// 获得c0共28位Kd0[i]=k[PC1_Table[i+28]-1]; /// 获得d0共28位}///////////////////////////////////////////////////////////////////// //////// 此处开始16迭代算法isDecrypt=false;for(int i=1; i<=16; i++){Iterate(i);}///////////////////////////////////////////////////////////////////// /////// 最后一次生成的L16与R16调换位置装入密文字符串里int miwen[64];memset(miwen, 0, 64);// 逆初始置换,真它MOTHER的麻烦!int mitmp[64];memset(mitmp, 0, 64);for(int i=0; i<32; i++){mitmp[i]=R0[i];mitmp[32+i]=L0[i];//交换L0,R0的值L0[i]=mitmp[i];R0[i]=mitmp[i+32];}for(int i=0; i<64; i++){miwen[i]=mitmp[IPR_Table[i]-1];}///////////////////////////////////////////////////////////////////// /////// 将密文2进制存入m_keybin//str="";m_keybin="";for(i=0; i<64; i++){// str.Format("%d", miwen[i]);m_keybin+=miwen[i];}Edit6->Text=m_keybin;///////////////////////////////////////////////////////////////////// /////// 将密文ASCII码放入编辑框里面去m_new="";for(i=0; i<8; i++){int tmp=0;tmp+=miwen[8*i];for(int j=1; j<8; j++){tmp*=2;tmp+=miwen[i*8+j];}//str.Format("%c", tmp);m_new+=(char)tmp;}//GetDlgItem(IDC_EDIT3)->SetWindowText(m_new);Edit3->Text=m_new;Button2->Enabled=true;}void __fastcall Tdes::Button2Click(TObject *Sender){/// 重新开始16次迭代算法isDecrypt=true;int i;for(i=16; i>=1; i--){Iterate(i);}///////////////////////////////////////////////////////////////////// /////// 最后一次生成的L16<->R16调换位置int minwen[64];memset(minwen, 0, 64);// 逆初始置换!int mintmp[64];memset(mintmp, 0, 64);for(i=0; i<32; i++){mintmp[i]=R0[i];mintmp[32+i]=L0[i];}for(i=0; i<64; i++){minwen[i]=mintmp[IPR_Table[i]-1];}///////////////////////////////////////////////////////////////////// /////// 将密文ASCII码放入编辑框里面去//CString str;m_Last="";for(i=0; i<8; i++){int tmp=0;tmp+=minwen[8*i];for(int j=1; j<8; j++){tmp*=2;tmp+=minwen[i*8+j];}//str.Format("%c", tmp);m_Last+=(char)tmp;}//UpdateData(false);// 让解密按钮无效;Button1->Enabled=false;Edit4->Text=m_Last;}5.算法描述、流程图或操作步骤:略6.实验数据和实验结果(用屏幕图形表示,可另加附页):(1)设计页面:(2)关系图:(3)程序界面:(4)运行结果:7.改进建议:(1)加密只能是8位的明,不能执行其它位数的加密;(2)对上一次加密的密文不能清除,再次点击“加密”按钮时会对上次结果再次加密;评分标准学风--报告格式规范,文字清晰观察能力--正确描述和理解需要操作的问题操作能力--正确输入程序,熟悉编程环境调试能力--熟练使用调试功能解决程序错误。