简述
加密方式为:
密钥矩阵 * 明文向量然后取模26
解密方式为:
密钥矩阵的逆矩阵 * 密文向量然后取模26
用公式描述即为:
**C=E(K,P)=KPmod26**
其中
C为加(解)密后的文字
E为hill密码算法
K为key密钥
P为待加(解)密的文字
字母表(方便对照免得脑子里老唱字母歌)
a-0 b-1 c-2 d-3 e-4 f-5 g-6 h-7 i-8 j-9 k-10 l-11
m-12 n-13 o-14 p-15 q-16 r-17 s-18 t-19 u-20
v-21 w-22 x-23 y-24 z-25
本文章围绕下边的例子进行说明此加密算法
例子:
密钥为:
明文为:abcd
基础知识回顾
一、行列式是什么?
行列式就是一个和矩阵很像的玩意,而且能算出一个结果,比如下图这玩意,这个矩阵
它的行列式就是这个(好像看上去没啥大区别啊)
对于一个2阶的行列式我们可以利用对角线方法计算这个行列式的结果为:11*7-8*3=53
二、什么是n维向量
我们都知道空间直角坐标系有三个方向
x方向,y方向,z方向
坐标为(x,y,z)
这里头的x和y还有z就是向量,代表一个方向的量,所以我们说这个坐标是一个三维向量。
因为x,y,z的取值是实数,所以我们规定这个三维向量的数领为实数域。
在线性代数中,为了方便表示,就是用a来代替
比如三维的行向量
(a1,a2,a3)
三维的列向量就是
那么n维的行向量就是 (a1,a2,a3,a4……an)
n维的列向量就不在赘述了
三、算了太多基础知识了具体各位可以自己去查询一些知识来回忆,我只说一下还要回忆哪些东西
1.一个矩阵的伴随矩阵怎么求
2.逆矩阵又是什么
3.看懂逆矩阵求法公式:
加密
首先给我们的密钥是一个2*2的矩阵也可以说是一个2阶方阵
题目给的明文是abcd,我先把它转成数字就是0123
我们知道两个矩阵相乘,只有当左边矩阵的列数=右边矩阵的行数时,才能相乘。
根据算法描述,是密钥矩阵与明文向量进行相乘
这里我们为了能够让明文向量与密钥矩阵相乘,不能张口就来。
比如直接来一个四维行向量(0,1,2,3),这相当于是一个4*1的矩阵,不能直接与提给的2*2的方阵进行乘法
我们需要对提给的明文进行分组
两个一组,这样我就有了两个列向量
(我也不知道为什么第二个图那么大 ╮(╯v╰)╭ )
他们相当于是2*1的矩阵,两行一列
密钥矩阵2*2是可以和他们相乘的
那如果你说为什么不搞两组行向量
行向量肯定不行,因为搞就是
1*2的矩阵了无法进行乘法,所以不行
那么进行加密
所以加密结果就是 ihub
解密
根据密钥矩阵,我们可以得到它的行列式
其结果为:53
因为密钥矩阵是二阶方阵所以伴随矩阵就是
左对角线互换,右对角线的数字都添加负号
即
这里的伴随矩阵中有负数,我们需要加一个26,不要问我为什么,问就是加,加就完了,因为最后的结果总是要和26取模运算的所以加一个26不会影响结果,所以加就完事了。
然后结果就是
根据公式我们来求逆矩阵
很不好搞,这里有分数,我好不容易心动一次却让我输的如此彻底,焯!没事根据一个大佬说的,我们需要来计算一个数来乘上去,消掉这个分数。
首先我们需要记住一个数就是27,为什么要记住因为这是别人推出来的一个关键数
好知道了27,我们需要用27和密钥行列式的值53来求出他们的最小公倍数,这是小学的算法,先用辗转相除法求出最大公因数,然后用27*53再除以最大公因数就可以求出最小公倍数,那么结果就是1431。
你问我辗转相除法是什么,
说真的,要不是为了搞懂这个密码,我也不会去学习这个玩意
我最开始也忘了,我觉得自己连小学生都不如了
现在我们用这个1431来消去分母
这样就很nice了,右边的这个算式,就是一个逆矩阵,我们不要先算出来不然很费脑子
那么直接进行解密
OK完结了,文章写了差不多2个小时,有问题留言。