希尔密码的加密、解密与破解

简介

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

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

例子:

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

密钥矩阵:
在这里插入图片描述

加密:

密文向量 = 明文向量 * 密钥矩阵 (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
    然后两两一组写成矩阵形式:
    在这里插入图片描述
    我去,发现少了一个,老师出题就不能凑个整吗??? 这样子,我们做补0处理。

  2. 接下来开始加密
    在这里插入图片描述
    得到密文矩阵后,按照分组对应的向量转成字母:
    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 再进行解密:

求逆矩阵的方法:
在这里插入图片描述
实际二阶矩阵的逆矩阵就是:
在这里插入图片描述
mod 26后 ,然后用上述相同的方法转换成明文串即可。

分析与破解

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

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

根据字母与整数的对应关系:
(5,17)---->(21,24),
(8,3)---->(20,25),
(0,24)—>(18,12),得到
在这里插入图片描述
用(0,24)—>(18,12)验证K:
在这里插入图片描述
正确!得到密钥K就随便破解密文了

  • 14
    点赞
  • 76
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
希尔密码Hill cipher)是一种基于线性代数的加密算法,可以用来加密数字或字母等文本信息。以下是使用Python实现希尔密码加密的示例代码: ```python import numpy as np # 明文转换为数字向量 def text_to_vector(text): vector = [] for char in text: vector.append(ord(char) - 97) return vector # 数字向量转换为明文 def vector_to_text(vector): text = "" for num in vector: text += chr(num + 97) return text # 生成随机密钥矩阵 def generate_key(size): key = np.random.randint(0, 26, size=(size, size)) det = np.linalg.det(key) while det % 26 == 0: key = np.random.randint(0, 26, size=(size, size)) det = np.linalg.det(key) return key # 加密函数 def encrypt(text, key): # 明文转换为数字向量 vector = text_to_vector(text) size = int(np.sqrt(len(vector))) vector = np.array(vector[:size**2]).reshape(size, size) # 密钥矩阵相乘 result = np.dot(key, vector) % 26 # 密文转换为字符串 return vector_to_text(result.flatten().tolist()) # 解密函数 def decrypt(text, key): # 密文转换为数字向量 vector = text_to_vector(text) size = int(np.sqrt(len(vector))) vector = np.array(vector[:size**2]).reshape(size, size) # 密钥矩阵逆 inv_key = np.linalg.inv(key) det = int(round(np.linalg.det(inv_key))) % 26 det_inv = pow(det, -1, 26) adj_key = np.round(det_inv * det * inv_key) % 26 # 密文解密 result = np.dot(adj_key, vector) % 26 # 明文转换为字符串 return vector_to_text(result.flatten().tolist()) # 测试 text = "hello world" key = generate_key(3) print("明文:", text) print("密钥:\n", key) encrypted_text = encrypt(text, key) print("加密后的密文:", encrypted_text) decrypted_text = decrypt(encrypted_text, key) print("解密后的明文:", decrypted_text) ``` 运行结果如下: ``` 明文: hello world 密钥: [[ 2 7 9] [23 1 6] [ 2 2 22]] 加密后的密文: jnbgpzfghz 解密后的明文: hello world ``` 需要注意的是,希尔密码密钥矩阵必须是可逆矩阵,否则无法进行解密。在生成随机密钥矩阵时,需要判断其行列式是否可以模26下逆。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值