密码学课程设计报告

时间:2024.4.13

 

   

    密码学课程设计

班级:                         

成员姓名:                         

                    

                    

指导教师:                       

2011.7


目录

密码学课程设计............................................................................................................ 1

1.实验一 实现一个多表古典加密和解密程序.................................................... 1

1.1实验目的............................................................................................. 1

1.2实验要求............................................................................................. 1

1.3实验内容............................................................................................. 1

1.4古典加密方法..................................................................................... 1

1.5 程序代码............................................................................................ 1

1.6 结果分析............................................................................................ 3

1.7 实验总结............................................................................................ 3

2.实验二 DES算法的实现................................................................................... 4

2.1实验目的............................................................................................. 4

2.3实验内容............................................................................................. 4

2.4 DES对称加密算法............................................................................ 4

2.5 程序代码............................................................................................ 6

2.6结果分析............................................................................................. 8

2.7实验总结............................................................................................. 8

3.实验三 实现一个大素数生成算法.................................................................... 9

3.1实验目的............................................................................................. 9

3.2实验要求............................................................................................. 9

3.3实验内容............................................................................................. 9

3.4 Miller-Rabin素性测试法................................................................... 9

3.5 程序代码.......................................................................................... 10

3.6 结果分析.......................................................................................... 10

3.7 实验总结.......................................................................................... 11

4. 结束语.............................................................................................................. 11


1.实验一实现一个多表古典加密和解密程序

1.1实验目的

    掌握多表古典加密方法。

1.2实验要求

    能用高级语言实现古典加密方法。

1.3实验内容

    多表古典加密方法主要有Playfair体制、Vigenere体制、Beaufor体制、Vernam体制和Hill体制,用高级语言实现其中一种体制的加密和解密算法。

1.4古典加密方法

   

古典加密方法分为单表加密和多表加密。古典密码编码方法有置换,代替,加法 。把明文中的字母重新排列,字母本身不变,但其位置改变了,这样编成的密码称为置换密码。  

最简单的置换密码是把明文中的字母顺序倒过来,然后截成固定长度的字母组作为密文。 乘积和迭代是多种加密方法混合使用,对一个加密函数多次迭代。      

单表代替密码的安全性不高,一个原因是一个明文字母只由一个密文字母代替。构造多个密文字母表,在密钥的控制下用相应密文字母表中的一个字母来代替明文字母表中的一个字母。一个明文字母有多种代替。  所以本次试验我选择做的就是 Vernam密码。

1.5 程序代码

#include <iostream>

#include <string>

#include <vector>

using namespace std;

int main()

{

 string plain,ciper,key;

 int len;                    //长度三者一致

 void change(string &, vector<int>&);//字符变数字

 vector<int> encrypt_compute(vector<int> m,vector<int> k);//加密计算

 vector<int> discrypt_compute(vector<int> c,vector<int> k);//解密计算

 void re_change( vector<int>&,string &);//数字变字符

 cout<<"欢迎使用Vernam加解密:"<<endl;

 cout<<"====================="<<endl;

 int flag;    //操作标记

 do

 {

  cout<<"请选择操作:1、加密 2、解密 3、结束:"<<endl;

  cin>>flag;

  if(flag==1)

  {

   cout<<"请输入明文:";

   cin>>plain;

   cout<<"请输入相同长度的密钥:";

   cin>>key;

   len = plain.size();

   vector<int> p,c,k;   //存变换的数字

   change(plain, p); 

   change(key, k);      //字母->数字

   c = encrypt_compute(p,k);

   re_change(c,ciper);  //数字->字母

   cout<<"密文是:"<<ciper<<endl;

  }

  if(flag==2)

  {

   cout<<"请输入密文:";

   cin>>ciper;

   cout<<"请输入相同长度的密钥:";

   cin>>key;

   len = ciper.size();

   vector<int> p,c,k;   //存变换的数字

   change(ciper, c); 

   change(key, k);      //字母->数字

   p = discrypt_compute(c,k);

   plain="";//清空明文原来的值

   re_change(p,plain);

   cout<<"明文是:"<<plain<<endl;

  }

 }while(flag!=3);

 return 0;

}

