文档视界 最新最全的文档下载
当前位置:文档视界 › Hill密码的加密解密

Hill密码的加密解密

Hill密码的加密解密
Hill密码的加密解密

【实验十】Hill密码的加密、解密与破译

一、实验目的

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

二、实验任务

任务五

找出元素属于Z26的所有可能的Hill2密码加密矩阵。若截获了如下一段密文:UTCQCVFOYQUVMGMGULFOLEYHDUHOPEASWXTIFBAMWT

且已知它是根据表10.1按Hill2密码体制加密的,你能否将其解密?

分析:对于第一问,找出元素属于Z26的所有可能的Hill2密码加密矩阵,我们只需要用枚举法即可。关键在于第二问的解密,根据我们编写的C++程序,共有约15万个可能的加密矩阵,也就对应着同等数量的可能明文。所以问题的重点就在于如何从这么多数量的明文中筛选出有意义的信息。

1、找出元素属于Z26的所有可能的Hill2密码加密矩阵

C++源代码(枚举加密矩阵部分):

chain_mat* head=new chain_mat; //加密矩阵用链表储存

head->next=NULL;

chain_mat* now=head;

int n=0;

for(int a=0;a<26;a++)

for(int b=0;b<26;b++)

for(int c=0;c<26;c++)

for(int d=0;d<26;d++)

{

intdet=a*d-b*c;

if(det%2!=0&&det%13!=0) //判断是否模26可逆

{

chain_mat* newm=new chain_mat;

newm->dat[0][0]=a;

newm->dat[0][1]=b;

newm->dat[1][0]=c;

newm->dat[1][1]=d;

n++; //累加符合要求的矩阵数量

now->next=newm;

now=now->next;

now->next=NULL;

}

}

运行结果:n=157248

由于矩阵数量过多,我们将其存储在matrixlist.txt文件中

C++源代码(输出矩阵部分):

voidoutput_mat(chain_mat* head)

{

ofstreamoutfile;

outfile.open("matrixlist.txt");

chain_mat* now=head->next;

while(now!=NULL)

{

outfile<dat[0][0]<<'\t'<dat[0][1]<<'\n'<dat [1][0]<<'\t'<dat[1][1]<<"\n=========="<

now=now->next;

}

outfile.close();

}

下面给出matrixlist.txt中部分内容(完整文件将发至邮箱):

0 1

1 0

==========

0 1

1 1

==========

0 1

1 2

==========

0 1

1 3

==========

0 1

1 4

==========

0 1

1 5

==========

0 1

1 6

==========

0 1

1 7

==========

0 1

1 8

==========

0 1

1 9

==========

0 1

1 10

==========

2.解密题中密文

首先需要做的是对矩阵进行模逆运算

C++源代码(模26逆矩阵运算部分):

voidinv(chain_mat* m1)

{

intdet=m1->dat[0][0]*m1->dat[1][1]-m1->dat[0][1]*m1->dat[1][0];

det=reci(det);

inttmp;

tmp=m1->dat[0][0]*det;m1->dat[0][0]=m1->dat[1][1]*det;m1->dat[1][ 1]=tmp;

m1->dat[0][1]*=-1*det;m1->dat[1][0]*=-1*det;

for(inti=0;i<2;i++)

for(int j=0;j<2;j++)

{

m1->dat[i][j]%=26;

if(m1->dat[i][j]<0)

m1->dat[i][j]+=26;

}

}

然后用逆矩阵乘密文向量,得到可能明文序列,存入名为me1的string数组中

C++源代码(模26逆矩阵运算部分):

n=0;

while(now!=NULL)

inv(now);

for(inti=0;i

{

int s1=now->dat[0][0]*co1[i]+now->dat[0][1]*co1[i+1];

int s2=now->dat[1][0]*co1[i]+now->dat[1][1]*co1[i+1];

s1%=26;s2%=26;

if(s1<0)s1+=26;

if(s2<0)s2+=26;

if(s1==0)

s1=26;

if(s2==0)

s2=26;

me1[n]+=('A'+s1-1);

me1[n]+=('A'+s2-1);

}

n++;

inv(now);

now=now->next;

}

至此,我们得到了157248条可能的明文,接下来就要考虑筛选的问题。我们首先猜测明文是汉语拼音,根据拼音的字母排列特点,我们设计了字典式的筛选方法,即将拼音中出现频率较高的双字母组合先列出,然后与明文比对,如果出现了特定字母组合则将此字符串对应的“评级”提高。处理完毕后选出“评分”最高的那条明文。

