Hill密码的加解密过程

  • 格式:docx
  • 大小:21.70 KB
  • 文档页数:6
end
for n=1:11
D(1,n)=y(2*n-1);
D(2,n)=y(n);
end
H=mod(B*D,26);
for u=1:11
for v=1:2
setstr(H(v,u)+64)
end
end
输出的结果为:
ans =G
ans =U
ans =A
ans =N
ans =X
ans =I
ans =N
输入明文I
输入明文N
输入明文G
H =2 15 7 20 8 13 6 19 10 3 21
11 16 1 18 13 2 3 4 3 1 21
ans =B
ans =K
ans =O
ans =P
ans =G
ans =A
ans =T
ans =R
ans =H
ans =M
ans =M
ans =B
ans =F
ans =C
c(i)=abs(a)-64; end%将输入的字母转化为字母对应的数字,如A对应1
a=[c(1) c(3);c(2),c(4)];%明文的四个字母组成的对应矩阵
b=[c(5),c(7);c(6),c(8)];%密文的四个字母组成的矩阵
m=qiudao(c(5),c(7),c(6),c(8));%求矩阵b的逆矩阵,调用函数qiudao
ans =S
ans =D
ans =J
ans =C
ans =C
ans =A
ans =U
ans =U
总结,本次实验只是为了解决一个已知的问题而编的程序,但是是可以推广的,只需要修改几个参数就可以了,比方修改第三题的循环次数及A矩阵就可以对任意的明码进行加密,解密也一样。本实验的关键点在于如何解决求模的问题,只要此问题解决了,一切就迎刃而解。下面将任意输入的明文加密
functionf=qiudao(a,b,c,d)%矩阵的形式为[a,b;c,d]
h=a*d-b*c;%求矩阵的行列式
fori=1:26%求行列式的倒数
ifrem(i*h,26)==1break;
end
end
f=mod(i*mod([d,-b;-c,a],26),26)%其中[d,-b;-c,a]为伴随矩阵
end
A=[l(1),l(2);l(3),l(4)];
K=A*M;
H=mod(K,26)
for u=1:m/2
for v=1:2
setstr(H(v,u)+64)
end
end
elseif rem(m,2)==1
for i=1:m
a=input('输入明文','s');
c(i)=abs(a)-64;
c(m+1)=c(i);
ans =F
ans =U
ans =M
ans =U
ans =R
ans =E
ans =A
ans =I
ans =J
ans =I
ans =A
ans =T
ans =I
ans =N
ans =G中文意思为:关心父母,热爱家庭
2,已知密文与密钥,求对应的明文,如将上述的密文翻译成明文,设密钥为A=[1,1;0,3]
end
for j=1:(m+1)/2
M(1,j)=c(2*j-1);
M(2,j)=c(2*j);
end;
for n=1:4
l(n)=input('输入密钥,按照先行后列的顺序');
end
A=[l(1),l(2);l(3),l(4)];
K=A*M;
H=mod(K,26)
for u=1:(m+1)/2
for v=1:2
m=input('输入要加密的明文字母的个数');
if mod(m,2)==0
for i=1:m
a=input('输入明文','s');
c(i)=abs(a)-64;
end
for j=1:m/2
M(1,j)=c(2*j-1);
M(2,j)=c(2*j);
end;
for n=1:4
l(n)=input('输入密钥,按照先行后列的顺序');
ans =F
ans =U
ans =M
ans =U
ans =R
ans =E
ans =A
ans =I
ans =J
ans =I
ans =A
ans =T
ans =I
ans =N
ans =G
注意:在每输入一个数字或字符后都要按下回车键,进行下次输入
3、把一段明文加密,比方把上面的“REAIFUMUGUANXINJIATING”加密。假设密匙为A=[1,1;0,3]
因为本题是已知密文求明文,故需先求出密钥在模26下的逆矩阵。题中已知四个明文字母和四个密文字母β=A*α,故 =α* 可以求得密钥的逆矩阵
主程序为:(在运行主程序之前,请先运行函数文件)
for i=1:8
a=input('a=先输用来求密钥的明文对应的字母,再输入密文对应的字母,均为大写','s');
setstr(H(v,u)+64)
end
end
end
参考资料:《数学建模与实验》(陈恩水、王峰主编)56---60页Hill密码问题的加密、解密与破译;
《Matlab及其在数学上的应用》中关于数组矩阵的构造方法。
解此问题的关键在于求密钥的逆矩阵,调用qiudao函数,编程如下
for i=1:4
a(i)=input('输入密钥,按照先行后列的顺序')
end
B=qiudao(a(1),a(2),a(3),a(4));
for j=1:22
x=input('输入要翻译的密文','s');
y(j)=abs(x)-64;
将明文转化为密文就容易多了,因为已知密钥与明文,只需构造矩阵,在做矩阵乘法就可以了。
for i=1:22
a=input('输入明文','s');
c(i)=abs(a)-64;
end
for j=1:11
M(1,j)=c(2*j-1);
M(2,j)=c(2*j);
end;
A=[1,1;0,3];
K=A*M;
A=mod(a*m,26)%A为密钥的逆矩阵
for j=1:22
b=input('输入密文','s')
n(j)=abs(b)-64;
end;
for p=1:11;
L(1,p)=n(2*p-1);%将输入的密文字母转化为矩阵,矩阵第二行第一列的字母为输入的第二个字母
L(2,p)=n(2*p);
end; K=mod(A*L,26)
end;
end;
end;
得到模26的倒数表
1
3
5
7
9
11
15
17
19
21
23
25
1
9
21
15
3
19
7
23
11
5
17
25
2,一段Hill2密码编译的密文 BKOPGATRHMMBFCSDJCCAUU已知 SDJC 代表 IJIA 破译这段密码的内容
根据Hill密码解题的步骤,先求一个2阶矩阵的逆矩阵,定义一个函数qiudao如下,Matlab编程如下。
for j=1:11%因为输出字母的顺序为K(1,1),K(2,1),K(1,2),K(2,2)等的折线性
for i=1:2
setstr(K(i,j)+64)%将对应的数字转化为大写字母,输出结果
end
end所得的结果为ans =G
ans =U
ans =A
ans =N
ans =X
ans =I
ans =N
Hill密码的加解密过程
1,在求Hill密码加解密过程前,先求出模26的倒数表
根据模26倒数的定义如果a与b互为倒数,则a*b-1一定是26的整数倍,故可以用mod函数。
利用Matlab,编程如下:
for i=1:25
for n=1:26
ifrem((i*n-1),26)==0
disp([i;n]);
H=mod(K,26)
for u=1:11
for v=1:2
setstr(H(v,u)+64)
end
end
输出结果为:输入明文G
输入明文U
输入明文A
输入明文N
输入明文X
输入明文I
输入明文N
输入明文F
输入明文U
输入明文M
输入明文U
输入明文R
输入明文E
输入明文A
输入明文I
输入明文J
输入明文I
输入明文A
输入明文T