void change(string &plain, vector<int>&number)   //字母变数字

{

 for (unsigned int i=0;i<plain.size();i++)

 {

  number.push_back(plain[i]-97);   //a为0

 }

}

vector<int> encrypt_compute(vector<int> m,vector<int> k)  //加密计算

{

 vector<int> sum;

 for(unsigned int i=0; i<m.size(); i++)

 {

  sum.push_back((m[i]+k[i])%26);

 }

 return sum;

}

vector<int> discrypt_compute(vector<int> c,vector<int> k) //解密计算

{

 vector<int> resum;

 int temp;

 for(unsigned int i=0; i<c.size(); i++)

 {

  temp = c[i]-k[i];

  if(temp<0) temp+=26;

  resum.push_back(temp);

 }

 return resum;

}

void re_change( vector<int>& sum,string &c)   //数字变字符

{

 string temp;//用于处理insert函数变量传递

 for (unsigned int i=0;i<sum.size();i++)

 {

  temp=sum[i]+97;

  c.insert(i,temp);//a为0

 }

}

1.6 结果分析

首先在程序执行时的提示下,输入密钥,接下来输入要加密明文,程序执行,可以产生加密后的密文,并自动解密出原来的明文。顺利执行加密和解密过程。

1.7 实验总结

古典多表密码有多种体质,这次试验我选择的是Vernam体制。经过对加密算法的实现,我对古典加密算法的模式,过程和原理有了更深入的了解。

多表古典密码通过构造多个对应明文的密文字母表,在密钥的控制下使用相应的密文字母表中的某个字母来代替明文字母表中的一个字母。达到隐藏明文的目的。解密的时候对这个过程进行逆操作,得到明文。一个明文字母有多种代替。而Vernam密码就是著名的多表代替密码。

2.实验二 DES算法的实现

2.1实验目的

    握分组加密算法的设计与实现方法。

2.2实验要求

    用高级语言实现实现DES加密和解密算法。

2.3实验内容

    DES是由初始变换、乘积变换和逆初始变换构成,乘积变换是DES算法的核心。首先用代码实现这几个变换,然后组合成DES加密算法。由于DES解密算法与加密算法相同只是子密钥使用次序不同,因此可简单地由加密算法实现解密算法。

2.4 DES对称加密算法

    对称加密算法有时又叫做传统密码算法,加密密钥可以从解密密钥中推导出来,解密密钥也可以从加密密钥中推导出来。在大多数的对称算法中,加密密钥和解密密钥是相同的,因此也成为秘密密钥算法或者单密钥算法。它要求发送发和接收方在安全通信之前先商定一个密钥。对称算法的安全性依赖于密钥,所以密钥的保密性对通信至关重要。对称加密算法主要有分组加密和流加密两类。分组加密是指将明文分成固定商都的组,用同一密钥分别对每一组加密,输出固定长度的密文,典型代表:DES、3DES、IDEA。

DES的加密流程:

 

DES的加密过程可分为加密处理,加密变换和子密钥生成几个部分组成。

1.加密处理过程

(1)初始变换。加密处理首先要对64位的明文按表1所示的初始换位表IP进行变换。表中的数值表示输入位被置换后的新位置。例如输入的第58位,在输出的时候被置换到第1位;输入的是第7位,在输出时被置换到第64位。

(2)加密处理。上述换位处理的输出,中间要经过16轮加密变换。初始换位的64位的输出作为下一次的输入,将64位分为左、右两个32位,分别记为L0和R0,从L0、R0到L16、R16,共进行16轮加密变换。其中,经过n轮处理后的点左右32位分别为Ln和Rn,则可做如下定义:

Ln=Rn-1

Rn=Ln-1

其中,kn是向第n轮输入的48位的子密钥,Ln-1和Rn-1分别是第n-1轮的输出,f是Mangler函数。

(3)最后换位。进行16轮的加密变换之后,将L16和R16合成64位的数据,再按照表2所示的最后换位表进行IP-1的换位,得到64位的密文,这就是DES算法加密的结果。

2.加密变换过程

