现代密码学课程设计实验报告 -

西安科技大学

《现代密码学》课程设计报告

题    目:                密码学计算器                  

学  院:           计算机科学与技术学院                

班  级:                                                

姓    名:                                              

学   号:                                               

日    期:                20XX.1.8                      

一.课程设计题目

        密码学计算器的研究与实现

二.分工

对称密码程序实现Des算法  组长: 

古典密码程序设计(置换)       

SHA算法                     

ECC算法                       

三.软件运行环境

    Windows7操作系统  visual C++

四.算法设计思想

        1.古典密码置换算法

     置换密码算法的原理是不改变明文字符,只将字符在明文中的排列顺序改变,从而实现明文信息的加密。置换密码又称为换位密码。

矩阵换位法是实现置换密码的一种常用方法。它将明文中的字母按照给定的顺序安排在一个矩阵中,然后又根据密钥提供的顺序重新组合矩阵中的字母,从而形成密文。例如,明文为 attack begins at five ,密钥为 cipher ,将明文按照每行6个字母的形式排在矩阵中,形成如下形式:

                 a  t   t   a   c   k

                    b  e   g   i   n   s  

                 a  t   f   i   v   e

根据密钥 cipher 中各字母在字母表中出现的先后顺序,得到给定的一个置换:

                 f = 1 4 5 3 2 6

因此有:

        密钥:   1  4   5   3   2   6

        明文:   a  t   t   a   c   k

                 b  e   g   i   n   s

                 a  t   f   i   v   e

根据上面的置换,将原有矩阵中的字母按照第1列、第4列、第5列、第3列、第2列、第6列的顺序排列、则有下面的形式:

a  a   c   t   t   k

                 b  i   n   g   e   s

                 a  i   v   f   t   e

从而得到密文:abatgftetcnvaiikse

其解密过程是根据密钥的字母数作为列数,将密文按照列、行的顺序写出,再根据由密钥给出的矩阵置换产生新的矩阵,从而恢复明文。

        2.ECC算法

         ECC(Elliptic Curves Cryptography)加密算法是一种公钥加密算法,与主流的RSA算法相比,ECC算法可以使用较短的密钥达到相同的安全程度。近年来,人们对ECC的认识已经不再处于研究阶段,开始逐步进入实际应用,如国家密码管理局颁布的SM2算法就是基于ECC算法的

 在引入椭圆曲线之前,不得不提到一种新的坐标系-------射影平面坐标系,它是对笛卡尔直角坐标系的扩展,增加了无穷远点的概念。在此坐标系下,两条平行的直线是有交点的,而交点就是无穷远点。两者的变换关系为:

笛卡尔坐标系中的点a(x,y),令x=X/Z,y=Y/Z,则射影平面坐标系下的点a的坐标为(X,Y,Z),如点(2,3)就转换为(2Z,3Z,Z)。

加法法则

运算法则:任意取椭圆曲线上两点P、Q (若P、Q两点重合,则做P点的切线)做直线交于椭圆曲线的另一点R’,过R’做y轴的平行线交于R。我们规定P+Q=R。(如图) 

下面,我们利用P、Q点的坐标(x1,y1),(x2,y2),求出R=P+Q的坐标(x4,y4)。

P,Q,R'共线,设为y=kx+b,

若P≠Q,k=(y1-y2)/(x1-x2)

若P=Q,k=(3x2+2a2x+a4 -a1y) /(2y+a1x+a3) 

解方程组得到:

 x4=k2+ka1-a2-x1-x2; 
 y4=k(x1-x4)-y1-a1x4-a3;

        3.对称密码DES算法

     DES是一个16轮的Feistel型结构密码,它的分组长度为64比特,用一个56比特的密钥来加密一个64比特的明文串,输出一个64比特的密文串。其中,使用密钥为64比特,实用56比特,另8位用作奇偶校验。加密的过程是先对64位明文分组进行初始置换,然后分左、右两部分分别经过16轮迭代,然后再进行循环移位与变换,最后进行逆变换得出密文。加密与解密使用相同的密钥,因而它属于对称密码体制。

图4-3给出了DES过程框图。假设输入的明文数据是64比特。首先经过初始置换IP后把其左半部分32比特记为L0,右半部分32比特记为R0,即成了置换后的输入;然后把R0与密钥产生器产生的子密钥k1进行运算,其结果计为f (R0,k1);再与L0进行摸2加得到L0+f (R0 , k1), 把R0记为L1放在左边,而把L0+f (R0 , k1)记为R1放在右边,从而完成了第一轮迭代运算。在此基础上,重复上述的迭代过程,一直迭代至第16轮。所得的第16轮迭代结果左右不交换,即L15+f (R15 , k16)记为R16,放在左边,而R15记为L16放在右边,成为预输出,最后经过初始置换的逆置换IP-1运算后得到密文。

  

