云南大学软件学院
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. 实际问题 (甲) 的修正:按照甲方与乙方的约定,他们之间的密文通信采用 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 意义下矩阵可逆的判别方法和具体求法.
表1 明文字母的表值
表2 模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,经过密钥左乘后对原始数据没有影响,故没实现加密。
学生签名:
七.教师评语及成绩
教师签名:
年 月 日