通过重复某些位将32位的右半部分按照扩展表3扩展换位表扩展为48位,而56位的密钥先移位然后通过选择其中的某些位减少至48位,48位的右半部分通过异或操作和48位的密钥结合,并分成6位的8个分组,通过8个S-盒将这48位替代成新的32位数据,再将其置换一次。这些S-盒输入6位,输出4位。

3.子密钥生成过程

钥通常表示为64位的自然数,首先通过压缩换位PC-1去掉每个字节的第8位,用作奇偶校验,因此,密钥去掉第8、16、24……64位减至56位,所以实际密钥长度为56位,而每轮要生成48位的子密钥。

4.解密处理过程

从密文到明文的解密过程可采用与加密完全相同的算法。不过解密要用加密的逆变换,就是把上面的最后换位表和初始换位表完全倒过来变换。这里不再赘述。

2.5 程序代码

由于代码过长,此处只列出部分关键代码。

#include <iostream>

#include <fstream>

using namespace std;

const static char ip[] = {                   //IP置换

          58, 50, 42, 34, 26, 18, 10,  2,

          60, 52, 44, 36, 28, 20, 12,  4,

          62, 54, 46, 38, 30, 22, 14,  6,

          64, 56, 48, 40, 32, 24, 16,  8,

          57, 49, 41, 33, 25, 17,  9,  1,

          59, 51, 43, 35, 27, 19, 11,  3,

          61, 53, 45, 37, 29, 21, 13,  5,

          63, 55, 47, 39, 31, 23, 15,  7

};                                         

const static char fp[] = {                            //zuizhongzhihuan

          40,  8, 48, 16, 56, 24, 64, 32,

          39,  7, 47, 15, 55, 23, 63, 31,

          38,  6, 46, 14, 54, 22, 62, 30,

          37,  5, 45, 13, 53, 21, 61, 29,

          36,  4, 44, 12, 52, 20, 60, 28,

          35,  3, 43, 11, 51, 19, 59, 27,

          34,  2, 42, 10, 50, 18, 58, 26,

          33,  1, 41,  9, 49, 17, 57, 25

};

const static char sbox[8][64] = {                        //s_box

          /* S1 */

          14,  4, 13,  1,  2, 15, 11,  8,  3, 10,  6, 12,  5,  9,  0,  7,

              0, 15,  7,  4, 14,  2, 13,  1, 10,  6, 12, 11,  9,  5,  3,  8,

              4,  1, 14,  8, 13,  6,  2, 11, 15, 12,  9,  7,  3, 10,  5,  0,

          15, 12,  8,  2,  4,  9,  1,  7,  5, 11,  3, 14, 10,  0,  6, 13,

          /* S2 */

          15,  1,  8, 14,  6, 11,  3,  4,  9,  7,  2, 13, 12,  0,  5, 10,

              3, 13,  4,  7, 15,  2,  8, 14, 12,  0,  1, 10,  6,  9, 11,  5,

              0, 14,  7, 11, 10,  4, 13,  1,  5,  8, 12,  6,  9,  3,  2, 15,

          13,  8, 10,  1,  3, 15,  4,  2, 11,  6,  7, 12,  0,  5, 14,  9,

          /* S3 */

          10,  0,  9, 14,  6,  3, 15,  5,  1, 13, 12,  7, 11,  4,  2,  8,

          13,  7,  0,  9,  3,  4,  6, 10,  2,  8,  5, 14, 12, 11, 15,  1,

          13,  6,  4,  9,  8, 15,  3,  0, 11,  1,  2, 12,  5, 10, 14,  7,

              1, 10, 13,  0,  6,  9,  8,  7,  4, 15, 14,  3, 11,  5,  2, 12,

          /* S4 */

              7, 13, 14,  3,  0,  6,  9, 10,  1,  2,  8,  5, 11, 12,  4, 15,

          13,  8, 11,  5,  6, 15,  0,  3,  4,  7,  2, 12,  1, 10, 14,  9,

          10,  6,  9,  0, 12, 11,  7, 13, 15,  1,  3, 14,  5,  2,  8,  4,

              3, 15,  0,  6, 10,  1, 13,  8,  9,  4,  5, 11, 12,  7,  2, 14,

          /* S5 */

              2, 12,  4,  1,  7, 10, 11,  6,  8,  5,  3, 15, 13,  0, 14,  9,

          14, 11,  2, 12,  4,  7, 13,  1,  5,  0, 15, 10,  3,  9,  8,  6,

              4,  2,  1, 11, 10, 13,  7,  8, 15,  9, 12,  5,  6,  3,  0, 14,

          11,  8, 12,  7,  1, 14,  2, 13,  6, 15,  0,  9, 10,  4,  5,  3,

          /* S6 */

          12,  1, 10, 15,  9,  2,  6,  8,  0, 13,  3,  4, 14,  7,  5, 11,

          10, 15,  4,  2,  7, 12,  9,  5,  6,  1, 13, 14,  0, 11,  3,  8,

              9, 14, 15,  5,  2,  8, 12,  3,  7,  0,  4, 10,  1, 13, 11,  6,

              4,  3,  2, 12,  9,  5, 15, 10, 11, 14,  1,  7,  6,  0,  8, 13,

          /* S7 */

              4, 11,  2, 14, 15,  0,  8, 13,  3, 12,  9,  7,  5, 10,  6,  1,

          13,  0, 11,  7,  4,  9,  1, 10, 14,  3,  5, 12,  2, 15,  8,  6,

              1,  4, 11, 13, 12,  3,  7, 14, 10, 15,  6,  8,  0,  5,  9,  2,

              6, 11, 13,  8,  1,  4, 10,  7,  9,  5,  0, 15, 14,  2,  3, 12,

          /* S8 */

          13,  2,  8,  4,  6, 15, 11,  1, 10,  9,  3, 14,  5,  0, 12,  7,

              1, 15, 13,  8, 10,  3,  7,  4, 12,  5,  6, 11,  0, 14,  9,  2,

              7, 11,  4,  1,  9, 12, 14,  2,  0,  6, 10, 13, 15,  3,  5,  8,

              2,  1, 14,  7,  4, 10,  8, 13, 15, 12,  9,  0,  3,  5,  6, 11

};

