密码技术实验报告

XH云南大学软件学院

School of Software, Yunnan University

密码技术实验报告
密码技术实验报告

维吉尼亚密码代码

// 维吉尼亚密码c.cpp : 定义控制台应用程序的入口点。

#include "stdafx.h"

int _tmain(int argc, _TCHAR* argv[])

{

       return 0;

}

#include "stdio.h"

#include "string.h"

void encrypt(char[],char[],char[]);

void decrypt(char[],char[],char[]);

int main()

{

      int caozuo;

        char mingwen[100]="0";

     char miwen[100]="0";

     char miyue[100]="0"; 

    

        printf("请选择加/解密操作:1加密,2解密:");

        scanf("%d",&caozuo);

        

       while((caozuo!=1)&&(caozuo!=2))//错误判断

     {

        printf("输入错误,请从新选择:");

        scanf("%d",&caozuo);        

     }

 

         if(caozuo==1){

        printf("请输入您的明文:");scanf("%s",mingwen);

        printf("请输入您的密钥:");scanf("%s",miyue);

        encrypt(mingwen,miyue,miwen);

     }      

   

        else if(caozuo==2)

        {

        printf("请输入您的密文:");scanf("%s",miwen);

        printf("请输入您的密钥:");scanf("%s",miyue);

        decrypt(miwen,miyue,mingwen);         

        }   

        getchar();//回收回车

}

        

void encrypt(char mingwen[],char miyue[],char miwen[])

{

       int i,j,n,m,len_miyue,len_mingwen;

       j=0;

       len_miyue= strlen(miyue);

       len_mingwen= strlen(mingwen);

             

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

       {

           if(mingwen[i]>='a' && mingwen[i]<='z'){//小写转大写

           m=65;n=97;

                 if(miyue[j%len_miyue]>='A' && miyue[j%len_miyue]<='Z')//密钥为大写改为小写

                        miyue[j%len_miyue]=miyue[j%len_miyue]+32;

              }

           else if(mingwen[i]>='A' && mingwen[i]<='Z'){//大写转小写

           m=97;n=65;

                 if(miyue[j%len_miyue]>='a' && miyue[j%len_miyue]<='z')//密钥为小写改为大写

                        miyue[j%len_miyue]=miyue[j%len_miyue]-32;

              }

        miwen[i]=(mingwen[i]-n+miyue[j%len_miyue]-n)%26+m;

        j++;

     }    

       printf("加密后的密文为:");

       puts(miwen);

    getchar();

}

        

void decrypt(char miwen[],char miyue[],char mingwen[])

{

       int i,j,n,m,len_miyue,len_miwen;

       j=0;

       len_miyue= strlen(miyue);

       len_miwen= strlen(miwen);

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

       {

           if(miwen[i]>='a' && miwen[i]<='z'){//小写转大写

           m=65;

                 if(miyue[j%len_miyue]>='A' && miyue[j%len_miyue]<='Z'){

                        miyue[j%len_miyue]=miyue[j%len_miyue]+32;//密钥改为小写

                 }

              }

           else if(miwen[i]>='A' && miwen[i]<='Z'){//大写转小写

           m=97;

           if(miyue[j%len_miyue]>='a' && miyue[j%len_miyue]<='z') {

                        miyue[j%len_miyue]=miyue[j%len_miyue]-32;//密钥改为大写

                 }

        }

        mingwen[i]=(miwen[i]-miyue[j%len_miyue]+26)%26+m;

        j++;     

        }

    printf("解密后的明文为:");

       puts(mingwen);

    getchar();

}

 

第二篇:数学建模实验报告古典密码与破译

古典密码与破译

一、实验目的及意义

本实验主要涉及代数,利用模运算意义下的矩阵乘法、求逆矩阵、线性无关、线性空间与线性变换等概念和运算,学习古典密码体制的加密、解密和破译过程.

二、实验内容

1.Hill2 加密;

2.Hill2 解密。

三、实验步骤

1. 开启软件平台——MATLAB,开启MATLAB编辑窗口;

2. 根据加密解密算法步骤编写M文件

  1. 保存文件并运行;
  2. 观察运行结果(数值或图形);
  3. 根据观察到的结果和体会写出实验报告。

四、实验要求与任务

根据实验内容和步骤,完成以下实验,要求写出实验报告。

1. 实际问题 (甲) 的修正:按照甲方与乙方的约定,他们之间的密文通信采用 Hill2 密码,密钥为二阶矩阵且汉语拼音的 26 个字母以及空格(字母 A~Z 的表值为 1~26,空格的表值为 0)与 0~26 之间的整数建立一一对应的关系,称之为字母的表值,试修正表 1、表 2 以及附录中的程序,以给出模 27 意义下矩阵可逆的判别方法和具体求法.

2. 若将你姓名的拼音作为明文,例如:赵本山 (ZHAO BEN SHAN,含空格),密钥等参见练习 1,求其在模 27 意义下的Hill2密文.

3. 若将你姓名的拼音作为Hill2密文,例如:赵本山 (ZHAO BEN SHAN,含空格),密钥等参见练习 1,求其在模 27 意义下的明文.

五. 程序代码及运行结果(经调试后正确的源程序)

1. 实际问题 (甲) 的修正:按照甲方与乙方的约定,他们之间的密文通信采用 Hill2 密码,密钥为二阶矩阵且汉语拼音的 26 个字母以及空格(字母 A~Z 的表值为 1~26,空格的表值为 0)与 0~26 之间的整数建立一一对应的关系,称之为字母的表值,试修正表 1、表 2 以及附录中的程序,以给出模 27 意义下矩阵可逆的判别方法和具体求法.

明文字母的表值

27倒数表

表2可用①中程序求得:

①  求模27倒数表(prog1_MOD27.m)