C++源代码(“评分”部分):

intcountword_MDR(string str[],int n)

{

int m=0;int index=0;int loc=0;

intlen=str[0].length();

stringdic[]={"BA","BO","BI","BU","PA","PO","PI","PU","MA","MO","M I","MU","FA","FO","FU",

"DA","DE","DI","DU","TA","TE","TI","TU","NA","NE","NI","NU","NV","LA" ,"LE","LI","LU","LV",

"GA","GE","GU","KA","KE","KU","HA","HE","HU","JI","JU","QI","QU","XI" ,"XU",

"ZH","CH","SH","ZA","ZE","ZI","ZU","CA","CE","CI","CU","SA","SE","SI" ,"SU",

"RE","RI","RU","WA","WO","WU","YA","YE","YI","YU",

"AO","AI","OU","EI","IA","IE","IU","UI","UA","AN","EN","IN","UN","NG" };

for(inti=0;i

{

intn_aoe=0;

index=0;

for(int j=0;j

if(str[i][j]=='A'||str[i][j]=='O'||str[i][j]=='E'||str[i][j]= ='I'||str[i][j]=='U'||str[i][j]=='V')n_aoe++;

for(int j=0;j<87;j++)

{

intpos=0;

while(str[i].find(dic[j],pos)!=string::npos)

{

index++;

pos=str[i].find(dic[j],pos)+1;

}

}

if(m

}

returnloc;

}

以题中密文进行测试,运行结果见下图:

程序返回了有意义的明文,“微软公司即将推出新一代奔腾”,且加密矩阵为:

52

311

为检验此筛选方法的有效性,我们又以教材中的例题进行测试:QSIUYSBACPGZSAVCOVKPEWCPADKPPABUJCQLYXQEZAACPP

运行结果如下图:

同样,程序也返回了正确的明文,且加密矩阵也与教材相符。

三、实验小结

通过对Hill密码解密问题的思考与探究,我们加深了对于矩阵的理解,同时也灵活运用了我们的编程知识,并最终得到了正确的结果,同时在一步步分析问题并解决问题的路途中我们同样收获颇丰。然而实验也留下一个遗憾:类似的筛选方法难以运用于以英文作为明文的密码上。

希尔密码的破解

希尔密码(Hill Cipher)简介: 希尔密码是基于矩阵的线性变换, 希尔密码相对于前面介绍的移位密码以及放射密码而言, 其最大的好处就是隐藏了字符的频率信息, 使得传统的通过字频来破译密文的方法失效. 安全性: 希尔密码不是足够安全的, 如今已被证实, 关于希尔密码的破解不在本文范围内, 有兴趣的朋友可以研读相关书籍以了解相关破译方法. 希尔密码所需要掌握的前置知识: 1) 线性代数基础知识. 2) 初等数论基础知识. 坦白来说, 大部分密码学都要用到线性代数以及初等数论中的知识, 所以我希望大家可以自行找来相关书籍完成基础知识的学习, 所以关于什么是矩阵,什么是单位矩阵我不打算细讲. 在希尔密码中, 具体的话, 会涉及到矩阵的运算, 及其初等变化等. 约定: 1) 希尔密码常使用Z26字母表, 在此贴中, 我们也以Z26最为字母表进行讲解.在附带源码中有两种字母表选择. 2) 大家都知道最小的质数是2, 1 既不是质数也不是合数. 在此我们定义1对任何质数的模逆为其本身. 因为对于任意质数n, 有: 1*1 % n = 1 的. 也应该是很好理解的. 相关概念: 线性代数中的逆矩阵: 在线性代数中, 大家都知道,对于一个n阶矩阵 M , 如果存在一个n阶矩阵 N ,使得 M * N = E (其中: E为n阶单位矩阵), 则称矩阵 N 为矩阵 M 的逆矩阵, 并记为 M^-1. 比如 2阶矩阵 M = [3,6] , 则很容易得知其逆矩阵 :