const static char rar[] = {                           //ya suo zhi huan

          14, 17, 11, 24,  1,  5,

              3, 28, 15,  6, 21, 10,

          23, 19, 12,  4, 26,  8,

          16,  7, 27, 20, 13,  2,

          41, 52, 31, 37, 47, 55,

          30, 40, 51, 45, 33, 48,

          44, 49, 39, 56, 34, 53,

          46, 42, 50, 36, 29, 32

};

const static char ei[] = {                      //kuo zhan zhi huan

          32,  1,  2,  3,  4,  5,

              4,  5,  6,  7,  8,  9,

              8,  9, 10, 11, 12, 13,

          12, 13, 14, 15, 16, 17,

          16, 17, 18, 19, 20, 21,

          20, 21, 22, 23, 24, 25,

          24, 25, 26, 27, 28, 29,

          28, 29, 30, 31, 32,  1

};

const static char Pzh[]={                                   //P置换

          16,  7, 20, 21,

          29, 12, 28, 17,

              1, 15, 23, 26,

              5, 18, 31, 10,

              2,  8, 24, 14,

          32, 27,  3,  9,

          19, 13, 30,  6,

          22, 11,  4, 25

};

const static char Keyrar[]={

          57, 49, 41, 33, 25, 17,  9,

              1, 58, 50, 42, 34, 26, 18,

          10,  2, 59, 51, 43, 35, 27,

          19, 11,  3, 60, 52, 44, 36,

          63, 55, 47, 39, 31, 23, 15,

              7, 62, 54, 46, 38, 30, 22,

          14,  6, 61, 53, 45, 37, 29,

          21, 13,  5, 28, 20, 12,  4

};

bool key[16][48]={0},/*rekey[16][48],*/

char key_in[8];

void ByteToBit(bool *Out,char *In,int bits)        //字节到位的转换

{

       int i;

       for(i=0;i<bits;i++)

              Out[i]=(In[i/8]>>(i%8))&1;

}

void BitToByte(char *Out,bool *In,int bits)               //位到字节转换

