希尔算法的加密与解密(希尔密码的加密)

简介

希尔密码是运用基本矩阵论原理的替换密码,由Lester S. Hill在1929年发明。

每个字母当作26进制数字:A=0, B=1, C=2... 一串字母当成n维向量,跟一个n×n的矩阵相乘,再将得出的结果模26。(注意用作加密的矩阵(即密匙)在 必须是可逆的,否则就不可能解码。只有矩阵的行列式和26互质,才是可逆的。)

例子:

用希尔密码对明文串 x = EastChinaNormalUniversity 进行加密,

希尔算法的加密与解密(希尔密码的加密)(1)

密钥矩阵

加密:

密文向量 = 明文向量 * 密钥矩阵 (mod 26)

1. 先将明文串对应英文字母编码表进行数字转化 4 0 18 19 2 7 8 13 0 13 14 17 12 0 11 20 13 8 21 4 17 18 8 19 24

希尔算法的加密与解密(希尔密码的加密)(2)

两两一组写成矩阵形式

我去,发现少了一个,老师出题就不能凑个整吗??? 这样子,我们做补0处理。

2. 接下来开始加密

希尔算法的加密与解密(希尔密码的加密)(3)

得到密文矩阵后,按照分组对应的向量转成字母:

IK BX NB DH NN JD YE SR OB KB UJ HL W

python实现:

import numpy as np def encode(string, size): # 转换小写字母 if not string.islower(): string = string.lower() # 分成 size个 字的分段 blocks = [string[i:i size] for i in range(0, len(string), size)] # 明文字串与密钥矩阵阶数不整除。。字串补a if len(blocks[-1]) != size: blocks[-1] = blocks[-1].ljust(size,'a') # 将 a-z 编码为 0-25 temp = np.array([list(map(ord, block)) for block in blocks]) - ord('a') # print(temp) return temp def analysis(crypter, code): return ((crypter @ code.T) % 26).T ord('a') # 要加密的信息 encode_msg = 'eastchinanormaluniversity'.lower() print('待加密的信息:' encode_msg) # 密钥 encryption_matrix = np.array([[2, 5], [9, 5]]) print('密钥:') print(encryption_matrix) # 加密代码 encrypted_code = analysis(encryption_matrix, encode(encode_msg, 2)) # 密文 Decryption_matrixtext = ''.join(map(chr, encrypted_code.ravel())) print("密文:" Decryption_matrixtext[:len(encode_msg)].upper()) """ 待加密的信息:eastchinanormaluniversity 密钥: [[2 5] [9 5]] 密文:IKBXNBDHNNJDYESROBKBUJHLW """

解密:

不会求逆的参考:同余方程、欧拉函数、乘法逆元、定义在Zm上的矩阵求逆

解密和加密类似,先通过刚刚的方法计算出 模 m 的逆矩阵,然后用 A−1 再进行解密:

分析与破解

例子:

假设已知明文friday利用n=2的希尔密码加密,得到密文VYUZSM,求秘钥K.

n等于2,说明把friday分成3段,矩阵是2*2的

根据字母与整数的对应关系:

(5,17)---->(21,24),

(8,3)---->(20,25),

(0,24)—>(18,12),得到

希尔算法的加密与解密(希尔密码的加密)(4)

用(0,24)—>(18,12)验证K:

希尔算法的加密与解密(希尔密码的加密)(5)

正确!得到密钥K就随便破解密文了

,

免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com

    分享
    投诉
    首页