密码学实验报告

无标题.png

文本框: 密码学实验报告 12706095427077378.jpg                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          

实验一 DES加密算法实验

(一) 实验目的

Ø  理解对称加解密算法的原理和特点 

Ø  理解DES算法的加解密原理

(二) 实验背景

DES算法为密码体制中的对称密码体制,又被称为美国数据加密标准,是1972年美国IBM公司研制的对称密码体制加密算法。 明文按64位进行分组,密钥长64位,密钥事实上是56位参与DES运算(第8、16、24、32、40、48、56、64位是校验位, 使得每个密钥都有奇数个1)分组后的明文组和56位的密钥按位替代或交换的方法形成密文组的加密方法。

其入口参数有三个:key、data、mode。key为加密解密使用的密钥,data为加密解密的数据,mode为其工作模式。当模式为加密模式时,明文按照64位进行分组,形成明文组,key用于对数据加密,当模式为解密模式时,key用于对数据解密。实际运用中,密钥只用到了64位中的56位,这样才具有高的安全性。

详细描述

    DES算法把64位的明文输入块变为64位的密文输出块,他所使用的密钥也是64位,DES对64 位的明文分组进行操作。通过一个初始置换,将明文分组分成左半部分和右半部分,各32位长。然后进行16轮相同的运算,这些相同的运算被称为函数f,在运算过程中数据和密钥相结合。经过16轮运算后左、右部分在一起经过一个置换(初始置换的逆置换),这样算法就完成了。    

(1)初始置换  

  其功能是把输入的64位数据块按位重新组合,并把输出分为L0,R0两部分,每部分各长32位,即将输入的第58位换到第1位,第50位换到第2位,?,依次类推,最后一位是原来的第7位,L0,R0则是换位输出后的两部分,L0是输出的左32位,R0是右32位。    

(2)逆置换  

   经过16次迭代运算后,得到L16,R16,将此作为输入进行逆置换,即得到密文输出。逆置换正好是初始置换的逆运算。例如,第1位经过初始置换后,处于第40位,而通过逆置换,又将第40位换回到第1位。   

(3)函数f(Ri,Ki)的计算 

  “扩展置换”是将32位放大成48位,“P盒置换”是32位到32位换位,在(Ri,Ki)算法描述图中,选择函数功能是把6 b数据变为4 b数据。   

(4)子密钥Ki(48 b)的生成算法  

  开始,由于不考虑每个字节的第8位,DES的密钥从64位变为48位,如表6所示,首先56位 密钥被分成两个部分,每部分28位,然后根据轮数,两部分分别循环左移l或2位。  

 DES算法规定,其中第8,16,?,64位是奇偶校验位,不参与DES运算。故Key实际可用 位数只有56位。即:经过密钥置换表的变换后,Key的位数由64位变成了56位,此56位分为C 0,D0两部分,各28位,然后分别进行第一次循环左移,得到C1,D1,将C1(28位),D1(28位)合并得到56位,再经过压缩置换,从而便得到了密钥K0(48位)。依次类推,便可得到K1,K 2,?,K15。需要注意的是,16次循环左移对应的左移位数要依据表7所示的规则进行。  

DES算法的解密过程是一样的,区别仅在于第一次迭代时用子密钥K15,第二次是K14,?,最后一次用K0,算法本身并没有任何变化

(三) 实验内容

Ø  熟悉DES算法的基本原理; 

Ø  依据所算则的算法,编程实现该该算法; 

Ø  执行程序并分析结果;

(四) 实验过程

1.   编写DES实验代码,采用c语言实现,详细代码见附录1

2.   运行实验代码,输入测试数据,进行加密和解密,得出结果,截图保存,并完成实验报告。

QQ截图20160112185012.png     实验截图

      

(五) 实验心得

   虽然DES算法在另一门课《网络安全》中已经有所了解,但是通过本次实验,我加深了对DES算法的加密解密原,熟悉了用DES算法对字符串和对文件进行加密。总的来说,DES算法比较复杂,做加密解密实验时用DES算法来做难度有点大,好在有之前的基础,所以还是比较顺利的完成了本次实验。

实验二 米勒拉宾算法实验

(一)   实验目的

Ø  了解素数的判别算法

Ø  理解米勒拉宾算法的判定原理

(二)   实验背景

素数是一个除了1和它自身以外不能被任何其它数整除的数。现代密码学中的素性测试问题对很多的密码算法发展至关重要,如:RSA公钥加密算法。

素数的一个基本问题是确定一个给定的数是否是素数,即素性测试问题。关于素性测试的算法有很多种。其中国际流行的有以下几种:

1.   基于素数性质的穷举素性测试算法

2.   基于费马小定理的素性测试算法

3.   AKS 素性测试算法

4.   Miller-Rabin素性测试算法算法

5.   Solovag-Strassen素性测试算法

6.   Lehmann素性测试算法。

    本次实验内容为Miller-Rabin素性测试算法算法。

