Hill 암호 암호화, 암호 해독 및 크래킹

소개

Hill 암호는 1929 년 Lester S. Hill이 발명 한 기본 행렬 이론의 원리를 사용하는 대체 암호입니다.

각 문자는 26 진수로 처리됩니다. A = 0, B = 1, C = 2 ... 문자 스트링은 n × n 행렬을 곱한 n 차원 벡터로 처리되며 결과는 다음과 같습니다. 모듈로 26. (암호화에 사용되는 행렬 (즉, 키)은 반전 가능해야합니다. 그렇지 않으면 디코딩이 불가능합니다. 행렬의 결정자와 26 코 프라임 만 반전 가능합니다.)

예:

Hill 암호를 사용하여 일반 텍스트 문자열 x = EastChinaNormalUniversity ,

주요 매트릭스 :
여기에 사진 설명 삽입

암호화 :

암호문 벡터 = 일반 텍스트 벡터 * 키 행렬 (mod 26)

  1. 먼저 숫자 변환을 위해 영문자 코드 테이블에 해당하는 일반 텍스트 문자열을 4 0 18 19 2 7 8 13 0 1314 17 12 0 11 20 13 8 21 4 17 18 8 19 24
    로 변환 한 다음 2 x 2를 행렬 형식으로 씁니다. :
    여기에 사진 설명 삽입
    가서 찾았어요 하나 빠졌는데 선생님이 질문을 할 수 없나요? ? ? 이런 식으로 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을 사용하여 복호화합니다.

역행렬을 찾는 방법 :
여기에 사진 설명 삽입
실제 2 차 행렬의 역행렬은
여기에 사진 설명 삽입
mod 26이고 위와 같은 방법을 사용하여 일반 텍스트 문자열로 변환합니다.

분석 및 균열

예 :
알려진 평문 금요일이 n = 2의 Hill 암호로 암호화되고 암호문 VYUZSM이 획득되고 비밀 키 K가 획득되었다고 가정합니다.

n은 2와 같으며 금요일이 3 개의 세그먼트로 나뉘고 행렬이 2 * 2임을 나타냅니다.

문자와 정수 사이의 대응에 따르면 :
(5,17) ----> (21,24),
(8,3) ----> (20,25),
(0,24) —> (18 , 12),
여기에 사진 설명 삽입
Use (0,24) —> (18,12)를 사용하여 K :
여기에 사진 설명 삽입
맞습니다! K 키를 얻고 암호문을 해독하십시오.

추천

출처blog.csdn.net/Pioo_/article/details/110490888