アフィン暗号の暗号化と復号化

前書き

アフィン暗号は、単一テーブル暗号化の一種です。アルファベットシステムのすべての文字は、数値に対応する、または文字に戻る単純な数式によって暗号化されます。これは、暗号化機能を使用して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)

おすすめ

転載: blog.csdn.net/Pioo_/article/details/110235362
おすすめ