密码学课程设计

密码学的重要性:

随着计算机网络技术和通讯技术的迅猛发展,大量的敏感信息常常通过计算机网络进行交换,在这些信息的传输与处理的过程中,如何保护信息安全使之不被非法窃取或篡改,成为人们关注的问题。因此计算机密码学就成为信息安全中的一个重要的研究领域。密码体制的分类方法有很多,常用的几种分类方法如下:根据加密与解密算法中使用密钥是否相同,将其分为对称密钥密码体制和非对称密钥密码体制。

非对称密码体制的由来

在公开的计算机网络上安全地传送和保管密钥是一个严峻的问题。正是由于对称密码学中双方都使用相同的密钥,因此无法实现数据签名和不可否认性等功能。20世纪70年代以来,一些学者提出了公开密钥体制,即运用单向函数的数学原理,以实现加、解密密钥的分离。加密密钥是公开的,解密密钥是保密的。密钥对的工作是可以任选方向的。这提供了"数字签名"的基础,如果要一个用户用自己的私人密钥对数据进行了处理,别人可以用他提供的公共密钥对数据加以处理。由于仅仅拥有者本人知道私人密钥,这种被处理过的报文就形成了一种电子签名----一种别人无法产生的文件。 数字证书中包含了公共密钥信息,从而确认了拥有密钥对的用户的身份。

从对称密码到非对称密码

对称密码算法计算开销小,算法简单,加密速度快,是目前用于信息加密的主要算法。但它在进行安全通信前需要以安全方式进行密钥交换。这一步骤,在某些情况下会非常困难,甚至无法实现。例如,某一贸易方有几个贸易关系,他就要维护几个专用密钥且没法鉴别贸易发起方或贸易最终方,因为贸易的双方的密钥相同。另外,由于对称加密系统仅能用于对数据进行加解密处理,提供数据的机密性,不能用于数字签名。因而人们迫切需要寻找新的密码体制。

在谈到加密的时候,最新的不一定是最好的。应该选择那种合适的、已经被大量公开分析和测试过的加密算法,因为在密码学领域是没有机会去尝试一个新算法的。

算法和密钥

明文M,密文C,加密E,解密D

密钥用K表示

K可以是很多数值里的任意值,密钥K的可能值的范围叫做密钥空间。加密和解密运算都使用这个密钥,即运算都依赖于密钥,并用K作为下标表示,加解密函数表达为:

E(M , k)=C

D(C , k)=M

D(E(M , k), k)=M,如图所示。

 

非对称密码与对称密码的对比

非对称密码体制

优点:

不需要经安全渠道传递密钥,大大简化了密钥管理, 加密数据安全性高。

在多人之间进行保密信息传输所需的密钥组和数量很小。

实现数字签名。

缺点:

公开密钥加密比私有密钥加密在加密/解密时的速度慢,因此公钥加密不适合较大数据。

对称密码体制

优点:

计算开销小,算法简单,密钥较短,加解密速度快,因此特别适用于对较大的数据流执行加密转换。

缺点:

仅能用于对数据进行加解密处理,提供数据的机密性。

规模复杂。

不能实现数字签名。

非对称密码与对称密码的对比

非对称密码体制

应用:主要用于短消息和对称密钥的加密。如SSL,PGP,和S/MIME中。

常用算法:RSA算法、E1 Gamal算法

对称密码体制

应用:主要用于长明文的加密,如文件,网络,数据库加密。

常用算法:(分流加密算法和分组加密算法两种)

 

非对称密码的应用:数字签名

数字签名是解决商务难题而诞生的,电子商务需要保证交易两方的确定性,而数字签名就能很好的解决。对文件进行加密只解决了传送信息的保密问题,而防止他人对传输的文件进行破坏,以及如何确定发信人的身份还需要采取其它的手段,这一手段就是数字签名。

在电子商务安全保密系统中,数字签名技术有着特别重要的地位,在电子商务安全服务中的源鉴别、完整性服务、不可否认服务中,都要用到数字签名技术。在电子商务中,完善的数字签名应具备签字方不能抵赖、他人不能伪造、在公证人面前能够验证真伪的能力。实现数字签名有很多方法,目前数字签名采用较多的是公钥加密技术。目前的数字签名是建立在公共密钥体制基础上,它是公用密钥加密技术的另一类应用。

混合加密

对称密码体制与非对称密码体制各有优缺点,因此,通常把这两种技术结合起来以实现最佳性能。即用非对称密码技术在通信双方之间传送私钥,而用私钥来对实际传输的数据加密。

RSA算法

背景:

1976年,Diffie和Hellman在文章“密码学新方向”中首次提出了公开密钥密码体制的思想