{

       for(int i=0;i<bits/8;i++)

              Out[i]=0;

       for(i=0;i<bits;i++)

              Out[i/8]|=In[i]<<(i%8);               //"|="组合了位操作符和赋值操作符的功能

}

void Xor(bool *InA,const bool *InB,int len)    //按位异或

{

       for(int i=0;i<len;i++)

              InA[i]^=InB[i];

}

void keyfc(char *In)              //获取密钥函数

{

       int i,j=0,mov,k;

       bool key0[56],temp,keyin[64];

       ByteToBit(keyin,In,64);           //字节到位的转换

       for(i=0;i<56;i++)                      //密钥压缩为56位

              key0[i]=keyin[Keyrar[i]-1];

       for(i=0;i<16;i++)       //16轮密钥产生

       {

              if(i==0||i==1||i==8||i==15)

                     mov=1;

              else

                     mov=2;

              for(k=0;k<mov;k++)    //分左右两块循环左移

              {

                     for(int m=0;m<8;m++)

                     {

                            temp=key0[m*7];

                            for(j=m*7;j<m*7+7;j++)

                                   key0[j]=key0[j+1];

                            key0[m*7+6]=temp;

                     }

                     temp=key0[0];

                     for(m=0;m<27;m++)

                            key0[m]=key0[m+1];

                     key0[27]=temp;

                     temp=key0[28];

                     for(m=28;m<55;m++)

                            key0[m]=key0[m+1];

                     key0[55]=temp;

              }

              for(j=0;j<48;j++)         //压缩置换并储存

                    key[i][j]=key0[rar[j]-1];

       }

}

void DES(char Out[8],char In[8],bool MS)//加密核心程序,ms=0时加密,反之解密

{

       bool MW[64],tmp[32],PMW[64]; //注意指针

       bool kzmw[48],keytem[48],ss[32];

       int hang,lie;

       ByteToBit(PMW,In,64);

       for(int j=0;j<64;j++)

       {

              MW[j]=PMW[ip[j]-1];          //初始置换

       }

       bool *Li=&MW[0],*Ri=&MW[32];

       for(int i=0;i<48;i++)                                               //右明文扩展置换

              kzmw[i]=Ri[ei[i]-1];                                               //注意指针    

       if(MS==0)                                                                     //DES加密过程

       {

              for(int lun=0;lun<16;lun++)

              {

                     for(i=0;i<32;i++)

                            ss[i]=Ri[i];

                     for(i=0;i<48;i++)                                             //右明文扩展置换

                            kzmw[i]=Ri[ei[i]-1];                                               //注意指针

                     for(i=0;i<48;i++)

                            keytem[i]=key[lun][i];                                      //轮密钥

                     Xor(kzmw,keytem,48);

                     /*S盒置换*/

                     for(i=0;i<8;i++)

                     {

                            hang=kzmw[i*6]*2+kzmw[i*6+5];

                            lie =kzmw[i*6+1]*8+kzmw[i*6+2]*4+kzmw[i*6+3]*2+kzmw[i*6+4];

                            tmp[i*4+3]=sbox[i][(hang+1)*16+lie]%2;

                            tmp[i*4+2]=(sbox[i][(hang+1)*16+lie]/2)%2;

                            tmp[i*4+1]=(sbox[i][(hang+1)*16+lie]/4)%2;

                            tmp[i*4]=(sbox[i][(hang+1)*16+lie]/8)%2;

                     }

                     for(int i=0;i<32;i++)            //P置换        

                            Ri[i]=tmp[Pzh[i]-1];

                     Xor(Ri,Li,32);                     //异或

                     for(i=0;i<32;i++)          //交换左右明文

                     {

                            Li[i]=ss[i];

                     }

              }

              for(i=0;i<32;i++)

              {

                     tmp[i]=Li[i];

                     Li[i]=Ri[i];

                     Ri[i]=tmp[i];

              }

              for(i=0;i<64;i++)

                     PMW[i]=MW[fp[i]-1];

              BitToByte(Out,PMW,64);             //位到字节的转换 

       }

       else                                                                 //DES解密过程

       {

                    

              for(int lun=15;lun>=0;lun--)

              {

              for(i=0;i<32;i++)

                     ss[i]=Ri[i];

              for(int i=0;i<48;i++)                                               //右明文扩展置换

                     kzmw[i]=Ri[ei[i]-1];                                               //注意指针

              for(i=0;i<48;i++)

                     keytem[i]=key[lun][i];                                      //轮密钥

              Xor(kzmw,keytem,48);

              /*S盒置换*/

              for(i=0;i<8;i++)

              {

                     hang=kzmw[i*6]*2+kzmw[i*6+5];

                     lie =kzmw[i*6+1]*8+kzmw[i*6+2]*4+kzmw[i*6+3]*2+kzmw[i*6+4];

                     tmp[i*4+3]=sbox[i][(hang+1)*16+lie]%2;

                     tmp[i*4+2]=(sbox[i][(hang+1)*16+lie]/2)%2;

                     tmp[i*4+1]=(sbox[i][(hang+1)*16+lie]/4)%2;

                     tmp[i*4]=(sbox[i][(hang+1)*16+lie]/8)%2;

              }

              for(i=0;i<32;i++)          //P置换        

                     Ri[i]=tmp[Pzh[i]-1];

              Xor(Ri,Li,32);                     //异或

              for(i=0;i<32;i++)          //交换左右明文

              {

                            Li[i]=ss[i];

              }

                    

              }

              for(i=0;i<32;i++)

              {

                     tmp[i]=Li[i];

                     Li[i]=Ri[i];

                     Ri[i]=tmp[i];

              }

              for(i=0;i<64;i++)

                     PMW[i]=MW[fp[i]-1];

              BitToByte(Out,PMW,64);             //位到字节的转换

       }

}

