2017-03-01 14 views
0

ランダム置換暗号を書いています。通常の文章の作成に使用するとうまくいきます。しかし、私が 'abbcccddddeeeee'をテストしようとすると、私は 'G H H I I J J J K K K K K K'のようなものを得るでしょう。サイクル中の各文字の「キー」または「変数」が変更されるようにコードを変更することはできますが、同じ文字は他の文字に対応していません。ランダム置換暗号(Python)

import random 
intext = raw_input("Enter a message to encrypt: ") 
intext = intext.upper() 
key = random.randint(0,27) 
vari = random.randint(0,27) 
def randomsub(intext): 
    outtext = [] 
    intext = intext.upper() 
    for c in intext: 
     num = ord(c) 
     if num >= ord('A') and num <= ord('Z'): 
      num = num - ord('A') 
      num = num + (key + vari) % 26 
      num += ord('A') 
      outtext.append(chr(num)) 
    return ' '.join(outtext) 
print randomsub(intext) 
+1

あなたはその結果に何が間違っていますか? –

+0

あなたのコードが今のところ、あるいはあなたのコードを望むように、復号化がどのように動作するはずですか? – user2357112

+0

mmm、[enigma machine](https://en.wikipedia.org/wiki/Enigma_machine)のように? – Copperfield

答えて

0

わからないが、なぜあなたは両方keyvari持っているが、ランダム性は、あなたの関数内であるべきであり、randintへの呼び出しの少なくとも一方がループ内でなければなりません。 keyにユーザー提供の入力を作成し、それをシードに使用することをお勧めします。randomそうすれば、同じテキストと同じキーで同じ出力を得ることができますが、テキストの重複する文字は結果によって異なります。最後に、出力を文字にする場合は、keyvarinumを追加する括弧を展開する必要があります。keyに変更した場合は、num = (num + vari) % 26を指定してください。

+0

あなたの提案を実装したとき、私はランダムな「RTVJRDMWISWWRFP」のような答えを得ました。しかし、私が必要とするのは、AをGに置き換えると、AのすべてのインスタンスがGである必要があるという解です。 "シードランダム"で? – DoNotPutMeInABox

+0

@DoNotPutMeInABox「シードランダム」とはどういう意味ですか? [ドキュメントはあなたの友人です](https://docs.python.org/2/library/random.html#random.seed)。プログラムを実行するときにシード値を再使用した結果、結果は変化しますが、完全に再現可能です。暗号化の目的では、すべての 'A'を出力側の文字にマップするよりも優れています。優れた暗号学者は、英語の手紙の周波数をすばやく拾うだろうが、メッセージのどこにあるかによって、文字 'E'を 'X'、 'A'、W 'より挑戦的。 – pjs