Hill cifrado, descifrado y craqueo de contraseñas

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:
Inserte la descripción de la imagen aquí

cifrado:

Vector de texto cifrado = vector de texto plano * matriz de claves (mod 26)

  1. 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 :
    Inserte la descripción de la imagen aquí
    Fui y encontré. Si falta uno, ¿no puede el maestro armar una pregunta? ? ? De esta forma, haremos 0 procesamientos.

  2. A continuación, inicie la encriptación. Después de
    Inserte la descripción de la imagen aquí
    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
Inserte la descripción de la imagen aquí
segundo orden real es:
Inserte la descripción de la imagen aquí
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
Inserte la descripción de la imagen aquí
Use (0,24) -> (18,12) para verificar K:
Inserte la descripción de la imagen aquí
¡correcto! Obtenga la clave K y simplemente descifre el texto cifrado

Supongo que te gusta

Origin blog.csdn.net/Pioo_/article/details/110490888
Recomendado
Clasificación