Hill加密Matlab课程设计

Hill加密课程设计

前言

应用矩阵编制Hill密码
密码学在经济和军事方面都起着极其重要的作用。1929年,希尔(Hill)通过矩阵理论对传输信息进行加密处理,提出了在密码学史上有重要地位的希尔加密算法。下面我们介绍一下这种算法的基本思想。
假设我们要发出“attack”这个消息。首先把每个字母a,b,c,d……x,y,z映射到数1,2,3,4……24,25,26。例如1表示a,3表示c,20表示t,11表示k,另外用0表示空格,用27表示句号等。把这个消息按列写成矩阵的形式。
第一步:“加密”工作。现在任选一个三阶的可逆矩阵。于是可以把将要发出的消息或者矩阵经过乘以A变成“密码”(B)后发出。
第二步:“解密”。解密是加密的逆过程,这里要用到矩阵A的逆矩阵A-1 这个可逆矩阵称为解密的钥匙,或称为“密匙” 。当然矩阵A是通信双方都知道的。即用从密码中解出明码。
通过反查字母与数字的映射,即可得到消息“attack”。
在实际应用中,可以选择不同的可逆矩阵,不同的映射关系,也可以把字母对应的数字进行不同的排列得到不同的矩阵,这样就有多种加密和解密的方式,从而保证了传递信息的秘密性。

1.使用单个程序实现

clc;
clear;
word=['a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z','A','B','C','D','E','F','G','H','I','J','K','L',...
      'M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z','','.',',','!','1','2','3','4','5','6','7','8','9','0',':',';','?']; %生成字库矩阵
txt=input('输入命令:','s');%获取原始消息
k=ceil(length(txt)/2);%通过给元素个数开方并取整确定加密运算矩阵大小
keyword=rand(k);%生成随机加密矩阵密钥
[~,n]=ismember(txt,word);%判断生成指令矩阵
mat=zeros(k);%生成全零加密矩阵模型
for a=1:length(n)%将指令矩阵写入加密矩阵
    mat(a)=n(a);
end
mat_s=keyword*mat;%加密过程
disp('加密后的指令矩阵:')
disp(mat_s);%显示加密后的指令矩阵,此矩阵用于指令的传输
disp('密钥:');
disp(keyword);%显示密钥
%以下为解密过程
mat_s=inv(keyword)*mat_s;%解密过程
mat_s=mat_s(:)';%将结果重构为一个列向量,再将列向量转置为行向量用于最后显示指令
for a=1:numel(n)%循环取整判断,将为了补齐指令矩阵的0元素剔除,恢复原始口令
    x=round(mat_s(a));
    if x>0%消除0元素
       w(a)=word(x);%解密字符串
    else
        continue
    end
end
disp('指令为:');
disp(w);

2.使用子函数方法

主程序:

clc;
clear;
s=input('请输入','s');%获取原始消息
disp(s);%显示消息进行验证
%%%加密过程%%%
[s,key]=word(s);%调用加密子函数
disp('加密后的矩阵');
disp(s);%显示加密后的矩阵
disp('密钥');
disp(key);%显示用以加密的密钥
%%%解密过程%%%
mat=open(s,key);%调用解密子函数
disp('解密后的矩阵');
disp(mat);%显示解密后的明码

加密子函数:

function [s,key]=word(s)
word=['a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z','A','B','C'',D'',E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'];
k=ceil(numel(s)/2);
key=rand(k);%生成随机加密密钥
[~,n]=ismember(s,word);%生成消息映射行向量
disp(n);
mat=zeros(k);%生成生成全零加密矩阵模型
for a=1:numel(n) %将行向量中的元素写入模型生成映射矩阵
    mat(a)=n(a);
end
s=(key)*(mat);%加密运算

解密子函数:

function mat=open(s,key)
word=['a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z','A','B','C'',D'',E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'];
key1=inv(key);
s=(key1)*(s);%解密运算
s=s(:)';%将解密后的矩阵转换为行向量。
for a=1:length(s)%循环取整判断,将为了补齐指令矩阵的0元素剔除,恢复原始口令
    s1=round(s(a));%将元素整数化方便后面恢复明码
    if s1>0%消除为了补齐矩阵的非口令0元素
       mat(a)=word(s1);%解密字符串,将数字代码转换为文字符号
    else
        continue
    end
end
disp(mat);

3.总结

1.在运用中子函数方法更贴近实际情况。
2.经过多次测试,在解密过程中,把解密后的矩阵转换为行向量,可以保证解密后消息的准确性。
在这里插入图片描述

  • 2
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值