程序代码:

m=27;

for a=1:m

  for i=1:m

    if mod(a*i,m)==1

      fprintf('%d 的模%d倒数是: %d\n',a,m,i);break;

    end;

  end;

end

运行结果:

1 的模27倒数是: 1

2 的模27倒数是: 14

4 的模27倒数是: 7

5 的模27倒数是: 11

7 的模27倒数是: 4

8 的模27倒数是: 17

10 的模27倒数是: 19

11 的模27倒数是: 5

13 的模27倒数是: 25

14 的模27倒数是: 2

16 的模27倒数是: 22

17 的模27倒数是: 8

19 的模27倒数是: 10

20 的模27倒数是: 23

22 的模27倒数是: 16

23 的模27倒数是: 20

25 的模27倒数是: 13

26 的模27倒数是: 26

②  判断二阶矩阵在模27意义下是否可逆,可逆则求其逆(prog1.m)

程序代码:

m=27;

aa=input('输入一个2×2的矩阵,格式:[a11 a12;a21 a22]:')

while size(aa)~=[2 2]

  aa=input('输入一个2×2的矩阵,格式:[a11 a12;a21 a22]:')

end

a=det(aa);bb=aa;

if gcd(m,a)~=1

 disp(' 该矩阵不可逆 ')

else

  for i=1:m

    if mod(a*i,m)==1

      antaa=i;break;

    end

  end

  astar=[aa(2,2) -aa(1,2);-aa(2,1) aa(1,1)];

  invaa=mod(antaa*astar,m);

disp(['原矩阵是:',mat2str(aa),',它的逆矩阵(mod',num2str(m),')是:',mat2str(invaa)])

end

运行结果:

输入一个2×2的矩阵,格式:[a11 a12;a21 a22]:[1 2;0 4]

aa =

     1     2

     0     4

原矩阵是:[1 2;0 4],它的逆矩阵(mod27)是:[1 13;0 7]

2. 若将你姓名的拼音作为明文,例如:赵本山 (ZHAO BEN SHAN,含空格),密钥等参见练习 1,求其在模 27 意义下的Hill2密文.

程序代码:(prog2.m)

m=27;enmat=[1 2;0 4];demat=[1 13;0 7];ZERO=64;c=[];en=[];

fprintf('本组成员的姓名为 吴亚山 李杰 赵传来,拼音为:\n')

fprintf('WU YA SHAN LI JIE ZHAO CHUAN LAI\n')

fprintf('以[1 2;0 4]为密钥对此拼音串加密\n')

astr=['WU YA SHAN LI JIE ZHAO CHUAN LAI'];

an=double(astr);

if mod(length(an),2)==1

  an=[an,an(length(an))];

end

an=an-ZERO;

for i=1:length(an)

  if an(i)==-32

    an(i)=0;

  end

end

c=reshape(an,2,length(an)/2);

dn=mod(enmat*c,m);

en=reshape(dn,1,length(an));

en=en+ZERO;

for i=1:length(en)

  if en(i)==64

    en(i)=32;

  end

end

en=en(1: length(an));

disp(['密文是:',char(en)])

运行结果:

本组成员的姓名为 吴亚山 李杰 赵传来,拼音为:

WU YA SHAN LI JIE ZHAO CHUAN LAI

以[1 2;0 4]为密钥对此拼音串加密

密文是:KCWSA HEBBXUI AIE OEDFFLWCBBXUSI

3. 若将你姓名的拼音作为Hill2密文,例如:赵本山 (ZHAO BEN SHAN,含空格),密钥等参见练习 1,求其在模 27 意义下的明文.

程序代码:(prog3.m)

m=27;enmat=[1 2;0 4];demat=[1 13;0 7];ZERO=64;c=[];en=[];

fprintf('本组成员的姓名为 吴亚山 李杰 赵传来,拼音密文为:\n')

fprintf('KCWSA HEBBXUI AIE OEDFFLWCBBXUSI\n')

fprintf('以[1 13;0 7]为密钥对此拼音串密文解密\n')

astr=['KCWSA HEBBXUI AIE OEDFFLWCBBXUSI'];

an=double(astr);

if mod(length(an),2)==1

  an=[an,an(length(an))];

end

an=an-ZERO;

for i=1:length(an)

  if an(i)==-32

    an(i)=0;

  end

end

c=reshape(an,2,length(an)/2);

dn=mod(demat*c,m);

en=reshape(dn,1,length(an));

en=en+ZERO;

for i=1:length(en)

  if en(i)==64

    en(i)=32;

  end

end

en=en(1: length(an));

disp(['明文是:',char(en)])

运行结果:

本组成员的姓名为 吴亚山 李杰 赵传来,拼音密文为:

KCWSA HEBBXUI AIE OEDFFLWCBBXUSI

以[1 13;0 7]为密钥对此拼音串密文解密

明文是:WU YA SHAN LI JIE ZHAO CHUAN LAI

六.实验总结

本实验主要涉及代数,利用模运算意义下的矩阵乘法、求逆矩阵、线性无关、线性空间与线性变换等概念和运算,学习古典密码体制的加密、解密和破译过程.

实验中解决了如下问题:求模27倒数表;判断二阶矩阵在模27意义下是否可逆,可逆则求其逆;求明文字符串在模27意义下的Hill2密文;求密文字符串在模27意义下的Hill2密文。

在测试求密文的程序时,我发现按照文中表1给定的明文字母表值无法加密每个字母都用空格分隔的字符串(第一个字符为字母),如:"A B C D E F G",经过分析,我觉得是因为空格的明文为0,经过密钥左乘后对原始数据没有影响,故没实现加密。

                                 学生签名:          

七.教师评语及成绩

教师签名:           

                                                      年    月     日

相关推荐