1977年,Rivest、Shamir和Adleman三个人实现了公开密钥密码体制,现在称为RSA公开密钥体制,它是第一个既能用于数据加密也能用于数字签名的算法。这种算法易于理解和操作,算法的名字以发明者的名字命名:Ron Rivest, Adi Shamir和Leonard Adleman。

RSA的安全性一直未能得到理论上的证明。它经历了各种攻击,至今未被完全攻破

应用前景:

RSA主要用于PKI身份认证系统,详细说有数字证书、数字签名、数字签章、数字水印、数字信封等。目前最贴近生活的一些案例如:银行的u盾、银行卡的刷卡机、淘宝和12306的数字证书。

另外现在随着电子商务电子政务的铺开,登陆认证权限管理越来越贴近生活,RSA的空间越来越大。

安全性分析:

RSA的安全性基于分解大整数的困难性假定,但是否等同于大整数分解一直未能得到理论上的证明,因为没有证明破解 RSA就一定需要作大数分解。假设存在一种无须分解大数的算法,那它肯定可以修改成为大数分解算法。目前, RSA 的一些变种算法已被证明等价于大数分解。不管怎样,分解n是最显然的攻击方法。现在,人们已能分解多个十进制位的大素数。因此,模数n 必须选大一些,因具体适用情况而定。

RSA的缺点:

1)产生密钥很麻烦,受到素数产生技术的限制,因而难以做到一次一密。

2)安全性,RSA的安全性依赖于大数的因子分解,但并没有从理论上证明破译RSA的难度与大数分解难度等价,而且密码学界多数人士倾向于因子分解不是NP问题。

3)速度太慢,由于RSA 的分组长度太大,为保证安全性,n 至少也要 600 bitx以上,使运算代价很高,尤其是速度较慢,较对称密码算法慢几个数量级;且随着大数分解技术的发展,这个长度还在增加,不利于数据格式的标准化。

RSA算法的代码

#include<iostream>

#include<cmath>

using namespace std;

void main()

{

 int p,q;

 cout<<"请输入两个较大的素数:"<<endl;

 cin>>p>>q;

 cout<<"p="<<p<<",q="<<q<<endl;

 int n,o;

 n=p*q;

 o=(p-1)*(q-1);

 cout<<"n="<<n<<",o="<<o<<endl;

 cout<<"请从【0,"<<o-1<<"】中选择一个与"<<o<<"互素的数e:"<<endl;

 int e,i;

 float d;

 cin>>e;

 for(i=1;;i++)

 {

  d=(float)(o*i+1)/e;

  if(d-(int)d==0)

   break;

 }

 cout<<"e="<<e<<",d="<<d<<endl;

 cout<<"公开密钥Pk={e,n}={"<<e<<","<<n<<"}"<<endl;

 cout<<"秘密密钥Sk={d,n}={"<<d<<","<<n<<"}"<<endl;

 cout<<endl;

 cout<<"请输入要加密的正整数(以-1结束):"<<endl;

 int m1[500],m3[500],m4[500];

 double m2[500];

 int j;

 for(j=0;j<500;j++)

 {

  cin>>m1[j];

     if(m1[j]==-1)

      break;

     m2[j]=pow(m1[j],e);

     m4[j]=m2[j]/n;

     m3[j]=m2[j]-m4[j]*n;

 }

 cout<<"密文为:"<<endl;

 int k;

 for(k=0;k<j;k++)

  cout<<m3[k]<<" ";

 cout<<endl;

}

ElGamal算法

安全性分析

攻击ElGamal加密算法等价于解离散对数问题,有限域上离散对数问题 已知(Zp,+,*)是一个有限域,g为Zp*的生成元,y∈ Zp ,求x使得y=gx mod p。如果求离散对数问题是容易的,则获得公钥攻击者能够解出x,则算法完全破译。

特点:

Elgamal密码体制的特点是:密文由明文和所选随机数k来确定,因而是非确定性加密,一般称为随机化加密。对同一明文,由于不同时刻的随机数k不同而得出不同的密文。

由于Elgamal算法是建立在计算Zp上离散对数的困难性之上的,而有些p在Zp中离散对数容易求解,应避免使用这类素数。

ElGamal算法代码

#include <stdio.h>

/********************************

变量定义

p:大素数

d:随机选择的密钥

y:公钥

m: 明文

*********************************/

int p , d , y , m ;

/****************************************

int Mod(int x, int y , int m) ;

此函数运用模重复平方计算法快速计算幂取模

需要将y转成2进制 , 在此通过模2,除2,来求

y各个bit位上的值

****************************************/

int Mod(int x,int y,int m){//模平方的运算

    int a,b;

    a=1;

    b=x;

    while( y ){

        if( y % 2 == 1 )

            a = a * b % m ;

        y /= 2 ;

        b = b * b % m ;

    }

    return a;

}