[2,7] M^-1 = [7/9, -2/3] [-2/9, 1/3] . 关于这个逆矩阵是如何计算出的, 通常的有两种方法: 一是使用伴随矩阵, 通过计算行列式得到. 所用公式为: M^-1 = M^* / D . (其中M^*为M的伴随矩阵, D为M的行列式的值) 二是通过增广矩阵, 在M右侧附加一个n阶单位矩阵, 再通过初等变换将增广矩阵的左侧变换为一个n阶单位矩阵, 这时右 侧便是所求的逆矩阵. 打住!! 我们到此先打住! 我们返回到希尔密码. 希尔密码原理: 加密者在对明文加密前会选择一个加密秘匙, 这个秘匙最终会以一个m矩阵的形式参与到加密算法中的. 在加密者选定了加密秘匙后, m便得到了确定, 这时,加密者将明文按m个字母一组的形式分成多组, 最后一组不足m个字母的按特定的方式补齐. 这样就形成了很多组由m个字母组成的单个向量, 然后 对每一个m阶向量, 我们用它去乘以确定好了的秘匙. 如下为其中的一个分组A向量加密后变为B向量的过程: [A1,A2,A3 ... Am] * M = [B1,B2,B3 ... Bm] . 我们将所有相乘后的向量连在一起, 便得到了密文. 这便是希尔密码的加密.

Hill密码的加密解密

【实验十】Hill密码的加密、解密与破译 一、实验目的 本实验主要涉及代数,利用模运算下的矩阵乘法、求逆矩阵、线性无关、线性空间与线性变换等概念和运算,学习Hill密码体制的加密、解密和破译过程 二、实验任务 任务五 找出元素属于Z26的所有可能的Hill2密码加密矩阵。若截获了如下一段密文:UTCQCVFOYQUVMGMGULFOLEYHDUHOPEASWXTIFBAMWT 且已知它是根据表10.1按Hill2密码体制加密的,你能否将其解密? 分析:对于第一问,找出元素属于Z26的所有可能的Hill2密码加密矩阵,我们只需要用枚举法即可。关键在于第二问的解密,根据我们编写的C++程序,共有约15万个可能的加密矩阵,也就对应着同等数量的可能明文。所以问题的重点就在于如何从这么多数量的明文中筛选出有意义的信息。 1、找出元素属于Z26的所有可能的Hill2密码加密矩阵 C++源代码(枚举加密矩阵部分): chain_mat* head=new chain_mat; //加密矩阵用链表储存 head->next=NULL; chain_mat* now=head; int n=0; for(int a=0;a<26;a++) for(int b=0;b<26;b++) for(int c=0;c<26;c++) for(int d=0;d<26;d++) { intdet=a*d-b*c; if(det%2!=0&&det%13!=0) //判断是否模26可逆 { chain_mat* newm=new chain_mat; newm->dat[0][0]=a; newm->dat[0][1]=b; newm->dat[1][0]=c; newm->dat[1][1]=d;

Hill密码的加解密过程

Hill密码的加解密过程 1,在求Hill密码加解密过程前,先求出模26的倒数表 根据模26倒数的定义如果a与b互为倒数,则a*b-1一定是26的整数倍,故可以用mod 函数。 利用Matlab,编程如下: for i=1:25 for n=1:26 if rem((i*n-1),26)==0 disp([i;n]); end; end; end; 2,一段Hill2密码编译的密文 BKOPGATRHMMBFCSDJCCAUU已知 SDJC 代表 IJIA 破译这段密码的内容 根据Hill密码解题的步骤,先求一个2阶矩阵的逆矩阵,定义一个函数qiudao如下,Matlab 编程如下。 function f=qiudao(a,b,c,d) %矩阵的形式为[a,b;c,d] h=a*d-b*c; %求矩阵的行列式 for i=1:26 %求行列式的倒数 if rem(i*h,26)==1 break; end end f=mod(i*mod([d,-b;-c,a],26),26) %其中[d,-b;-c,a]为伴随矩阵 因为本题是已知密文求明文,故需先求出密钥在模26下的逆矩阵。题中已知四个明文字母和四个密文字母β=A*α,故=α*可以求得密钥的逆矩阵 主程序为:(在运行主程序之前,请先运行函数文件) for i=1:8 a=input('a=先输用来求密钥的明文对应的字母,再输入密文对应的字母,均为大写','s'); 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 A=mod(a*m,26) %A为密钥的逆矩阵 for j=1:22 b=input('输入密文','s') n(j)=abs(b)-64; end; for p=1:11;

Hill密码的加密论文(内含matlab程序代码)

