前書き
ヒル暗号は、1929年にレスターS.ヒルによって発明された基本的な行列理論の原理を使用する代替暗号です。
各文字は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 13 14 17 12 0 11 20 13 8 21 4 17 18 8 19 24
次に、2つずつ行列形式に書き込みます:
行ってみたのですが、足りない場合は先生が質問をまとめられませんか???このようにして、0処理を行います。 -
次に、暗号化を開始します。
暗号文マトリックスを取得したら、グループに対応するベクトルに従って文字に変換します
。IKBX 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のヒル暗号で暗号化され、暗号文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を取得し、暗号文を解読するだけです