Introducción
El cifrado Hill es un cifrado alternativo que utiliza los principios de la teoría de matrices básica, inventado por Lester S. Hill en 1929.
Cada letra se trata como un número de base 26: A = 0, B = 1, C = 2 ... Una cadena de letras se trata como un vector n-dimensional, multiplicado por una matriz n × n, y el resultado es módulo 26. (Tenga en cuenta que la matriz utilizada para el cifrado (es decir, la clave) debe ser invertible, de lo contrario será imposible decodificar. Solo el determinante de la matriz y el coprimo 26 son invertibles).
ejemplo:
Utilice la contraseña de Hill para cifrar la cadena de texto plano x = EastChinaNormalUniversity ,
Matriz de claves:
cifrado:
Vector de texto cifrado = vector de texto plano * matriz de claves (mod 26)
-
Primero convierta la cadena de texto sin formato correspondiente a la tabla de códigos de letras en inglés para la conversión de números 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
y luego escriba dos por dos en una forma matricial :
Fui y encontré. Si falta uno, ¿no puede el maestro armar una pregunta? ? ? De esta forma, haremos 0 procesamientos. -
A continuación, inicie la encriptación. Después de
obtener la matriz de texto cifrado, conviértala en letras según el vector correspondiente al grupo:
IK BX NB DH NN JD YE SR OB KB UJ HL W
Implementación de 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
"""
Descifrar
Referencias que no invertirán la inversión de matriz definida en Zm
El descifrado es similar al cifrado. Primero calcule la matriz inversa módulo m con el método que acaba de hacer y luego use A − 1 para descifrar:
El método para encontrar la matriz inversa: la matriz inversa de la matriz de
segundo orden real es:
mod 26, y luego use el mismo método anterior para convertirla en una cadena de texto sin formato.
Análisis y craqueo
Ejemplo:
Supongamos que el viernes de texto plano conocido se cifra con el cifrado Hill de n = 2, y se obtiene el texto cifrado VYUZSM y se obtiene la clave secreta K
n es igual a 2, lo que indica que el viernes se divide en 3 segmentos y la matriz es 2 * 2
Según la correspondencia entre letras y enteros:
(5,17) ----> (21,24),
(8,3) ----> (20,25),
(0,24) -> (18 , 12), obtenga
Use (0,24) -> (18,12) para verificar K:
¡correcto! Obtenga la clave K y simplemente descifre el texto cifrado