0

これは私がしなければならないことです:

英語テキスト用の Vigenere 暗号のバージョンの実装であるスクリプトを Python で作成します。スクリプトでは小文字と大文字を区別する必要があります (つまり、暗号化キーと平文は小文字と大文字で構成できますが、暗号文は大文字にする必要があります)。文字に加えて、平文には他の 4 つの文字があります: コンマ (26)、ドット (27)、ダッシュ (28)、アンダースコア (29) 暗号化関数を mod 30 未満に変更します。

スクリプトは、標準入力から読み取り、標準出力に書き込む必要があります。サイズ k の暗号化キーの入力をユーザーに求める必要があります。標準の Vigenere 暗号のように、キーを繰り返すことはできません。代わりに、ブロック暗号ベースのアイデアに従います。基本的に、平文と暗号文には、鍵のサイズと同じサイズ k のブロックがあります。鍵の長さが平文より短い場合は、前のブロックのブロックサイズ k の暗号文が鍵に連結されます。キーワードが「カーボンデール」で k = 10 の場合の例を次に示します。

Plaintext :  SIU_CS-Department_is_the_best
 Key       :  CarbondaleUIHAQBBDPTUZ,MUOUCX
 Ciphertext:  UIHAQBBDPTUZ,MUOUCXHTODQTPYUM

そこで、「、」「。」の余計な部分の対処法を知りたいです。「/」「_」。これは、暗号化を行っている関数です。

a = len(key)

b = len(text)

while (len(key1) <= len(text1)):

    for i in range(0,a):
        num1 = ord(text1[i+var])%97
        num2 = ord(key1[i+var])%97
        num3 = num1+num2
        if (num3 > 25):
            encr.append(num3%25)
        else:
            encr.append(num3)
        i + 1

    for i in range(0,a):
        encr1.append(chr(encr[i+var]+97))
        i + 1

    for i in range(0,a):
        key1.append(encr1[i+var])
        i + 1
    var = var + a
4

1 に答える 1

0

あなたのコードには現在、次の問題があります(投稿したコードの前に、、、、が発生すると想定していvar = 0ます):encr = []encr1 = []key1 = list(key)text1 = list(text)

  1. whileキーがプレーンテキストよりも長い場合、ループは開始されず、それ以外の場合は終了しません。短縮することはありません(text1そうすると、インデックス作成が中断されます)。
  2. forループ内でカウンターを手動でインクリメントする必要はありません(必要に応じて、i + 1割り当てなしでは実質的に何もしませんi += 1)。
  3. mod( %) を使用する場合は、次のようにチェックする必要はありませんnum3 < 25。と
  4. それらを含める場合は、リストする余分な文字が指定されたものと同じではないことに注意してください ( "/" != "-")。

ordandを使用するのではなく、chr循環する独自のアルファベットを作成します。

from string import ascii_uppercase

alphabet = list(ascii_uppercase) + [",", ".", "-", "_"]

「標準」Vigenère のこの実装が役立つ場合があります。

from itertools import cycle

def vigenere(plain, key, alphabet):
    for p, k in zip(plain, cycle(key)):
        index = alphabet.index(p) + alphabet.index(k)
        yield alphabet[index % len(alphabet)]

変更した実装の疑似コードを次に示します。

convert all text (plain, key) to upper case
create a list to hold output
split plain into blocks of length len(key)
for each block in plain:
    if it's the first block, use key to encode
    otherwise, use the last block of encoded text in output 
于 2014-02-01T11:04:56.993 に答える