/**********************************************

int Inverse(int a , int b , int &x , int &y) ;

这个函数是求逆元的,用的是扩展的欧几里得算法       

通过此算法得到的是    a_1*a+b_1*b=1 ; a_1就是

a mod b  的逆元

***********************************************/

int a_1 , b_1 ;

int Inverse(int a,int b,int &a_1,int &b_1)  

{

    int t,d;

    if (b==0) { a_1=1; b_1=0; return a; }

    d=Inverse(b,a%b,a_1,b_1);

    t=a_1;

    a_1=b_1;

    b_1=t-a/b*b_1;

    return d;

}

void  Encry(int p,int a,int d,int m,int k)

{

    int  u , c1 , c2;

    y = Mod( a , d , p ) ;

    u = Mod( y , k , p ) ;

    c1 = Mod( a , k , p ) ;

    c2 = u * m % p ;

    printf("c1=%d c2=%d \n",c1,c2) ;

}

void  Decry(int c1,int c2,int d,int p)

{

    int v , v_1 , m ;

    v = Mod ( c1 , d , p ) ;

    Inverse( v , p ,a_1 , b_1 ) ;

    a_1 = ( a_1 + p ) % p ;

    v_1 = a_1 ;

    m = c2 * v_1 % p ;

    printf("m=%d \n", m ) ;

}

int main()

{

    int flag ;   

    while( 1 ){

        printf("操作: 1.加密  2.解密 \n");       

        scanf("%d",&flag);

        if(1==flag){

            int a , k;

            printf("输入:素数p,生成元a,私钥d,明文m,随机数k; ");

            scanf("%d%d%d%d%d",&p,&a,&d,&m,&k);

            Encry( p , a , d , m , k ) ;

        }

        else{

            int p , d , c1 , c2;

            printf("输入c1,c2,私钥d,素数p; ");

            scanf("%d%d%d%d",&c1,&c2,&d,&p);

            Decry( c1 , c2 , d , p ) ;

        }

    }

    return 0;

}

/*

p = 2579

a = 2

d = 765

m = 1299

k = 853

*/

RSA算法与EIGamal算法比较:

实验分配工作

:ppt演讲与制作,ElGamal算法程序编写

:论文、RSA算法程序编写

实验总结:

通过这次的实验,了解了非对称密码算法RSA和ElGamal,会运用一些现成的算法进行编程,对一些比较复杂的算法开始基本认识并深刻的掌握。在以后所涉及这方面的知识将会有全新的了解和掌握。

 

第二篇:密码学课程设计大纲

《密码学》课程设计教学大纲

课程编号:089233  设计周数:3 周    学分数:3  应开学期:5

       

一、课程设计的目的

通过本课程实验,使学生能运用应用密码学的基本概念、基本原理、协议和技术,阐释一般安全网络环境中密码产品如何利用密码学理论工作的原理,分析密码技术的实现过程和方法。

二、适用专业

信息安全专业、以及与信息安全相关的数学系信息专业、通信专业和计算机专业等。

三、课程设计的基本要求

要求实验者有较强的理论基础和动手编程能力。对于每一个实验都给出了实验目的﹑实验内容﹑预习要求(实验导读)﹑实验提示﹑实验作业。主张学生在做实验前,必须要充分预习,充分准备,要依靠自己在做实验之前要编出程序,经过实验调试改正程序,得出正确的结果。

四、课程设计的内容

密码实验共安排三个代表性的实验。在此基础之上,如果学生有余力可以研究具体的密码分析算法,如差分攻击,代数攻击等。进一步加深对密码算法的理解。

五、时间分配

六、成绩评定

实验单独考核,按预习、操作、纪律、实验报告综合评定成绩,按优、良、中、及格、不及格评定,教学结束后, 实验成绩不超过总成绩的30%。

七、说明

密码实验共安排三个代表性的实验。不论哪类实验,都不希望具体的实验步骤整齐划一和实验报告内容千篇一律。实验者应当尽可能发挥自己的潜能,写出有各自特色的实验报告。比如,要求有对程序的分析,要在描述一些基本功能的基础上,自行给出能够其余可行的思路。除此之外,还应自己探索更深入和优化的方法,探讨相关参数对性能的影响,据此加以总结列举在实验报告上。同时应该侧重写出自己在算法分析、设计思路、实现功能或程序代码等方面的特色,写出设计和实现过程中遭遇到的难点和解决办法,可以不拘泥于实验指导给出的参考性设计思路,尽可能在深度和广度上加以拓展。只有这种各具特色的实验报告,才将更有利于体现实验者在创新思维和动手能力上的差异。

制定者:李昕 

审定者:林果园 

批准者:周勇 

相关推荐