void main()

{

       char Ki[8],jm[8],final[8];

       int i0;

       cout<<"请输入密钥(8字节):"<<endl;

       for(i0=0;i0<8;i0++)

       cin>>Ki[i0];

//     if(i0<8)

//            for(i0=0;i0<8;i0++)

//            cin//[i0];

       keyfc(Ki);

       cout<<"请输入明文:"<<endl;

       for(i0=0;i0<8;i0++)

       cin>>jm[i0];

       DES(final,jm,0);

       cout<<"加密后:"<<endl;//加密

       for(i0=0;i0<8;i0++)

       cout<<final[i0];

       cout<<endl;

       cout<<"解密后:"<<endl;

       DES(jm,final,1);                  //解密

              for(i0=0;i0<8;i0++)

       cout<<jm[i0];

              cout<<endl;

}

  2.6结果分析

代码通过des分组密码,对明文顺利进行了加密和解密。

2.7实验总结

  通过实验,我对des加密过程有了比较全面的认识,在编程中,首先弄清楚加密的流程,然后知道每个函数的功能,就能够实现了。可见坚固的理论基础是实践的前提。

      DES数据加密标准是对称密码体制的杰出代表。DES算法综合多次组合迭代算法和换位算法,利用分散和错乱的相互作用,把明文编制成密码强度很高的密文。DES算法的加密和解密的流程是完全相同的, 区别仅仅是加密与解密使用子密钥序列的顺序正好相反。

3.实验三 实现一个大素数生成算法

3.1实验目的

    进一步掌握大素数分解的一般原理和实现方法。

3.2实验要求

    能用间接方法实现大素数分解。

3.3实验内容

    用代码实现Solovay-Strassen素性测试法或Miller-Rabin素性测试法。

3.4 Miller-Rabin素性测试法

    米勒和拉宾的素性测试方法是在费马定理的基础上进行研究的。新的测试基于下面的定理:如 果p是素数,x是小于p的正整数,且x^2 mod p = 1,那么要么x=1,要么x=p-1。这是显然的,因为x^2 mod p = 1相当于p能整除x^2-1,也即p能整除(x+1)(x-1)。由于p是素数,那么只可能是x-1能被p整除(此时x=1)或x+1能被p整除(此时x =p-1)。

    其基本方法是不断地提取指数n-1中的因子2,把n-1表示成d*2^r(其中d是一个奇数)。那么我们需要计算的东西就 变成了a的d*2^r次方除以n的余数。于是,a^(d * 2^(r-1))要么等于1,要么等于n-1。如果a^(d * 2^(r-1))等于1,定理继续适用于a^(d * 2^(r-2)),这样不断开方开下去,直到对于某个i满足a^(d * 2^i) mod n = n-1或者最后指数中的2用完了得到的a^d mod n=1或n-1。

