1

Casesar Cipher アルゴリズムを使用して、入力したものを解読しようとしています。

#Decrypt Code
alphabet="ABCDEFGHIJKLMNOPQRSTUVWXYZ ABCDEFGHIJKLMNOPQRSTUVWXYZ ABCDEFGHIJKLMNOPQRSTUVWXYZ "
DMessage=input("Enter your message to decrypt")
UDMessage=DMessage.upper()
lenDMessage=len(UDMessage)
offset=(int(input("Enter what you would like your offset to be 0,25")))
offset=offset-2
for x in range(0,lenDMessage):
    for y in range(-25,25):
        if UDMessage[x]==alphabet[y+25]:
            print(x,DMessage,[x], UDMessage[x],alphabet[y+25+offset])

入力は ですがCaesar code test run、 として出力されecguctbeqfgbvgubbtwpます。アルファベットをさかのぼって解読できるようにする方法を知っている人はいますか?

4

4 に答える 4

1

免責事項

このコードは、Python 3 では動作しますが、Python 2 では動作しません。

コード

In [1]: def shift(c,n=13,alphabet="ABCDEFGHIJKLMNOPQRSTUVWXYZ"):
        u = c.upper()
        if u not in alphabet: return c
        s = alphabet[(alphabet.index(u)+n)%26] 
        if u!=c: s=s.lower()
        return s
   ...: 

In [2]: def caesar(s,n=13): return "".join(shift(c,n) for c in s)

In [3]: def decaesar(s,n=13): return "".join(shift(c,-n) for c in s)

In [4]: caesar('Puffo Burlone, dove vai?')
Out[4]: 'Chssb Oheybar, qbir inv?'

In [5]: decaesar(_)
Out[5]: 'Puffo Burlone, dove vai?'

In [6]: caesar('Puffo Burlone, dove vai?',22)
Out[6]: 'Lqbbk Xqnhkja, zkra rwe?'

In [7]: decaesar(_,22)
Out[7]: 'Puffo Burlone, dove vai?'

In [8]: caesar('Puffo Burlonè, dovè vai?') # note the accented letters
Out[8]: 'Chssb Oheybaè, qbiè inv?'

In [9]: decaesar(_)
Out[9]: 'Puffo Burlonè, dovè vai?'

討論

ものの中心はshift関数で、大文字が含まれているかどうかを調べalphabet、そうでない場合はそのまま返しますn。 modulo operator%の場合、cが小文字の場合は、シフトされた小文字の文字を返します。それ以外の場合は、大文字のアルファベットを大文字にしたシフトされた文字を返します。

次に、最初の必須引数から取り出されたシフトされた文字を結合するcaesarand関数があります。オプションの引数は、デフォルトではシフトの量です。違いは、 inが負で呼び出されるため、シフトを元に戻すことです。decaesar13decaesarshiftn

最終的に、暗号化された文字列にそのまま残されている非ASCII文字でも機能する関数をテストします...上記はPython 3でのもので、Python 2の非ASCII文字はマングルされています。

于 2015-05-01T15:31:41.563 に答える
0

メッセージの暗号化に使用した実装を正確に伝えることはできないため、最初にメッセージを暗号化し、次にそれを取得して復号化するバージョンのコードを提供しています。

理解すべき重要なことは、文字を数字に変換することです。それが関数のord()機能です。次に、「A」の数値を減算することにより、文字配列へのインデックスを取得できます。ord()関数である逆を使用できるため、文字配列は実際には必要ありませんがchr()、実装をできるだけあなたのものに近づけました。「 」は他の文字と連続していないため、その文字を特別に扱いました。find()あなたの配列では、代わりに文字列メソッドを使用して数値に変換できたと思います。

入力されたオフセットから 2 を引いた理由がわからないので、省略しました。

以下のコードは、暗号化してから復号化します。負のインデックスが Python でどのように機能するかにより、正のオフセットの代わりに負のオフセットを入力することで、順序を逆にして復号化し、暗号化することができます。

alphabet="ABCDEFGHIJKLMNOPQRSTUVWXYZ ABCDEFGHIJKLMNOPQRSTUVWXYZ ABCDEFGHIJKLMNOPQRSTUVWXYZ "
DMessage=input("Enter your message to decrypt")
UDMessage=DMessage.upper()
lenDMessage=len(UDMessage)
offset=(int(input("Enter what you would like your offset to be 0,25")))
encrypted = ''
for letter in UDMessage:
    if letter == ' ':
        index = 26
    else:
        index = ord(letter) - ord('A')
    encrypted += alphabet[index+offset]
print(encrypted)

decrypted = ''
for letter in encrypted:
    if letter == ' ':
        index = 26
    else:
        index = ord(letter) - ord('A')
    decrypted += alphabet[index+27-offset]
print(decrypted)
于 2015-05-01T14:07:13.073 に答える
0

私はあなたのコードを取り、それを少しリファクタリングしました。あなたのようにアルファベット文字列を拡張する代わりに mod を使ってみてください。

#Decrypt Code  DEFGHIJKLMNOPQRSTUVWXYZABC -> ABCDEFGHIJKLMNOPQRSTUVWXYZ  (left 3 offset, -3)
import string
alphabet = string.ascii_uppercase
cipher =  raw_input("Enter your message to decrypt: ").upper()
offset=(int(raw_input("What is the cipher offset? : ")))
plain = []
for letter in cipher:
    offset_letter = alphabet[(alphabet.index(letter) + offset) % len(alphabet)]
    plain.append(offset_letter)
print ''.join(plain)

これが作業シナリオです。注 -3 は 3 だけ左にシフトすることを意味します。したがって、シフトする方法を知っている限り、同じ関数を使用して暗号化 / 復号化できます。

$Enter your message to decrypt: DEFGHIJKLMNOPQRSTUVWXYZABC
$What is the cipher offset? : -3
ABCDEFGHIJKLMNOPQRSTUVWXYZ

逆に右シフトを行います。

$Enter your message to decrypt: ABCDEFGHIJKLMNOPQRSTUVWXYZ
$What is the cipher offset? : 3
DEFGHIJKLMNOPQRSTUVWXYZABC

乾杯

于 2015-05-03T22:23:26.920 に答える