-3

26 の可能なキーのそれぞれに対して復号化アルファベットを生成します。

その部分は完了しましたが、辞書にある単語を印刷することはできません。例:「ebv」だけを印刷したい

26 個の可能なキーすべてを出力するのではなく、辞書の単語と一致させるにはどうすればよいですか。

ここに辞書があります: http://www.ics.uci.edu/~kay/wordlist.txt

Alphabet = 'abcdefghijklmnopqrstuvwxyz'  

def rotated_alphabet(key:int) -> str:
    '''produces a rotated alphabet based on key and adds those letters to the end of alphabet'''
    if key > 26:
        key = key % 26
    new_alphabet = ''
    w = Alphabet[0:key]
    x = Alphabet.replace(Alphabet[0:key], new_alphabet)
    return (x + w)

def Caesar_break(cipher:str) ->str:
    infile = open('wordlist.txt', 'r')
    wordlist = []
    possible = []
    decode = []
    words = []
    for str in infile:
        t = str
    for i in range(0, 26):
        p = rotated_alphabet(i).split()
        possible+=p
    for y in possible:
        decrypt = str.maketrans(y, Alphabet)
        decode.append(cipher.translate(decrypt))
    for str in decode:
        s = str
        words.append(s)
    print(words)

Caesar_break('eby')

それは出力します:

['ebv', 'dau', 'czt', 'bys', 'axr', 'zwq', 'yvp', 'xuo', 'wtn', 'vsm', 'url', 'tqk', 'spj', 'roi', 'qnh', 'pmg', 'olf', 'nke', 'mjd', 'lic', 'khb', 'jga', 'ifz', 'hey', 'gdx', 'fcw']
4

1 に答える 1

1

これを解決する標準的なアプローチは次のとおりです。

  1. 単語リストからすべての行を読み取り、それらを辞書に挿入しますdict
  2. 経由でさまざまなシーザー ローテーションを試してください。translate
  3. ローテーションによって辞書から単語が生成された場合 ( decrypt in dictionary)、それを出力します。

より長いテキストの場合は、たとえば単語の少なくとも半分が辞書に含まれているかどうかを確認したい場合があります。小文字/大文字の問題や改行文字などに注意してください! - 使ってみようstrip

より高度なアプローチでは、キャラクターの統計を行い、この統計に基づいて適切な回転を推測します。

于 2012-11-21T17:29:23.047 に答える