Miller-Rabin算法是一个RP算法。RP是时间复杂度的一种,主要 针对判定性问题。一个算法是RP算法表明它可以在多项式的时间里完成,对于答案为否定的情形能够准确做出判断,但同时它也有可能把对的判成错的(错误概率 不能超过1/2)。RP算法是基于随机化的,因此多次运行该算法可以降低错误率。

3.5 程序代码

关键部分:

function pow( a, d, n:longint ):longint;
begin
    if d=0 then exit(1)
    else if d=1 then exit(a)
    else if d and 1=0 then exit( pow( a*a mod n, d div 2, n) mod n)
    else exit( (pow( a*a mod n, d div 2, n) * a) mod n);
end;

function IsPrime( a,n:longint ):boolean;
var
    d,t:longint;
begin
    if n=2 then exit(true);
    if (n=1) or (n and 1=0) then exit(false);
    d:=n-1;
    while d and 1=0 do d:=d shr 1;
    t:=pow( a, d, n );
    while ( d<>n-1 ) and ( t<>1 ) and ( t<>n-1 ) do
    begin
       t:=(t * t)mod n;
       d:=d shl 1;
    end;
    exit( (t=n-1) or (d and 1=1) );
end;

3.6 结果分析

程序顺利运行,进行大素数的生成。

3.7 实验总结

     RSA公钥密码体制在加密和解密变换中存在大量的数值运算,其加密和解密运算时间比较长,开销更大,在某种程度上限制了其应用范围。由于产生密钥很麻烦,受到素数产生技术的限制,因而很难做到一次一密。RSA公钥加密技术已成为确保信息安全性的关键技术,目前为止还是一种被人们认可的安全技术。它的安全性基于数论中大整数分解的困难性。实际上,人们推测RSA的安全性依赖于大整数的因式分解问题,但谁也没有在数学上证明从c和e计算m需要对n进行因式分解。可以想象可能会有完全不同的方式去分析RSA。然而,如果这种方法能让密码解析员推导出d,则它也可以用作大整数因式分解的新方法。最难以令人置信的是,有些RSA变体已经被证明与因式分解同样困难。甚至从RSA加密的密文中恢复出某些特定的位也与解密整个消息同样困难。另外,对RSA的具体实现存在一些针对协议而不是针对基本算法的攻击方法。虽然大整数的因子分解很困难,随着科学技术的发展,因子分解的能力在不断提高,而且分解所需要的成本不断下降。

   

4.结束语

经过将近半个学期的密码学课程设计的学习,我们从中学到了很多关于古典密码加密算法,des加密算法,rsa公钥密码体制的加密算法。这次的课程设计由张亚楠,何孝玉和蔺光达三人共同完成。

蔺光达负责古典密码的程序编写及结果分析,何孝玉负责des加密算法的程序编写及结果分析,张亚楠负责rsa公钥密码算法的程序编写及结果分析等相关工作。

多表古典密码通过构造多个对应明文的密文字母表,在密钥的控制下使用相应的密文字母表中的某个字母来代替明文字母表中的一个字母。达到隐藏明文的目的。解密的时候对这个过程进行逆操作,得到明文。一个明文字母有多种代替。而Vernam密码就是著名的多表代替密码。对des加密过程有了比较全面的认识,在编程中,首先弄清楚加密的流程,然后知道每个函数的功能,就能够实现了。可见坚固的理论基础是实践的前提。DES数据加密标准是对称密码体制的杰出代表。DES算法综合多次组合迭代算法和换位算法,利用分散和错乱的相互作用,把明文编制成密码强度很高的密文。DES算法的加密和解密的流程是完全相同的, 区别仅仅是加密与解密使用子密钥序列的顺序正好相反。RSA公钥加密技术已成为确保信息安全性的关键技术,目前为止还是一种被人们认可的安全技术。它的安全性基于数论中大整数分解的困难性。实际上,人们推测RSA的安全性依赖于大整数的因式分解问题,但谁也没有在数学上证明从c和e计算m需要对n进行因式分解。可以想象可能会有完全不同的方式去分析RSA。然而,如果这种方法能让密码解析员推导出d,则它也可以用作大整数因式分解的新方法。最难以令人置信的是,有些RSA变体已经被证明与因式分解同样困难。甚至从RSA加密的密文中恢复出某些特定的位也与解密整个消息同样困难。