4-3  DES框图

DES的解密过程与加密过程共用了同样的计算过程。两者的不同之处仅在于解密时子密钥ki的使用顺序与加密时相反。如果加密的子密钥k1,k2,…,k16, 那么,解密时子密钥的使用顺序为与k16,k15,…,k1。即:用DES解密时,将以64位密文作为输入,第一轮迭代使用子密钥k16;第二轮迭代使用子密钥k15 , … , 第16轮迭代使用子密钥k1, 其他运算与加密时一样,最后输出的便是64位明文。

        4.SHA算法

散列是信息的提炼,通常其长度要比信息小得多,且为一个固定长度。加密性强的散列一定是不可逆的,这就意味着通过散列结果,无法推出任何部分的原始信息。任何输入信息的变化,哪怕仅一位,都将导致散列结果的明显变化,这称之为雪崩效应。散列还应该是防冲突的,即找不出具有相同散列结果的两条信息。具有这些特性的散列结果就可以用于验证信息是否被修改。

SHA-1是一种数据加密算法,该算法的思想是接收一段明文,然后以一种不可逆的方式将它转换成一段(通常更小)密文,也可以简单的理解为取一串输入码(称为预映射或信息),并把它们转化为长度较短、位数固定的输出序列即散列值(也称为信息摘要或信息认证代码)的过程。

单向散列函数的安全性在于其产生散列值的操作过程具有较强的单向性。如果在输入序列中嵌入密码,那么任何人在不知道密码的情况下都不能产生正确的散列值,从而保证了其安全性。SHA将输入流按照每块512位(64个字节)进行分块,并产生20个字节的被称为信息认证代码或信息摘要的输出。

该算法输入报文的长度不限,产生的输出是一个160位的报文摘要。输入是按512 位的分组进行处理的。SHA-1是不可逆的、防冲突,并具有良好的雪崩效应。

通过散列算法可实现数字签名实现,数字签名的原理是将要传送的明文通过一种函数运算(Hash)转换成报文摘要(不同的明文对应不同的报文摘要),报文摘要加密后与明文一起传送给接受方,接受方将接受的明文产生新的报文摘要与发送方的发来报文摘要解密比较,比较结果一致表示明文未被改动,如果不一致表示明文已被篡改。

MAC (信息认证代码)就是一个散列结果,其中部分输入信息是密码,只有知道这个密码的参与者才能再次计算和验证MAC码的合法性。

五.算法设计与分析(含流程图)

该密码学计算器实现了四个功能,其中两个:

    (1)古典密码程序设计(置换)

(2)对称密码程序实现(DES)

(3)SHA算法              

(4)ECC算法                

    我负责的是古典密码置换算法,我的思想是:不改变原给字母的字符,只根据所给秘钥改变原给字符串的顺序,从而对明文加密,解密思想与加密一样。

加密核心代码如下:

                  printf ("请输入需要加密的字符数量(不大于100):");

                  scanf("%d",&k);

   printf("请输入明文(字符串): \n");

                  for(i=0;i

                           scanf("%d",&ming[i]);

                  for(j=0;j

                  {        l=1;

                           a=ming[j];

                           m=1;

                           for (i=1;i<=e;i++)

                           m=m*a;

                           l=m%n;

                           if (l<0)

                                    l=l+n;

                           c[j]=l;

                  }       

             printf("加密后的密文是:\n");

                  for(j=0;j

                      printf("%d",c[j]);

解密核心代码如下:

printf ("请输入需要解密的字符数量(不大于100):");

                  scanf("%d",&k);

                  printf("请输入密文(字符串): \n");

                  for(i=0;i

                           scanf("%d",&c[i]);

                  for(j=0;j

                          m=1;l=1;

                   a=c[j];

                           for (i=1;i<=d;i++)

                                    m=m*a;

                              l=m%n;

                           if (l<0) //在进行Mod操作时,会出现负数,我进行了+n 操作。

                                    l=l+n;

                           ming[j]=l;}

                  printf("解密后的明文是:\n");

                  for(j=0;j

                           printf("%d",ming[j]);

 1.公钥e与t的互素判断函数

现代密码学课程设计实验报告 -

        

2.    Main函数

现代密码学课程设计实验报告 -

现代密码学课程设计实验报告 -

六.测试结果与分析

       加密如下:

     

解密:

  

七.总结

   这次课程设计,使我对密码学这门课有了更深刻地理解,也为毕业设计打下了一定的密码学基础。我负责的是古典密码置换算法,在算法编程实现时,确实遇到了出现乱码的以及加密后出现问题,通过和组员的讨论和查资料,解决了这一问题,收获颇多。

八.参考文献

        1.杨义先 . 应用密码学. 北京邮电大学出版社. 20##年

    2.杨波. 现代密码学.清华大学出版社.20##年

相关推荐