リバースエンジニアシーザー暗号

マッケンジーは望んでいます:

私は、復号化するためのリバースエンジニアリングが、期待される結果を得ることはありません。

例えば、入力

Lipps${svph%

オフセットと4は、内なるはずです

Hello World!

私は取得します

ello´world³

私は間違って何をしたのですか?

code = input("Enter text to decrypt: ")
distance = int(input("Enter number of offset: "))
plainText = ''
for ch in code:
    ordValue = ord(ch)
    cipherValue = ordValue - distance
    if cipherValue < ord('a'):
        cipherValue = ord('z') - \
            (distance - (ord('a') - ordValue + 1))
    plainText += chr(cipherValue)
print(plainText)
JL Peyret:

[OK]を、私は、zのために働いて、それを持って、あなたに/入力するたびに、それを入力するよりも、自動的にではなくチェックするために少しテストフレームワークを与えました。

def dowork(code, distance, lower, upper):


    bounddown, boundup = ord(lower), ord(upper)

    plaintext = ""
    for ch in code:
        ordValue = ord(ch)
        cipherValue = ordValue - distance
        if cipherValue < bounddown:
            cipherValue = boundup - bounddown - ordValue +1

        plaintext += chr(cipherValue)


    return plaintext

dataexp = [
    (("jgnnq",2, 'a', 'z'),"hello"),
    ]

for input_, exp in dataexp:
    got = dowork(*input_)
    msg = "exp:%s:%s:got for %s" % (exp, got, inp)
    if exp == got:
        print("good! %s" % msg)
    else:
        print("bad ! %s" % msg)

このプリント

good! exp:hello:hello:got for ('jgnnq', 2, 'a', 'z')

今、あなたがする必要があるのは、dataexpリストに何かを余分な項目を追加されます

(("Lipps${svph%", 4, <lowerbound>, <upperbound char>), "Hello World!")

あなたは、上を持っていると考え出し下限一度それが動作するはずです。私はシーザーコードを知らなかったことに注意してください、私は直接あなたをコピーし、それを少し再編します。

*_inputんと、そのタプル(多かれ少なかれリスト)で、これらの4つの値を取り、それらを割り当てることであるcode, distance, lower, upperdowork機能。

lower対応するものであるaあなたのコードにしてupperいますz

EXPは、あなたが期待するもので、exp == gotどのような関数が返されることは正しいかどうかだけをチェックします。あなたが機能を得れば、それはのために働く必要があります修正の両方私の単純化a-z、2距離、helloテストし、あなたのより複雑4の距離が、句読点を含みます

下限と上限

あなたの2列、入力と出力は、あるLipps${svph%Hello World!すべてのこれらの文字の意味は、あなたの上下のORD値内に収まるように、右必要があると?だから、すべてのそれらの最小ORD位置は、あなたですlowerとmaxあなたですupper今、私はCryptonomiconから男じゃないと私は今までであればORD()<ORD(A)またはない、ましてや句読点を思い出すことができません。あなたは、私が唯一の小文字に私のテストをベース理由である、それと種類いじくり回す必要がありますので。私は0-9かかわらを追加すると思います。

最終版

これは、上でバウンドし、その最低に入れている文字を見つけ出すためにあなたを必要としません。私たちは、道の句読点、大文字と小文字、数字が、そのORD値はもはや問題ではいけない、上部= 255、(印刷可能な文字の開始)下= 32を取ります。

#full ASCII range, you can go to town on entering whatever you want
bounddown, boundup = 32, 255

plaintext = ""
for ch in code:
    ordValue = ord(ch)
    cipherValue = ordValue - distance
    if cipherValue < bounddown:
        cipherValue = boundup - bounddown - ordValue +1

    plaintext += chr(cipherValue)

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=351367&siteId=1