(三)   实验原理

   理论基础:

    如果n是一个奇素数, 将n-1表示成2^s*r的形式(r是奇 数),a 是和n互素的任何整数, 那么a^r≡1(mod n) 或者对某个j(0≤j ≤s -1, j∈Z) 等式 a^(2^j*r) ≡-1(mod n)成立。这个理论是通过一个事实经由Fermat定理推导而来:n是一个奇素数,则方程x^2 ≡ 1 mod n只有±1两个解

   算法实现:

    输入:一个大于3的奇整数n和一个大于等于1的安全参 数t(用于确定测试轮数)。
  输出:返回n是否是素数(概率意义上的,一般误判概率小于(1/2)80即可) 。
  1.将n-1表示成2sr,(其 中 r是奇数)
  2. 对i从1到 循t 环作下面的操作:
     2.1选择一个随机整数a(2≤a ≤n-2)
     2.2计算y ←ar mod n
     2.3如果y≠1并且y ≠n-1作下面的操作,否则转3:
        2.3.1 j←1;
        2.3.2 当j≤s-1 并且y≠n-1循环作下面操作,否则跳到 2.3.3
              {计算y ←y2 mod n;
              如果 y=1返回 "合数 ";
              否则 j←j+1; }
         2.3.3如果y ≠n-1 则返回" 合数" ;
  3.返回"素数"。

(四)   实验过程

1.   编写米勒拉宾算法程序,用c语言实现,代码见附录2

2.   运行该程序,输入测试数据,得出结果,截图保存,并完成实验报告

      实验截图

QQ截图20160112195002.png

(五)   实验心得

     本次实验内容比较新颖,是第一次接触到米勒拉宾素数检测原理,相对前一个实验来说更难理解,通过这次实验,理解和加深了对米勒拉宾算法的了解,知道了素数检测在密码学中的重要地位,受益匪浅。

附录1:

#include<stdio.h>

#include<string.h>

void EncodeMain();                                               

void DecodeMain();                                              

void Decode(int *str,int *keychar);                    

void Encode(int *str,int *keychar);                

void keyBuild(int *keychar);                                 

void StrtoBin(int *midkey,int *keychar);               

void keyCreate(int *midkey2,int movebit,int i);  

void EncodeData(int *lData,int *rData,int *srt);      

void F(int *rData,int *key);                                   

void Expand(int *rData,int *rDataP);                     

void ExchangeS(int *rDataP,int *rData);                  

void ExchangeP(int *rData);                               

void FillBin(int *rData,int n,int s);                           

void DecodeData(int *str,int *lData,int *rData);      

int IP1[]={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,

 };

int IP2[]={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

 };

int s[][4][16]={{                                                                            

                 {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}

                 },

                {

                 {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}

                },

                {

                 {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}

                },

                {

                 {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}

                },

                {

                 {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}

                },

                {

                 {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}

                },

                {

                 {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}

                },

                {

                 {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}

                }

};

int Ex[48]={  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

 };

int P[32]={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

 };

int PC1[56]={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,33,15,

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

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

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

 };

int PC2[48]={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

 };

int key[16][48];

char str[8];

void main()                

{

    EncodeMain();

}

void EncodeMain()        

{

  int i;

  char keychar[8];

  int key2[8];

  int strkey[8];

  printf("请输入8个要加密的字符:\n");

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

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

  getchar();

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

    strkey[i]=str[i];

  printf("\n输入明文的十六进制为:\n");

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

    printf("%10x",strkey[i]);

  printf("\n请输入密钥(8个字符):\n");

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

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

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

     key2[i]=keychar[i];

  getchar();

  Encode(strkey,key2);

  printf("\n加密后十六进制密文是:\n");

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

     printf("%10x",strkey[i]);

  printf("\n\n请输入解密密码\n");

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

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

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

     key2[i]=keychar[i];

  Decode(strkey,key2);

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

    printf("%10x",strkey[i]);

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

    str[i]=strkey[i];

  printf("\n明文为:\t");

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

    printf("%c",str[i]);

  printf("\n\n");

}

void keyBuild(int *keychar){           

    int i,j;

    int movebit[]={1,1,2,2,2,2,2,2,

                   1,2,2,2,2,2,2,1};

    int midkey2[56];

    int midkey[64];

    StrtoBin(midkey,keychar);

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

      midkey2[i]=midkey[PC1[i]-1];

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

      keyCreate(midkey2,movebit[i],i);

   }

void StrtoBin(int *midkey,int *keychar){    

    int trans[8],i,j,k,n;

    n=0;

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

        j=0;

        while(keychar[i]!=0){

            trans[j]=keychar[i]%2;

            keychar[i]=keychar[i]/2;

            j++;

        }

        for(k=j;k<8;k++)trans[k]=0;

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

           midkey[n++]=trans[7-k];

    }

   }

