前書き
アフィン暗号は、単一テーブル暗号化の一種です。アルファベットシステムのすべての文字は、数値に対応する、または文字に戻る単純な数式によって暗号化されます。これは、暗号化機能を使用して1文字を1文字に暗号化する置換パスワードです。
キースペース
文字セットmは多くの場合26です
gcd(a、m)= 1であるため、aの値空間はφ(m)= 12、
b∈[0,26)
キースペースは26×12 = 312なので、平文の一部がわかっている場合にのみ攻撃できます。
暗号化機能
暗号化関数はE(x)=(ax + b)(mod m)です。ここで、aとmは互いに素であり、mは文字セットのサイズです。
(たとえば、26はコードとして26文字を意味します。mが26の場合、aは1、3、5、7、9、11、15、17、19、21、23、25のいずれかでなければなりません)
復号化機能
復号化関数はD(x)= a ^ -1(x-b)(mod m)です。ここで、a-1はZmグループのaの逆数です。
暗号化機能から簡単に導き出すことができます。
a⋅x+
b≡ymodma⋅x≡(y-b)modmx≡a^-1⋅
(y-b)mod m
逆数
グループG内の要素aは、G内に一意の逆元a`を持ち、プロパティaa` = a`a = eを持ちます。ここで、eはグループの単位元です。
次に例を示します。7* 15 = 1 mod 26
15は、7の乗法逆元です。
例
キーK =(7,3)と仮定して、アフィン暗号システムを使用して単語hotを暗号化し、取得した暗号文を復号化します。
暗号化:
暗号化関数:E(x)=(7x + 3)(mod 26)
上記の英語の文字コーディングテーブルに従ってXを取得します
復号化:
復号化関数:
aの逆数を15
D(x)= 15(x-3)(mod 26)として見つけます
コード(Pythonバージョン)
'''
仿射密码K = (a,b)
加密函数是E(x)= (ax + b) (mod 26)
解密函数为D(x) = (a^-1)(x - b) (mod 26),其中a^-1是a的乘法逆元
'''
# 加密
def enc(a, b, e):
c = []
for i in e:
temp = ((ord(i) - 97) * a + b) % 26 + 97 # a的ascii码是97
c.append(chr(temp))
print(''.join(c).upper())
# 遍历得到a的乘法逆元
def get_multiplicative_inverse(a):
for i in range(1, 27):
if a * i % 26 == 1:
return i
# 解密
def dec(a, b, d):
a_mul_inv = get_multiplicative_inverse(a)
p = []
for i in d:
temp = (((ord(i) - 97) - b) * a_mul_inv) % 26 + 97
p.append(chr(temp))
print(''.join(p).upper())
if __name__ == "__main__":
a, b = 7, 3
e = 'hot'
# d = 'axg'
enc(a, b, e)
# dec(a, b, d)