Hill密码的加密,解密与破译 摘要 对于问题1.1:本文采用 Hill密码通信,对明文进行加密。利用已知的密钥矩阵, 2 首先,将密文转化为对应表值数字。其次,对密文的数字转化为矩阵。最后,对明文解密。 对于问题1.2:本文给出一组明文和密文,二者满足构成密钥的条件,通过求解的到密钥,并进行问题1.1的解题过程破译这段密文。 Hill密码矩阵A,并求出该矩阵的值是否与26互素,加以对于问题2.1:本文给出 4 判断。若互素则能成为密钥,否则不能构成密钥。 对于问题2.2:利用问题2.1所给的密码矩阵A,按照问题1.1的解题思路,将得到的密文解密。 Hill密码的密文和其对应的明文,通过检验二者是否对于问题2.3:本文给出一段 4 满足构成密钥的条件,若满足解的密钥,并写出求解过程;若不满足加以说明。 对于问题3:本文给出明文频数最高的字母TH和HE,及密文频数最高的字母RH和NI。两两组合得到两组“密钥”,并检验它们是否满足构成密钥的条件,若满足则解除密钥。 Hill密对于问题4:本文给出频数最高的相邻明文字母KE和相邻密文字母LK,采用 2 码通信,利用所给字母与其他字母组合,构造2×2的矩阵,并检验是否满足构成密钥的条件,加以排除得到所要的密钥。若有满足条件的矩阵,破译所给密文。 Hill密码通信,根据26个字母搭配出2×2的所有矩阵,利对于问题5:本文采用 2 用矩阵的值与26互质,加以排除不符合条件的矩阵,并求出满足条件的密钥,破译该段密文,再利用密文是否通顺加以排除,得到所要的明文和密钥。 关键字密钥 mod(26)逆 mod(26)倒数

