0

現在、暗号化プロジェクトに取り組んでおり、プログラムに帝王切開機能を正しく実装しましたが、別の暗号化方法を実装する必要があります。

手順: 疑似ランダム オフセットと呼ばれる修正版を使用します。小冊子を事前に配布する必要はありません。パスワードだけです。パスワードは短く、書き留める必要はありません。上記のように、パスワードは、python 乱数ジェネレーターをシードするために使用されます。Caesarian コードから開始する必要がありますが、関数の先頭に 1 つのオフセットを作成する代わりに、1 文字ごとに新しいオフセットを作成します。

以下は、帝王切開のための私のコードです。何が起こっているのかを追うことができるように、コード内のおそらく1文字の例を誰かが提供できますか? 私はpythonが初めてで、まだ学んでいます。

def Caesarian(fin, fout, encrypt_or_decrypt_choice, alphabet):
    # Determine the offset by generating a random number in the correct range.
    # This will be the same random number, if the password sent to random.seed is the same.
    offset = random.randrange(1,len(alphabet))
    if encrypt_or_decrypt_choice=='d':
        offset = -offset
    print "Using the secret offset of", offset

    # Read every line of the input file.
    for line1 in fin:
        # Alter each character of the line1, putting the result into line2.
        line2 = ""
        for c in line1:
            if c in alphabet:
                pos1 = alphabet.find(c)
                pos2 = (pos1+offset)%len(alphabet)
                line2 += alphabet[pos2]
        # Write each resulting line2 to the output file.
        fout.write(line2)
4

1 に答える 1

3

シーザー暗号では、各文字を一定の固定量だけシフトします。

Vigenère 暗号はそれを改良したもので、小さなグループ内の各文字を一定量ずらすことによって行われます。たとえば、キー は123「1 ずつシフトし、次に 2 ずつシフトし、次に 3 ずつシフトしてから繰り返す」ことを意味する可能性があるため、メッセージ「aaaaaa」は「bcdbcd」として暗号化されます。

Vigenère 暗号は、Ceaser 暗号と弱点を共有しています。最も一般的な文字パターンの統計を計算し、それらを使用して、キーのブルート フォース検索を最適化することができます。

構築しているものは、もう少し複雑で、単純なストリーム暗号です。ここでの目標は、各文字を異なる量で暗号化することです。したがって、これはほぼ1 回限りのパッドですが、非常に大きなキーを転送するオーバーヘッドはありません。

次に、Python のrandomモジュールを見てみましょう。

>>> import random
>>> random.choice(range(100))
42
>>> random.choice(range(100))
46
>>> random.choice(range(100))
92

ご覧のとおり、それぞれの値は異なります。Python を再実行すると、別の一連の数値が得られます。数値が本当にランダムである場合、受信者は同じストリームを再作成できないため、この暗号化方法には役に立ちません。

疑似乱数ジェネレーターをシードすると、結果が予測可能になるように初期状態を修正できます。

>>> random.seed(5)
>>> random.choice(range(100))
62
>>> random.choice(range(100))
74

そして、再シードすると、まったく同じ数値が得られます。

>>> random.seed(5)
>>> random.choice(range(100))
62
>>> random.choice(range(100))
74

元のコードを移行するにはoffset、シードの設定に最初の計算を変更してから、各文字のオフセットを更新する必要があります。

(貼り付けたコードを更新する私の試みは次のとおりです):

def streamCipher(fin, fout, encrypt_or_decrypt_choice, alphabet, seed):
    # Seed random with the shared secret
    random.seed(seed)

    # Read every line of the input file.
    for line1 in fin:
        # Alter each character of the line1, putting the result into line2.
        line2 = ""
        for c in line1:
            if c in alphabet:
                # Determine the offset by generating a random number in the correct range.
                # This will return the same sequence of random numbers, if the seed is the same.
                offset = random.randrange(1,len(alphabet))
                if encrypt_or_decrypt_choice=='d':
                    offset = -offset
                pos1 = alphabet.find(c)
                pos2 = (pos1+offset)%len(alphabet)
                line2 += alphabet[pos2]
        # Write each resulting line2 to the output file.
        fout.write(line2)
于 2013-03-25T20:22:51.167 に答える