密码学课程设计论文.doc_第1页
密码学课程设计论文.doc_第2页
密码学课程设计论文.doc_第3页
密码学课程设计论文.doc_第4页
密码学课程设计论文.doc_第5页
已阅读5页,还剩15页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

课 程 设 计 一、课程设计的内容运用C语言、C+面向对象、数据结构以及刚学习的密码学等知识,在认真学习古典密码的理论知识之后,通过编程进行各类古典密码的算法的实现,并产生界面友好。二、课程设计的要求与数据论文摘要包括,摘要正文和关键词,课程设计正文(绪论(说明做这个课题的意义)、理论部分(相关的理论)、代码的实现部分、总结)三、课程设计应完成的工作各类古典密码算法的编写程序MFC的关联论文的撰写(目录的自动生成)四、应收集的资料及主要参考文献论文摘要:本文主要对古典密码中的移位密码(凯撒密码),仿射密码,维吉利亚(Vigenere)密码以,单表代换密码,置换密码和周期置换密码进行算法设计,最后用C+方法实现友好界面。通过对这几个古典密码的算法分析,更加系统的掌握其中的原理和应用。关键词 凯撒密码、置换密码、算法、MFC关联、代码目 录第1章 绪论6第2章 理论部分72.1:移位密码72.2:仿射密码72.3:维吉利亚密码72.4:一般的单表代换密码72.5:列置换密码82.6:周期置换密码8第3章 代码的实现83.1:程序主界面:83.2 移位密码:93.3 仿射密码113.4 维吉利亚密码153.5 单表代换密码183.6 置换密码213.7 周期置换密码23第4章 总结25第5章 参考文献26第1章 绪论 密码学包括两部分,即密码编码学和密码分析学,这两个部分即对立又统一,正是由于其对立性才促进了密码学的发展。一个密码系统的安全性只有通过对该系统抵抗当前各类攻击能力的考查和全面分析才能做出定论。密码体制的安全性分析是一个相当复杂的问题,但有一点是清楚的,那就是掌握现有的分析方法并使用这些方法对相应的体制进行分析以考察其安全强度。在密码编码体制中,有两种最基本也是最古老的编码体制一直沿用至今,它们是代换密码和置换密码,由于历史悠久并且是现代密码体制的基本组成部分,因而在密码学中占有重要的地位。古典密码是密码学发展的一个阶段,也是近代密码学产生的渊源,尽管古典密码大多比较简单,一般可用手工或机械方式实现其加密和解密过程,破译也比较简单,目前已经很少采用,但了解它们的设计原理,有助于理解、设计和分析现代密码。日常生活中,在大多数的情况下,我们不用担心别人偷听,因为即使被人偷听到了他也无法用偷听到的信息做什么坏事。但当我们谈论某些比较敏感的话题时,被别人偷听到的话可能会产生一些负面的影响,对当事人很不利。在文字交流中,一些重要的信息,比如重要决定,人事变动和秘密情报等,当事人是不希望别人看到的,但如何进行交流呢?一个简单的办法就是采用文字编码。例如,将英文中的每个字母固定地换成它后面第5个字母,A换成F,B换成G,V换成A,W换成B,最后Z换成E。字母编码如下表所示:原文ABCDVWXYZ密文FGHIABCDE因此,消息I love you就变成了n qtaj dtz,消息有明确的信息,而编码后的字符串却是一串乱码,信息隐藏在其中,达到了保密的效果。对于古典密码体制而言,我们有如下的约定:加密解密时忽略空格和标点符号,这可能让人不太适应,但是经过解密后,几乎总是可以正确的还原明文中的这些空缺。如果保留这些空缺,密文会保持明文的结构特点,为攻击者提供便利。本文主要是通过对各类型的古典密码进行算法设计,通过编写程序来深层掌握古典密码的算法技术,通过对各类型古典密码进行详细的分析,分工讨论,在实现系统掌握这些密码算法的同时,也对C语言和C+面向对象进行了复习,有效的巩固了以前的知识,也培养了对专业密码学的学习兴趣。第2章 理论部分代换是古典密码中用到的最基本的处理技巧,它在现代密码学中得到了广泛的应用,内容非常的丰富,人们采用代换密码进行加密时并没有固定的模式。按照一个明文字母是否总是被一个固定的字母代换进行划分时,代换密码可以分为两大类:(1) 单表代换密码:对明文消息中出现的同一个字母,在加密时都用同一个固定的字母来代换,不管它出现在什么地方。移位密码和仿射密码都属于单表代换密码。(2) 多表代换密码:明文消息中出现的同一个字母,在加密时不是完全被同一个固定的字母代换,而是根据其出现的位置次序,用不同的字母代换,如维吉利亚密码和Playfair密码。2.1:移位密码明文空间P与密文空间C都是26个英文字母的集合,密钥空间K=0,1,2,25。在实际进行加密解密运算时,把26个字母依次与0,1,2,25对应。因而也可以说P=C=K=0,1,25=Z。E=e:Z-Z,e(x)=x+k(mod 26),即对每个KZ,相应的加密变换为ek(m)=m+k(mod 26),其中mZ为明文。D=d:Z-Z,d(x)=x-k(mod 26),即对密钥k,解密变换为dk(y)=y-k(mod 26),其中yZ为密文。解密之后要把Z中的元素再变换为英文字母。2.2:仿射密码明、密文空间与移位密码相同,密钥空间为K=(k1,k2)|k1,k2Z,其中gcd(k1,26=1) gcd表示两个数的最大公因子,gcd(k1,26)=1,即表示k1还 26互素。对任意的k=(k1,k2)K,加密变换为e(m)=k1*m+k2*(mod 26).相应的解密变化为d(c)=k1(-1)*(c-k2)(mod 26),其中:k1*k1(-1)=1(mod 26).2.3:维吉利亚密码 该密码有一个参数n。在加解密时同样把英文字母用数字代替进行运算,并按n个字母一组进行变换。明、密文空间及密钥空间都是n长的字母串的集合,因此可以表示P=C=K=Z(26).加密变换如下:设密钥k=(k1,k2,kn),明文P=(m1,m2,mn),加密函数为e(p)=(c1,c2,cn),其中Ci=(mi+ki)(mod 26),i=1,2,n。对密文c=(m1,m2,mn),密钥k=(k1,k2,kn),解密变换为:e(c)=(m1,m2,mn),其中m1=(c1-k1)(mod 26),i=1,2,n。其中mi=(ci-ki)(mod 26),i=1,2,n。2.4:一般的单表代换密码 单表代换密码的原理是:以26个字母的集合上的一个置换为密钥对明文消息中的每个字母依次进行变换,变换的方法是把明文中的每个字母用它在置换下的像去替换。解密时用的逆置换进行替换。可描述为P=C=0,1,2,25=Z,K=:Z-Z|是置换。密钥对应的加密变换e(x)= (x),解密变换为d(y)= (-1)(y).前面描述的移位密码和仿射密码都是单表代换密码,而维吉利亚密码不是单表代换密码。2.5:列置换密码置换密码是把明文中各字符的位置次序重新排列来得到密文的一种密码体制。列置换密码的加密方法如下:把明文字符以固定的宽度m(分组长度)水平地(按行)写在一张纸上,按1,2,3,m的一个置换交换列的次序位置,再按垂直方向(按列)读出即得密文。解密就是就是将密文按照相同的宽度m垂直的写在纸上,按置换的逆置换交换列的位置次序,然后水平的读出得到明文,置换就是密钥。2.6:周期置换密码周期置换密码是将明文字符按照一定长度m分组,把每组中的字符按1,2,m的一个置换重排位置次序来得到密文的一种加密方法。其中的密钥就是置换,在的描述中包含了分组长度的信息。解密时,对密文字符按长度m分组,并按的逆置换(-1)把每组字符重排位置次序来得到明文。第3章 代码的实现3.1:程序主界面:3.2 移位密码:部分代码实现:void kaisa:Onjiami() / TODO: Add your control notification handler code hereint i;char b;this-UpdateData();if (m_mingwen.IsEmpty()MessageBox(要加密的文字不能为空!);m_jiami=m_mingwen;int n=m_jiami.GetLength();for( i=0;in;i+) b=m_jiami.GetAt(i);if(a = b & b = z)m_jiami.SetAt(i,a+(b-a+m_k)%26);else if(A = b & b MessageBox(输入明文只能为大、小写字母或空格!);this-UpdateData(false);void kaisa:Onjiemi() / TODO: Add your control notification handler code herethis-UpdateData();int i;m_jiemi=m_jiami;int n=m_jiemi.GetLength();for(i=0;in;i+)char b=m_jiemi.GetAt(i);if(a = m_jiami.GetAt(i) & m_jiami.GetAt(i) = z)m_jiemi.SetAt(i,a+(b-a-m_k+26)%26);if(A = b & b UpdateData(false);void kaisa:Onclose() / TODO: Add your control notification handler code hereCDialog:OnOK();3.3 仿射密码部分代码如下:fangshe:fangshe(CWnd* pParent /*=NULL*/): CDialog(fangshe:IDD, pParent)/AFX_DATA_INIT(fangshe)m_mingwen = _T();m_k1 = 0;m_k2 = 0;m_jiami = _T();m_jiemi = _T();/AFX_DATA_INITvoid fangshe:DoDataExchange(CDataExchange* pDX)CDialog:DoDataExchange(pDX);/AFX_DATA_MAP(fangshe)DDX_Text(pDX, IDC_EDIT1, m_mingwen);DDX_Text(pDX, IDC_EDIT2, m_k1);DDX_Text(pDX, IDC_EDIT3, m_k2);DDX_Text(pDX, IDC_EDIT4, m_jiami);DDX_Text(pDX, IDC_EDIT5, m_jiemi);/AFX_DATA_MAPBEGIN_MESSAGE_MAP(fangshe, CDialog)/AFX_MSG_MAP(fangshe)ON_BN_CLICKED(IDCANCEL, Onjiami)ON_BN_CLICKED(IDOK, Onjiemi)ON_BN_CLICKED(IDC_BUTTON1, Onclose)/AFX_MSG_MAPEND_MESSAGE_MAP()/ fangshe message handlersint gcd(int a, int b) /*辗转相除法求a,b的最大公因数*/ int k = 0; do k = a%b; a = b; b = k; while(k!=0); return a; int Ni(int a, int b) /*求a相对于b的逆*/ int i = 0; while(a*(+i)%b!=1); return i; void fangshe:Onjiami() / TODO: Add your control notification handler code hereint i;this-UpdateData();if (m_mingwen.IsEmpty()MessageBox(要加密的文字不能为空!);m_jiami=m_mingwen;int n=m_jiami.GetLength();char b;for( i=0;in;i+) b=m_jiami.GetAt(i);/if(a = b & b = z)if(gcd(m_k1,26)=1) if(a = b & b = z)m_jiami.SetAt(i,a+(m_k1*(b-a)+m_k2)%26);else if(A = b & b MessageBox(输入明文只能为大、字母或空格!);else m_jiami=;this-MessageBox(请输入一个和26互素的正整数作为密钥!);this-UpdateData(false);void fangshe:Onjiemi() / TODO: Add your control notification handler code herethis-UpdateData();int i;m_jiemi=m_jiami;int n=m_jiemi.GetLength();for(i=0;in;i+)char b=m_jiemi.GetAt(i);if(a = b & b = z)m_jiemi.SetAt(i,a+(Ni(m_k1,26)*(b-a-m_k2+26)%26);if(A = b & b UpdateData(false);void fangshe:Onclose() / TODO: Add your control notification handler code hereCDialog:OnOK();3.4 维吉利亚密码部分代码:void Vigenere:OnButton1() / TODO: Add your control notification handler code hereCDialog:OnOK();void Vigenere:Onjiami() / TODO: Add your control notification handler code hereint i,j,k;int pos=0,tag;this-UpdateData();if (m_mingwen.IsEmpty()MessageBox(要加密的文字不能为空!);if (m_k.IsEmpty()MessageBox(密钥不能为空!);int n=m_mingwen.GetLength();/求输入内容的长度int m=m_k.GetLength();/密钥长度m_jiami=m_mingwen;for( i=0,j=0;in;i+)/把明文中非空格的元素存在数组B中。if(m_jiami.GetAt(i)!= )Bj+=m_jiami.GetAt(i);tag=0;Spos+=tag;/遇到空格,S中该位置的元素为0;elsetag=1;Spos+=tag;/遇到非空格,S中该位置的元素为1;/m_jiami.Remove( );/j=m_jiami.GetLength(); for( k=0;kj;k+)/j位B的元素个数,即明文中非空格元素的个数。/Bk=m_jiami.GetAt(k);Ak%m=m_k.GetAt(k%m);if(a =Bk & Bk = z)if(a =Ak%m & Ak%m = z)m_jiami.SetAt(k,a+(Bk-a+Ak%m-a)%26);else if(A =Bk%m & Ak%m = Z)m_jiami.SetAt(k,a+(Bk-a+Ak%m-A)%26);elseif(A = Bk & Bk= Z)if(A =Ak%m & Ak%m = Z)m_jiami.SetAt(k,A+(Bk-A+Ak%m-A)%26);elseif(a =Ak%m & Ak%m MessageBox(输入明文只能为大、小写字母或空格!);for(k=j;kUpdateData(false);void Vigenere:Onjiemi() / TODO: Add your control notification handler code hereint i;this-UpdateData();int n=m_jiami.GetLength();m_jiemi=m_jiami;int m=m_k.GetLength();for( i=0;in;i+) Bi=m_jiemi.GetAt(i);Ai%m=m_k.GetAt(i%m);if(a=Bi & Ai = z)if(a =Ai%m & Ai%m = z)m_jiemi.SetAt(i,a+(Bi-a-Ai%m+a+26)%26);else if(A =Bi%m & Ai%m = Z)m_jiemi.SetAt(i,a+(Bi-a-Ai%m+A+26)%26);elseif(A = Bi & Bi= Z)if(A =Ai%m & Ai%m = Z)m_jiemi.SetAt(i,A+(Bi-A-Ai%m+A+26)%26);elseif(a =Ai%m & Ai%m = z)m_jiemi.SetAt(i,A+(Bi-A-Ai%m+a+26)%26);for(int t=0;t=t;r-)m_jiemi.SetAt(r+1,m_jiemi.GetAt(r);m_jiemi.SetAt(t, );this-UpdateData(false);3.5 单表代换密码部分代码:char str1=abcdefghijklmnopqrstuvwxyz; /原字母表。char T27;void single:OnButton1() / TODO: Add your control notification handler code hereCDialog:OnOK();void single:Ondhb() / TODO: Add your control notification handler code hereint i,j;this-UpdateData();m_yb=str1;for(i=0;i26;i+)m_yb.Insert(2*i, );int n=m_mingwen.GetLength();int m=m_k.GetLength();int pos=0;int tag=1;if(a =m_k0 & m_k0 MessageBox(输入只能为大、小写字母);for( i=1;im;i+)/填充代换表的其他位置。if(a =m_ki & m_ki = z)tag=1;for( j=0;j=pos;j+)if(Tj=m_ki)/不是表中已经存在字母。tag=0;if(tag=1)/不是表中已经存在字母,填充到代换表的下一个位置。T+pos=m_ki;for( i=0;i26;i+)/把没有在代换表中出现的字母顺序填充到代换表中。tag=1;for(j=0;j=pos;j+)if(Tj=str1i)tag=0;if(tag=1)T+pos=str1i;m_dhb=T;/代换表。for(i=0;iUpdateData(false);void single:Onjiami() / TODO: Add your control notification handler code hereint i,j;this-UpdateData();m_jiami.Empty();if (m_mingwen.IsEmpty()MessageBox(要加密的文字不能为空!);if (m_k.IsEmpty()MessageBox(密钥不能为空!);int n=m_mingwen.GetLength();int m=m_k.GetLength();for( i=0;in;i+)if(a =m_mingweni & m_mingweni = z)int pos=m_mingweni-a;m_jiami+=Tpos;else if(A =m_mingweni & m_mingweni MessageBox(输入明文只能为大、小写字母或空格!);this-UpdateData(false);void single:Onjiemi() / TODO: Add your control notification handler code hereint i,j;this-UpdateData();if (m_jiami.IsEmpty()MessageBox(请在加密对应的方框中输入要加密的内容!);m_jiemi.Empty();int n=m_jiami.GetLength();int m=m_k.GetLength();for( i=0;in;i+)if(a=m_jiamii & m_jiamii = z)for(j=0;j26;j+)if(m_jiamii=Tj)/比较密文的第i位对应代换表的哪个字母。m_jiemi+=str1j;/把代换表中相应的字母换成原字母表的字母作为解密的结果。else if(A =m_jiamii & m_jiamii = Z)for(j=0;jUpdateData(false);3.6 置换密码部分代码:void zhi:Onjiami() / TODO: Add your control notification handler code hereUpdateData();m_jiami.Empty();/加密前为空int keylen=m_key.GetLength();/密钥长度int len=m_mingwen.GetLength();/明文长度int i=len/keylen; /分组长度int j=len%keylen;if (0!=j)/明文长度不是密钥长度的整数倍。for(int m=0; mkeylen-j; +m)/明文长度不是密钥长度的整数倍,在后面补上空格,是明文长度为密钥整数倍。m_mingwen+= ;i+;int n, m;for (n = 0; nkeylen; n+)for (m = 0; mi; m+)m_jiami+=m_mingwenm*keylen+m_keyn-1-0;UpdateData(FALSE);void zhi:Onjiemi() / TODO: Add your control notification handler code hereUpdateData();m_jiemi.Empty();/解密前为空int keylen=m_key.GetLength();/密钥长度int len=m_jiami.GetLength();/密文长度int i=len/keylen; /行数int j=len%keylen;int n, m, k;for (n=0; ni; n+)for (m=1; m=keylen; m+) for(k=0;kkeylen;k+)if(m_keyk=0+m)m_jiemi+=m_jiamik*i+n;UpdateData(FALSE);void zhi:Onguanbi() / TODO: Add your control notification handler code hereCDialog:OnOK();3.7 周期置换密码部分代码如下:void zhouqi:Onjiami() / TODO: Add your control notification handler code hereUpdateData();m_jiami.Empty();int keylen=m_key.GetLength();/密钥长度int len=m_mingwen.GetLength();/明文长度int i=len/keylen; /分组长度int j=len%keylen;if (0!=j)for(int m=0; mkeylen-j; +m) /明文长度不是密钥长度的整数倍,在后面补上空格,是明文长度为密钥整数倍。m_mingwen+= ;i+;int n, m,k;for (n= 0; ni; n+)for (m = 0; m=keylen; +m) for(k=0;kkeylen;k+)if(m_keyk=m+0)m_jiami+=m_mingwenn*keylen+m_key(k-1+keylen)%keylen-1-0;UpdateData(FALSE);void zhouqi:Onjiemi() / TODO: Add your control notification handler code hereUpdateData();m_jiemi.Empty();int keylen=m_key.GetLength();/密钥长度int len=m_jiami.GetLength();/明文长度int i=len/keylen;

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论