一、Hill2密码的数学模型的主要符号说明 w Hill密钥的维数 A 密钥矩阵 S 明文 Y 密文 m 所用的表值编号 YW 哑文 二、Hill2密码的数学模型 密码是一种传统的密码体制加密过程的具体步骤如下: Hill 2 (1)、根据明文字母的表值将明文信息用数字表示,设明文信息只需要26个拼音字母A~Z(也可能不止26个,如还有数字、标点符号等),通信双方给出这26个字母表值(见表10.1明文字母的表值)。 (2)、选择一个二阶可逆整数方阵A,称为Hill 密码的加密矩阵,它是这个加密体 2 制的“密钥”(是加密的关键,仅通讯双方掌握)。问题(1)已给出了这个二阶矩阵。 (3)、将明文字母依次逐对分组。Hill 密码的加密矩阵为二阶矩阵,则明文字母2 2 密码,则每n个明文字母为一组)。若最后一组只有一个字母,个一组(可以推广至Hill n 则补充一个没有实际意义的哑字母,这样使每一组都由2个明文字母组成。查出每个明文字母的表值,构成一个二维列向量α。 (4)、A乘以α,得一新的2维列向量β=Aα,由的两个分量反查字母表值得到的两个字母即为密文字母。以上4步即为Hill 密码的加密过程。解密过程,即为上述 2 过程的逆过程。 1、实际问题: 1.1、问题陈述 甲方收到与之有秘密通信往来的乙方的一个密文信息,密文内容: W O W U Y S B A C P G Z S A V C O V K P E W C P A D K P P A B U J C Q L Y X Q E Z A A C P P

矩阵编制Hill密码

矩阵编制Hill密码 密码学在经济和军事方面起着极其重要的作用. 现代密码学涉及很多高深的数学知识. 这里无法展开介绍. 图29 保密通信的基本模型 密码学中将信息代码称为密码, 尚未转换成密码的文字信息称为明文, 由密码表示的信息称为密文. 从明文到密文的过程称为加密, 反之为解密. 1929年, 希尔(Hill)通过线性变换对待传输信息进行加密处理, 提出了在密码史上有重要地位的希尔加密算法. 下面我们略去一些实际应用中的细节, 只介绍最基本的思想. 【模型准备】若要发出信息action,现需要利用矩阵乘法给出加密方法和加密后得到的密文, 并给出相应的解密方法. 【模型假设】(1) 假定每个字母都对应一个非负整数, 空格和26个英文字母依次对应整数0~26(见下表). (2)假设将单词中从左到右, 每3个字母分为一组, 并将对应的3个整数排成3维的行向量, 加密后仍为3维的行向量, 其分量仍为整数. 【模型建立】设3维向量x为明文, 要选一个矩阵A使密文y= xA, 还要确保接收方能由y准确地解出x. 因此A必须是一个3阶可逆矩阵. 这样就可以由y = xA 得x = yA-1. 为了避免小数引起误差, 并且确保y也是整数向量, A和A-1的元素应该都是整数. 注意到, 当整数矩阵A的行列式= ±1时, A-1也是整数矩阵. 因此原问题转化为 (1) 把action翻译成两个行向量: x1, x2. (2) 构造一个行列式= ±1的整数矩阵A(当然不能取A = E). (3) 计算x1A和x2A. (4) 计算A-1.

【模型求解】(1) 由上述假设可见x1 = (1, 3, 20), x2 = (9, 15, 14). (2) 对3阶单位矩阵E = 100 010 001 ?? ? ? ?? 进行几次适当的初等变换(比如把某一行的 整数被加到另一行, 或交换某两行), 根据行列式的性质可知, 这样得到的矩阵A 的行列式为1或-1. 例如A = 110 211 322 ?? ? ? ?? , |A| = -1. (3) y1 =x1A = (1, 3, 20) 110 211 322 ?? ? ? ?? = (67, 44, 43), y2 =Ax2 = (9, 15, 14) 110 211 322 ?? ? ? ?? = (81, 52, 43). (4) 由(A, E) = 110100 211010 322001 ?? ? ? ?? ????→ 初等行变换 100021 010121 001111 - ?? ? - ? -- ?? 可得A-1= 021 121 111 - ?? ? - ? -- ?? . 这就是说, 接收方收到的密文是67, 44, 43, 81, 52, 43. 要还原成明文, 只要计算(67, 44, 43)A-1和(81, 52, 43)A-1,再对照表9“翻译”成单词即可. 【模型分析】如果要发送一个英文句子, 在不记标点符号的情况下, 我们仍然可以把句子(含空格)从左到右每3个字符分为一组(最后不足3个字母时用空格补上). 【模型检验】(67, 44, 43)A-1=(1, 3, 20), (81, 52, 43)A-1 = (9, 15, 14). 参考文献 杨威,高淑萍, 线性代数机算与应用指导,西安: 西安电子科技大学出版社, 2009. 页码: 98-102. Matlab实验题 按照上面的加密方法, 设密文为: 112, 76, 57, 51, 38, 18, 84, 49, 49, 68, 41, 32, 83, 55, 37, 70, 45, 25,问恢复为原来的信息是什么?

希尔密码黄泉整理

【希尔密码】——加密和解密 首先了解一下希尔密码,它是一种矩阵乘法密码,包括替换密码。每个字母当做26进制数字,A=0,B=1,C=2... ...Z=25 前面很简单,接着一串字母当成N维向量,跟N*N的密钥矩阵相乘,最后结果MOD26. MOD(X,Y)就是算X除以Y的余数,MOD26就是此数除以26得到的余数。 一、加密 需要明文和矩阵密钥 这里假设明文为WANG,密钥为1 2 5 7 先把数字密钥1 2 5 7,在方格里排列: 2 7 1 5 然后把W ANG所对应的数字——A=0,B=1,C=2... ...Z=25 W A N G 220 13 6 带入密钥矩阵 |2 7| |1 5| 根据希尔密码加密算法的公式:XmodY得出密文: 先加密W A |2 7| |22| W=2*22+7*0=44 44mod26=18 根据A=0,B=1,C=2... ...Z=25 得出18 对应的字母是S |1 5| |0| A=1*22+5*0=22 22mod26=22 根据A=0,B=1,C=2... ...Z=25 得出22对应字母是W 接着N G 的加密 |2 7| |13| N=2*13+7*6=82 82mod26对应字母E |1 5| |6| G=1*13+5*6=43, 43mod26=17对应字母R 所以W ANG希尔加密后的密文为SWER

接下来是解密 希尔密码的逆矩阵算法公式为: |A B| =1/(AD-BC)* |D -B| |C D| |-C A| 继续用密文SWER来解明文 密钥矩阵|2 7| |1 5| AD-BC=2*5-1*7=3 (3*X)MOD26=1 则X=9(3*9=27,27-26=1) 那么|2 7| |1 5|逆矩阵为 9*| 5 -7| |-1 2| SWER的矩阵加密后为18,22 4,17 带入逆矩阵公式—— 9*|5 -7| | 18|S= 9*(5*18-7*22)=-576,-576mod26=22对应字母W |-1 2| |22|W=9*(-1*18+2*22)=234, 234mod26=0 对应字母A 由此,SW明文为W A 那ER就不仔细解了,结果为NG 另PS:密文若长,将其两两分开,若密文为奇数,多出一个字母,一般忽略或可以直接填充字母,写成两个进行加密。

HILL密码——密码学

Hill 密码 Hill 体制是1929年由Lester S.Hill 发明的,它实际上就是利用了我们熟知的线性变换方法,是在26Z 上进行的。Hill 体制的基本思想是将n 个明文字母通过线性变换转化为n 个密文字母,解密时只需做一次逆变换即可,密钥就是变换矩阵。 设明文n n Z m m m m 2621),,(∈?+=,密文n n Z c c c c 2621),,.,(∈?=,密钥为26Z 上的 n n ?阶可逆方阵n n ij k K ?=)(,则 26mod 26 mod 1-==cK m mK c 解密:明文加密:密文 具体过程: 1、 假设要加密的明文是由26个字母组成,其他字符省略。 2、 将每个字符与0-25的一个数字一一对应起来。(例如:a/A —0,b/B —1,……z/Z — 25)。 3、 选择一个加密矩阵n n A ?,其中矩阵A 必须是可逆矩阵,例如????????????? ???=1522 71321021 23916296101571823055117A 4、 将明文字母分别依照次序每n 个一组(如果最后一组不足n 个的话,就将其补成n 个),依照字符与数字的对应关系得到明文矩阵ming n n len ?/。 5、 通过加密矩阵A ,利用矩阵乘法得到密文矩阵mi n n len ?/= ming n n len ?/?n n A ?mod 26; 6、 将密文矩阵的数字与字符对应起来,得到密文。 7、 解密时利用加密矩阵的逆矩阵1 -A 和密文,可得到明文。 实例 随机产生一个5阶加密方阵??????? ?????? ???=152271321021 23916296101571823055117A

希尔密码

希尔密码就是矩阵乘法密码,运用基本矩阵论原理的替换密码。每个字母当作26进制数字:A=0, B=1, C=2... 一串字母当成n维向量,跟一个n×n的密钥矩阵相乘,再将得出的结果模26。希尔密码的优点是完全隐藏了字符的频率信息,弱点是容易被已知明文攻击击破。 加密 例如:密钥矩阵 1 3 0 2 明文:HI THERE 去空格,2个字母一组,根据字母表顺序换成矩阵数值如下,末尾的E为填充字元: HI TH ER EE 8 20 5 5 9 8 18 5 HI 经过矩阵运算转换为 IS,具体算法参考下面的说明: |1 3| 8 e1*8+3*9=35 MOD26=9 =I |0 2| 9 e0*8+2*9=18 MOD26=18=S 用同样的方法把“HI THERE”转换为密文“IS RPGJTJ”,注意明文中的两个E分别变为密文中的G和T。 解密 解密时,必须先算出密钥的逆矩阵,然后再根据加密的过程做逆运算。 逆矩阵算法公式: |A B| = 1/(AD-BC) * | D -B| |C D| |-C A| 例如密钥矩阵= |1 7| |0 3| AD-BC=1*3-0*7=3 3*X=1 mod26 所以 X=9 因此 |1 7| 的逆矩阵为: 9 * |3 -7| |0 3| |0 1| 假设密文为“FOAOESWO” FO AO ES WO

6 1 5 23 15 15 19 15 9* |3 -7| | 6| = 9*(3*6-7*15)=-783 mod26 = 23=W |0 1| |15| = 9*(0*6+1*15)= 135 mod26 = 5 =E 所以密文“FOAOESWO”的明文为“WEREDONE”

Hill密码加密的密文破译

Hill密码加密的密文破译 姓名:谭周兴学号:13091076 明文:breathtaking 密文:RUPOTENTOIFV Hill密码:将明文的每个字母当作26进制数字:A=0, B=1, C=2... 一串字母当成n 维向量,跟一个n×n的矩阵M相乘,再将得出的结果MOD26,得到密文。密钥矩阵M必须是在Z26上可逆才能译码。 明文对应的数字:1,17,4,0,19,7,19,0,10,8,13,6 密文对应的数字:17,20,15,14,19,4,13,19,14,8,5,21 分析:一共有12位数字,则密钥矩阵可能是1*1、2*2、3*3、4*4、6*6、12*12(为12的因子)维的。根据已有的明密文不能破译4*4及其以上的密钥矩阵,另外明文里面含有0,从而排除1*1的情况,因而考虑2*2阵和3*3阵。 1、2*2矩阵: 将明文按行写成一些2*2矩阵,如A1=[117 40 ],B=[1720 1514 ]。A1M(mod26)=B,矩阵 A1在实数域内是可逆矩阵,判断A1在Z26上是否可逆,计算det(A1)(mod 26)=10,与26不互素,故A1不可逆,M无法根据A1得到。 继续上述步骤,A2=[40 197 ]。计算det(A2)(mod 26)=2,与26不互素,故A2不可逆,M无法根据A2得到。 det(A3)(mod 26)=23,和M互素,如图计算A3的代数余子式A*=(detA)*A-1mod26(矩阵元素元素属于实数域)和A-1.A-1=A*|A|-1(这里的矩阵元素和行列式的逆属于Z26.|A|-1计算用如下代码即可: #include void main() {int i,a; scanf("%d",&a); for(i=0;i<=25;i++){ if((a*i)%26==1) break;} printf("%d",i);} 算得M=[13 1;12 9]。但经过验算发现该密钥对于(1,17),(4,0)等加密出来的密文与题目提供的密文不同,因此M不是我们所需要的。 用上述步骤算出的M没有一个满足条件,故考虑3*3矩阵 2、3*3矩阵: A1=[1 17 4;0 19 7;19 0 10],det(A1)mod26=19.用上述程序算得19的逆为11.M=[3 21 20;4 15 23;6 14 5],如下图所示:

hill密码体制

Hill密码是一种简单的加密手段。 优点是: 可以实现同一个字母在不同的上下文中,对应密文中不同的字母。 缺点是: 加密前明文是几个字母,加密后还是几个字母。容易被穷举。 以下,我们都用英文字母举例,比较简单明了 下面简要介绍一下加密过程 首先,要将26个字母,编号,例如 a:1b:2c:3d:4e:5f:6g:7h:8i:9j:10k:11l:12 m:13 n:14o:15p:16q:17r:18s:19t:20u:21v:22w:23x:24y:25 z:0 其次,确定密钥,在这里其实就是加密矩阵,Hill2密码对应的是一个二阶矩阵,Hill n密码对应的就是一个N接矩阵了, 我们这里取二阶,比较简单。如: 取个加密矩阵A=(1 2;0 3) 说明:大家凑合着看啊,其实是 1 2是一行,0 3是一行。画个矩阵太麻烦了 以下说明,矩阵里加了分号就表示换行哈

有了字母编号表和密钥就万事具备了。 我们来将下面一段字母加密 woshigetiancai 首先,将字母两两分组wo ,sh, ig, et, ia, nc, ai。 这里刚好是偶数个字母,如果是奇数个,就重复一次,最后一个字母,凑成偶数。 其次,查询字母标号表,将分好组的字母,写成向量形式,其实就是写成一个1*2的矩阵(我就讨厌,那些书, 明明就是个1*2矩阵,偏偏要要定义成向量,增加无谓的概念):如 w 对应23,o对应15,写成向量(23;15)(这个是竖着写的,实在不好意思,矩阵实在不太好画,手头没matlab) 以此类推,得到7组向量,分别是 wo对应的(23;15) sh对应的(19;8) ig对应的(9;7) et对应的(5;20) ia对应的(9;1)nc 对应的(14;3) ai对应的(1;9) 将这些向量分别左乘密钥注意:这里矩阵这个东西比较麻烦,不符合乘法交换律,两个矩阵左乘和右乘的结果是不一样的 左乘就是将密钥放到左边,右边是向量A*P(向量) 又得到7组向量,分别是 (38;45),(27;24),(16;24),(25;60),(10;3),(17;9),(10;27) 这时候,我们就遇到了一个问题,我们定义的字母标号表是0~25的,这里又是45 ,又是60的,怎么办?? 没关系,遇到比25大的,我们就减26 知道,让数字落在0~25之间就可以了 例如原向量(38;45)我们就变成了(12;19),这样就落在我们的字母标号表里了,很简单吧 以此类推,最后得到的7组向量就变成了 (12;19),(1;24),(14;24),(25;8),(10;3),(17;9),(10,1)

相关文档