소개
Hill 암호는 1929 년 Lester S. Hill이 발명 한 기본 행렬 이론의 원리를 사용하는 대체 암호입니다.
각 문자는 26 진수로 처리됩니다. A = 0, B = 1, C = 2 ... 문자 스트링은 n × n 행렬을 곱한 n 차원 벡터로 처리되며 결과는 다음과 같습니다. 모듈로 26. (암호화에 사용되는 행렬 (즉, 키)은 반전 가능해야합니다. 그렇지 않으면 디코딩이 불가능합니다. 행렬의 결정자와 26 코 프라임 만 반전 가능합니다.)
예:
Hill 암호를 사용하여 일반 텍스트 문자열 x = EastChinaNormalUniversity ,
주요 매트릭스 :
암호화 :
암호문 벡터 = 일반 텍스트 벡터 * 키 행렬 (mod 26)
-
먼저 숫자 변환을 위해 영문자 코드 테이블에 해당하는 일반 텍스트 문자열을 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 처리합니다. -
다음으로 암호화를 시작합니다.
암호문 행렬을 얻은 후 그룹에 해당하는 벡터에 따라 문자로 변환합니다.
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 키를 얻고 암호문을 해독하십시오.