1

interactivepython.org Web サイトを使用してプログラミングを独学しようとしています。私は私の頭をはるかに超えているように見える問題に遭遇しました。私は3時間連続でそれに取り組んでおり、頭を悩ませています。これを分解する方法がまったくわかりません。

問題:

秘密のメッセージを解読する:

説明は難しいように思えるかもしれませんが、解決策はそれほど難しくありません。関連する組み込み関数および while ループ ('len' 関数を使用) または for ループ ('in' 演算子を使用) で組み込みの文字列データ型を使用して、文字列をトラバースできます。また、コース教材で説明されている「chr」および「ord」関数 (ASCII コードに基づく) を使用します。コース教材の例を確認し、演習 2 の #18 と #19 を実行してください。#19 の回答が提供されており、この問題を解決するための貴重なヒントを得ることができます。


あなたの国は戦争中であり、敵は秘密のコードを使用して互いに通信しています。次のようなメッセージを傍受することに成功しました:

:mmZ\dxZmx]Zpgy

メッセージは明らかに敵の秘密コードを使用して暗号化されています。彼らの暗号化方式が ASCII コードに基づいていることがわかりました (オンラインで検索すると、このセットを簡単に見つけることができます)。文字列内の個々の文字は、このシステムを使用してエンコードされます。たとえば、文字「A」は数値 65 を使用してエンコードされ、「B」は数値 66 を使用してエンコードされます。

敵の秘密コードは、メッセージの各文字を受け取り、次のように暗号化します (秘密鍵を使用):

If (OriginalChar + Key > 126) then
    EncryptedChar = ((OriginalChar + Key) - 127) + 32
Else 
    EncryptedChar = (OriginalChar + Key)

たとえば、敵が Key = 10 を使用している場合、メッセージ「Hey」は次のように暗号化されます。

Character   ASCII
H         72
e         101
y         121

Encrypted H = (72 + 10) = 82 = R in ASCII
Encrypted e = (101 + 10) = 111 = o in ASCII
Encrypted y = 32 + ((121 + 10) - 127) = 36 = $ in ASCII

したがって、「Hey」は「Ro$」として送信されます。

傍受されたメッセージを解読するプログラムを作成します。使用されている鍵が 1 から 100 までの数字であることだけがわかります。プログラムは、1 から 100 までのすべての可能な鍵を使用してメッセージのデコードを試みる必要があります。有効な鍵を試すと、メッセージは意味のあるものになります。他のすべてのキーの場合、メッセージは意味不明に表示されます。

ヒント: 暗号化されたメッセージを文字列として、キーを整数として受け取り、復号化されたメッセージを文字列として返す復号化関数を実装する必要があります。次のように、メッセージの各文字を復号化できます。

If (EncryptedChar - Key < 32) then
    DecryptedChar = ((EncryptedChar - Key) + 127) - 32
Else
    DecryptedChar = (EncryptedChar - Key)

注: 通常のメッセージを文字列として、キーを整数として受け取り、対応する暗号化されたメッセージを文字列として返す暗号化関数も実装する必要があります (メッセージを暗号化するアルゴリズムは、問題の説明で前述されています)。この関数は、通常のメッセージを暗号化するのに役立ち、それを復号化関数に渡して復号化できます。


暗号化の場合: ユーザーに通常のメッセージとキーを要求し、対応する暗号化されたメッセージを出力する必要があります。

サンプルラン:

Enter a regular message to encode:
Attack at dawn!
Enter a key value (between 0 and 100) for encoding:
88
The encoded message is: 
:mmZ\dxZmx]Zpgy

復号化の場合: ユーザーに暗号化されたメッセージを要求し、適切にフォーマットされた復号化されたメッセージ (1 から 100 までのキーを使用) を 100 個、対応するキー値と共に出力する必要があります。

サンプル実行 (以下の意味不明なメッセージは正確ではありません):

Enter an encrypted message to decode:
:mmZ\dxZmx]Zpgy 
The following are the decoded messages for keys 1 to 100:
Key: 1 –&gt; Decoded Message: whfuihwuiidh89
Key: 2 –&gt; Decoded Message: 9ehkaOY3ewine
...
Key: 87 –&gt; Decoded Message: Buubdl!bu!ebxo”
Key: 88 –&gt; Decoded Message: Attack at dawn!
...
Key: 100 –&gt; Decoded Message: on3dwp389/wi8

これは私が現在持っているコードです:

def encrypt(message, key):
    result = ""
    for char in message:
        result += encryptedChar
    return result
4

2 に答える 2

2

これは、Joran Beasley のものとして、より単純な (しかしより長い) 回答です。

ord()文字の「番号」を取得し、文字を「回復」できることを理解したら、取得chr()したコードを正しいpythonコードに「変換」するのは簡単です。

次の部分から始めます。

If (OriginalChar + Key > 126) then
    EncryptedChar = ((OriginalChar + Key) - 127) + 32
Else 
    EncryptedChar = (OriginalChar + Key)

すでに書いたコードから始める場合、上記を次のように翻訳できます。

def encrypt(message, key):
    result = ""
    for char in message:
        if (ord(char) + key > 126):
            result += chr(ord(char) + key - 127 + 32)
        else:
            result += chr(ord(char) + key)
    return result

復号化部分で同じことを行い、次に簡単なメニューを作成できます。
残りのコードは次のとおりです (encrypt上部に関数を追加する必要があります。

def decrypt(message):
    for key in range(1, 101):
        result = ""
        for char in message:
            if (ord(char) - key < 32):
                result += chr(ord(char) - key + 127 - 32)
            else:
                result += chr(ord(char) - key)
        print('key: {} -'.format(key), result)

if __name__ == '__main__':
    print('1 - Encrypt')
    print('2 - Decrypt')
    inp = input('select 1 or 2: ')
    if inp == '1':
        msg = input('Enter message: ')
        key = int(input('Enter key (1-100): '))
        print('Encrypted message:')
        print(encrypt(msg, key))
    else:
        msg = input('Enter message: ')
        decrypt(msg)
于 2013-11-14T18:20:31.440 に答える