Vigenere

こちら

https://classicalciphers.wordpress.com/2018/08/16/rot-2/

で作ったROTの関数を使って、Vigenereに発展させます。ROTの時と同様にまず一文字のVigenere関数を作成します。

def vig_a(c,k,type):
    t=list_A.find(k)
    if t<0:
        t=list_a.find(k)
    if t<0:
        t=list_0.find(k)
    if t<0:
        t=0
    if type=="d":
        t=-t
    return rot_a(c,t)

引数のtypeをdにしたときはDecode時の計算、その他のときはEncode時の計算としています。

これを使って、Encode時の関数は

def vig_e(c,k):
    l_c=len(c)
    l_k=len(k)
    p=""
    for i in range(l_c):
        s=k[i % l_k]
        p+=vig_a(c[i],s,"e")
    return p

Decode時の関数は

def vig_d(c,k):
    l_c=len(c)
    l_k=len(k)
    p=""
    for i in range(l_c):
        s=k[i % l_k]
        p+=vig_a(c[i],s,"d")
    return p

あとでvig_aにkeyed alphabetやbeaufortも対応させれば、keyed Vigenere とBeaufortも同様のコードでかけるはず。そして同様のコードでいいということはもう少し抽象化して効率的なコードに直せるはず、とは考えていますが、また後日。

広告

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト /  変更 )

Google フォト

Google アカウントを使ってコメントしています。 ログアウト /  変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト /  変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト /  変更 )

%s と連携中