更多相关推荐:
密码学课程设计报告

沈阳工程学院课程设计设计题目院系信息学院班级信安本111学生姓名学号指导教师祝世东王素芬职称工程师副教授起止日期20xx年1月6日起至20xx年1月10日止沈阳工程学院课程设计任务书课程设计题目简单的保密通信系...

密码学课程设计报告

密码学课程设计报告班级:信安10-1班姓名:学号:指导老师:一、Hash算法的实现MD5算法1.1算法概述MD5算法是一种消息摘要算法,此算法以任意长度的信息作为输入进行计算,产生一个128-bit(16-by…

密码学-RSA加密解密算法的实现课程设计报告

密码学课程报告《RSA加密解密算法》专业:信息工程(信息安全)班级:1132102学号:****姓名:***时间:20××年1月10号一、课程设计的目的当前最著名、应用最广泛的公钥系统RSA是在1978年,由美…

密码学课程设计报告

XX大学密码学课程设计姓名学号学院指导老师完成日期20xx0106一实验任务及要求任务使用IDEA算法实现加解密过程要求1输入至少包括两个分组2核心功能是加解密过程可适当增加附加功能32人组二实现原理IDEA算...

密码学课程设计报告要求及模板

计算机与信息工程学院《密码学课程设计》报告(20××/20学年第二学期)题目:Diffie-Hellman密钥交换协议系别:计算机与信息工程学院专业:信息安全班级:学号:姓名:20年05月30日(一)题目Dif…

中国矿业大学密码学课程设计报告

密码学课程设计中国矿业大学密码学课程设计报告院系计算机学院专业信息安全班级姓名学号指导老师20xx年6月密码学课程设计摘要近些年来由于许多私密信息的泄漏信息安全成为全社会的需求所以也成为了整个社会的关注热点对于...

密码学课程设计实验报告

院系计算机科学与技术学院专业信息安全班级0703学号xxxxxxxxxx姓名指导教师xxxxxxxx月日1密码学课程设计实验报告目录第一部分一实验目的二实验环境及工具三实验内容四实验原理五实验过程651设计思路...

密码学课程设计报告 5

密码学课程设计班级姓名学号指导教师20xx6中国矿业大学计算机学院密码学课程设计目录密码学课程设计11实验一实现一个多表古典加密和解密程序111实验目的112实验要求113实验内容114古典加密方法115程序代...

应用密码学课程设计报告

沈阳工程学院课程设计报告摘要摘要随着国家信息化步骤的加快和高等教育规模的扩大社会对计算机专业人才的需求不仅体现在数量的增加上而且体现在质量要求的提高上培养具有研究和实践能力的高层次的计算机专业人才已成为许多重点...

运筹学课程设计报告(完)

运筹学课程设计报告组别第三组设计人员设计时间20xx年6月25日20xx年7月6日1设计进度本课程设计时间分为两周第一周20xx年6月25日20xx年6月29日建模阶段此阶段各小组根据给出的题目完成模型的建立主...

运筹学课程设计报告

长春工业大学课程设计报告课程设计名称运筹课程设计专业班级学生姓名指导教师20xx年7月12日课程设计任务书1运筹学课程设计报告组别第十八组设计人员设计时间20xx年6月27日20xx年7月12日1设计进度本课程...

运筹学课程设计报告模板

宁波大红鹰学院信息工程学院课程设计报告课程名称项目名称姓名班级名称专业名称完成时间运筹学与数据分析实践炼油厂生产计划安排信息管理和信息系统20xx0225信息工程学院一问题的提出正文宋体小四单倍行距这是一个线性...

密码学课程设计报告(28篇)