您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 资本运营 > Hill算法实验报告
《密码编码学与网络安全》实验报告题目:实验三Hill算法姓名实验环境:WindowsXPSp2硬件环境:CPU:IntelCore2DuoT7100硬盘:120G内存:2G(自己填写实际)实验要求:应用Hill算法编写一个程序。要求此程序能够进行正常的加解密。并能够实现m维Hill密码的已知明文攻击。实验原理:Hill加密算法的基本思想是将l个明文字母通过线性变换将它们转换为k个密文字母。脱密只要做一次逆变换就可以了。密钥就是变换矩阵本身。即M=m1m2……mlEk(M)=c1c2……cl其中c1=k11m1+k12m2+……+k1lmlc2=k21m1+k22m2+……+k2lml……cl=kl1m1+kl2m2+……+kllml通常对于字母加解密,使用mod26的方法。以上线性方程可以采用矩阵表示。实验内容及过程:1.数据结构定义部分:cmatrix:double型二维数组,用于存储密文矩阵信息。newpmatrix:double型二维数组,用于存储矩阵转逆变换后的明文矩阵信息。oldpmatrix:double型二维数组,用于存储一开始未转逆的明文矩阵信息。pmatrix:double型二维数组,用于存储最终的明文矩阵信息。kmatrix:double型二维数组,用于存储密钥矩阵信息。sc,sp:string型,明密文存储字符串。r,c:int型,用于限制每次明密文矩阵的已知字符数。2.基本函数定义:changemod:返回类型为int型,参数类型为int型。主要用途是:对一个输入的整型不断进行模26处理。直到这个数能够被变量bs整除。(这个函数的设置目的主要是为了防止算出的矩阵为小数)。3.主要的算法思想:对于输入的明密文矩阵,pmatrix和cmatrix矩阵。首先使用线性代数的方法将明文矩阵进行行代换,如下列代码所示:for(intk=1;k=r;k++){for(intt=c+1;t=c*2;t++){if((t-k)==c){pmatrix[k][t]=1;}else{pmatrix[k][t]=0;}}}for(intx=1;x=r;x++){for(inty=1;y=c*2;y++){System.out.print(pmatrix[x][y]+);}System.out.println();}然后将所得的行代换后的明文矩阵进行逆矩阵变换操作,具体步骤参见线性代数相关章节。具体代码为:for(intk=1;k=c;k++){if(pmatrix[k][k]!=1){intbs=pmatrix[k][k];pmatrix[k][k]=1;for(intp=k+1;p=c*2;p++){intsum=pmatrix[k][p];while(sum%bs!=0){sum+=26;}pmatrix[k][p]=sum/bs;}}for(intq=1;q=r;q++){if(q!=k){intbs=pmatrix[q][k];for(intp=1;p=c*2;p++){pmatrix[q][p]-=bs*pmatrix[k][p];}}else{continue;}}}注意:其中的bs为各小矩阵的行列式的值。以上两段代码为关于如何进行逆矩阵转换的具体实现。4.输入与输出:本算法的输入为如下三项:a.已知明密文对每对的字符个数;b.已知的明文对(若干);c.与之相对应的密文对。本算法的输出为如下三项:a.行代换后的明文矩阵;b.明文矩阵的逆矩阵;c.最终解得的密钥矩阵K。5.最终运行结果:输入如下所述:已知明密文对每对的字符个数:2已知的明文:fr,与之相对的密文:PQ;已知的明文:id,与之相对的密文:CF;输出为下图所示:出现的问题以及解决方案:问题1:所做出的密钥矩阵K中元素的数值是小数。解决方案:由于忽视了每次矩阵的mod26计算,造成了最终得出的密钥矩阵K中的小数。只需对每一个被除数每次+26直到除尽即可。最后统一进行mod26直到最简。
本文标题:Hill算法实验报告
链接地址:https://www.777doc.com/doc-5892201 .html