0

私が抱えている復号化の問題で立ち往生しています。次のように、アルファベットのみで1文字ずつオフセットされた非常に基本的な暗号があります。

A    B
B    C
C    D
D    E
to z  to A

右の列は与えられた文字で、左の文字に変える必要があります。

これをファイルから読み取り、各列を次のようなリストに保存しています

#!/usr/bin/python

key = "key.txt"
encrypted = "encrypted.txt"
decrypted = "decrypted.txt"

encryptedList = []
decryptedList = []

with open(key, "r") as file:
    for line in file:
        currentLine = line.split()

        currentDecrypted = currentLine[0]
        currentEncrypted = currentLine[1]

        decryptedList.append(currentEncrypted)
        encryptedList.append(currentDecrypted)

file.close()

counter = 0
with open(encrypted, "r") as file:
for line in file:
    currentLine = line
    for letter in currentLine:
        currentLetter = letter
        for item in encryptedList:
            if(item == currentLetter):
            ####here's where the problem starts####
            ####I've tried just printing counter, and I get mostly go    
                printencryptedList[counter-1]
                counter = 0
                break
            counter += 1

復号化しようとしているのは、次のようなテキスト ファイルです。

FMMP
NZ OBNF JT KSMBB
KPIO TVDLT BQQ
GWWWWWWBMT PG DJJJJJH

カウンター -1 で FMMP の正しいカウント数 (5、12、12、15) を取得しますが、39、25、40 などを取得します。さらに詳しい情報が必要な場合はお知らせください。

これを行うためのより良い/より簡単な方法についてのアイデアも歓迎しますが、これに似た解決策も欲しいので、ここで何が起こっているのかを理解できます. ありがとう

わかりました、すべての回答と情報に感謝します。私が最終的にやったことを投稿していますが、うまくいきます。あるべきほどpythonicではないことは確かですが、人々が言及したいくつかのことを実装しました。情報をありがとう。

import string

key = "key.txt"
encrypted = ""encrypted.txt"
decrypted = "decrypted.txt


encryptedString = ""
decryptedString = ""

keyDict = {}

with open(key, "r") as file:
    for line in file:
    currentLine = line.split()

    currentDecrypted = currentLine[0]
    currentEncrypted = currentLine[1]

    keyDict[currentDecrypted] = currentEncrypted


with open(encrypted, "r") as file:
    for line in file:
    currentLine = line
        for letter in currentLine:
        currentLetter = letter
        encryptedString += letter
            for key in keyDict:
            if(keyDict[key] == letter):
                decryptedString += key
                break
            elif(letter == " "):
                decryptedString += " "
                break
            elif(letter == "\n"):
                decryptedString += "\n"
                break




with open(decrypted, "a") as file:
    file.write(decryptedString)
4

5 に答える 5

5

str.translateは、あなたがやろうとしているように見えるシーザー暗号タイプの暗号化に最適です。

まず、 string.maketransを使用して変換テーブルを作成する必要があります

大文字の英字はstring.ascii_uppercaseから取得できます。

アルファ文字を回転させるには、簡単に行うことができますascii_uppercase[1:] + ascii_uppercase[0]

ここからはケーキウォークです

>>> secret = """FMMP
NZ OBNF JT KPTIVB
KPIO TVDLT BTT
GVOEBNFOUBMT PG DPNQVUJOH"""
>>> from string import ascii_uppercase as UPPER, maketrans
>>> print secret.translate(maketrans(UPPER[1:] + UPPER[0], UPPER))
于 2013-01-22T08:18:15.547 に答える
3

辞書は必ず使うべきです。Pythonsmap()を使用すると、タスクは非常に簡単になります。

import string

secret = """FMMP
NZ OBNF JT KPTIVB
KPIO TVDLT BTT
GVOEBNFOUBMT PG DPNQVUJOH"""

characters = list(string.uppercase)
cipher = dict(zip(characters[1:]+[characters[0]], characters))

decrypted = "".join(map(lambda x: cipher.get(x,x), secret))

print decrypted

私は「ペアレンタル アドバイザリ」ステッカー atm を持っていないので、復号化の結果をここに投稿しません。;-) やってみなよ!

もちろん、モジュールにはヘルパー関数がありますがstring、OP は「防弾」暗号システムを実装するのではなく、Python を学びたいと考えています。

于 2013-01-22T08:10:03.013 に答える
0

私はアルファベットだけで1文字オフセットされた本当に基本的な暗号を持っています。

これは本当ですか?表示するコードは、任意の置換をサポートしています。それが必要ない場合は、次のようにします。

encstr = 'FMMP NZ OBNF JT KPTIVB KPIO TVDLT BTT GVOEBNFOUBMT PG DPNQVUJOH'
decstr = ''.join([(chr(ord(ech)-1) if 'A' <= ech <= 'Z' else ech) for ech in encstr])

編集

元の例では、クリアテキスト「Z」が「[」(ASCII)にバンプするのではなく、「A」にラップすることを想定しています。これを適切に処理するには:

''.join([(chr(ord('A')+(ord(ech)-ord('A')-1)%26 ) if 'A' <= ech <= 'Z' else ech) for ech in encstr])

ですから、これは少し醜いものになっています。translateこの時点で見栄えがし始めています。@Abhijitの回答を参照してください

于 2013-01-22T08:23:23.473 に答える
0

Python には、これらの種類の単純な暗号用の関数が組み込まれているため、辞書を使用する必要はありません。

文字列.翻訳

文字列.maketrans

例:

>>> s='''FMMP
NZ OBNF JT KSMBB
KPIO TVDLT BQQ
GWWWWWWBMT PG DJJJJJH'''
>>> import string
>>> tr = string.maketrans(string.uppercase[1:]+'A', string.uppercase)
>>> print string.translate(s,tr)
于 2013-01-22T08:27:55.257 に答える
0

代わりに辞書とコンバーター関数を使用します。

my_crypt = {
    "a":"b",
    "b":"c",
    "c":"d"
    ...
}

def crypt_str(in_str, crypt_dict):
    out_str = ""
    for char in in_str:
        if char in crypt_dict:
            out_str += crypt_dict[char]
        else:
            out_str += char
    return out_str

>>> print(crypt_str("hello!", my_crypt))
ifmmp!

ここで提供される他の方法に対する利点: 文字を数字に変換するなど、変換方法を変更したい場合でも、すべて同じように機能します。

于 2013-01-22T08:09:02.610 に答える