void keyCreate(int *midkey2,int movebit,int n){

    int i,temp[4];

    temp[0]=midkey2[0];

    temp[1]=midkey2[1];

    temp[2]=midkey2[28];

    temp[3]=midkey2[29];

   if(movebit==2){

       for(i=0;i<26;i++){

         midkey2[i]=midkey2[i+2];

         midkey2[i+28]=midkey2[i+30];

       }

       midkey2[26]=temp[0];midkey2[27]=temp[1];

       midkey2[54]=temp[2];midkey2[55]=temp[3];  }

     else

     { for(i=0;i<27;i++){

        midkey2[i]=midkey2[i+1];

        midkey2[i+28]=midkey2[i+29];

       }

       midkey2[27]=temp[0];midkey2[55]=temp[2];

     }

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

      key[n][i]=midkey2[PC2[i]-1];

}

void EncodeData(int *lData,int *rData,int *str){  

    int i,j,temp[8],lint,rint;

    int data[64];

    lint=0,rint=0;

    for(i=0;i<4;i++){

       j=0;

       while(str[i]!=0){

         temp[j]=str[i]%2;

         str[i]=str[i]/2;

         j++;

       }

       while(j<8)temp[j++]=0;

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

        lData[lint++]=temp[7-j];

       j=0;

       while(str[i+4]!=0){

        temp[j]=str[i+4]%2;

        str[i+4]=str[i+4]/2;

        j++;

       }

       while(j<8)temp[j++]=0;

       for(j=0;j<8;j++)rData[rint++]=temp[7-j];

    }

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

       data[i]=lData[i];

       data[i+32]=rData[i];

    }

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

       lData[i]=data[IP1[i]-1];

       rData[i]=data[IP1[i+32]-1];

    }

    }

void F(int *rData,int *key){                 

    int i,rDataP[48];

    Expand(rData,rDataP);

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

      rDataP[i]=rDataP[i]^key[i];

      }

    ExchangeS(rDataP,rData);

    ExchangeP(rData);

   }

void Expand(int *rData,int *rDataP){         

    int i;

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

      rDataP[i]=rData[Ex[i]-1];

   }

void ExchangeS(int *rDataP,int *rData){        

    int i,n,linex,liney;

    linex=liney=0;

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

        n=i/6;

        linex=(rDataP[i]<<1)+rDataP[i+5];

        liney=(rDataP[i+1]<<3)+(rDataP[i+2]<<2)+(rDataP[i+3]<<1)+rDataP[i+4];

        FillBin(rData,n,s[n][linex][liney]);

    }

   }

void ExchangeP(int *rData){                  

    int i,temp[32];

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

      temp[i]=rData[i];

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

      rData[i]=temp[P[i]-1];

  }

void FillBin(int *rData,int n,int s){       

    int temp[4],i;

    for(i=0;i<4;i++){

        temp[i]=s%2;

        s=s/2;

        }

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

        rData[n*4+i]=temp[3-i];

    }

void DecodeData(int *str,int *lData,int *rData){  

    int i;int a,b;int data[64];

    a=0,b=0;

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

        data[i]=lData[i];

        data[i+32]=rData[i];

    }

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

        lData[i]=data[IP2[i]-1];

        rData[i]=data[IP2[i+32]-1];

    }

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

        a=(lData[i]&0x1)+(a<<1);

        b=(rData[i]&0x1)+(b<<1);

        if((i+1)%8==0){

            str[i/8]=a;a=0;

            str[i/8+4]=b;b=0;

        }

    }

    }

void Encode(int *str,int *keychar){          

   int lData[32],rData[32],temp[32],rDataP[48];

   int i,j;

   keyBuild(keychar);

   EncodeData(lData,rData,str);

   for(i=0;i<16;i++){

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

        temp[j]=rData[j];

     F(rData,key[i]);

     for(j=0;j<32;j++){

        rData[j]=rData[j]^lData[j];

     }

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

        lData[j]=temp[j];

   }

   DecodeData(str,rData,lData);

}

void Decode(int *str,int *keychar){        

   int lData[32],rData[32],temp[32],rDataP[48];

   int i,j;

   keyBuild(keychar);

   EncodeData(lData,rData,str);

   for(i=0;i<16;i++){

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

        temp[j]=rData[j];

     F(rData,key[15-i]);

     for(j=0;j<32;j++){

        rData[j]=rData[j]^lData[j];

     }

     for(j=0;j<32;j++){

        lData[j]=temp[j];

        }

   }

   DecodeData(str,rData,lData);

}

附录2:

#include<stdio.h>

void main()

{

 int n, t= 5;

 int a, a0;

 int i = 1, m, j, s=0;

 int r, y;

 scanf("%d, %d", &n, &a);

 while(n-1 != 2*s)

 {

  s++;

 }

 while(s % 2 == 0)

 {

  s /= 2;

  i++;

 }

 r = i;

 printf("s = %d, r = %d\n", s, r);

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

 {

  a0 = a;

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

   a *= a0;

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

  y = a % n;

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

  if(y != 1 && y != n-1)

 {

   j = 1;

   while(j <= s-1 && y != n-1)

 {

    y = y*y % n;

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

   if( y == 1)

   {

    printf("合数!\n");

    break;

  }

    else

       j++;

   }

   if(y != n - 1)

    {

     printf("合数!\n");

     break;

    }

  }

  else

  {

   printf("素数!\n");

   break;

  }

 }

}

             

                                                                                             

相关推荐