-2

やあみんな、私はこれらの一連の指示に従って暗号を作ろうとしています:

  1. ヘッダーを印刷します。
  2. 暗号化されたメッセージを含むファイルの名前、デコード キー (シフト番号)、および復号化されたメッセージを格納するファイルの名前を入力するようユーザーに求めます。
  3. ファイルから暗号化されたメッセージを読み取ります。
  4. デコード キーを使用して、暗号化されたメッセージの各文字を適切な数だけシフトし、復号化されたメッセージに対応する新しい文字列を生成します。
  5. 復号化されたメッセージを 2 番目のファイルに保存します。
  6. 暗号化および復号化されたメッセージを画面に出力します。ord() または chr() 関数を使用することは許可されていません。

私を本当に混乱させているのは、暗号化および復号化されたファイルの部分です。これをコーディングする方法がよくわかりません。

私はこれにかなり慣れていないので、どんな助けでも大歓迎です。前もって感謝します。

4

2 に答える 2

4

注:おそらくこれを学校の課題として行っているようです。以下のコードは、完全なソリューションとしてではなく、例としてのみ使用することを強くお勧めします。私はあなたの任務を取り巻く盗作の問題があることを嫌います、そしてあなたの教授/教師は前の仕事のためにグーグルで知識があると確信しています。あなたの割り当てに頑張ってください!

私はあなたの問題にどのように取り組むことができるかについての簡単な例を書きました。この例には、いくつかの既知の問題があります。

  1. 大文字は扱いません。(小文字に変換する以外。)
  2. 句読点や英数字以外の文字は扱いません。(数字、スペース、または行末。)
  3. エラーチェックはありません。
  4. -25未満の数値を変換しようとすると、スローされます。

おそらく、解決する必要のある最大の問題は、とを使用しないという制限でしord()chr()。文字から数字へ、またはその逆の独自の変換リストを作成することで、この制限を回避しました。確実に対処するためのトリッキーなコーナーケースは、シフトによって文字が変換範囲[0,25]の外に移動した場合に発生することです。

補足として、ファイルを復号化する場合は、ファイルをプレーンテキストとして開き、絶対値が暗号化オフセットと等しい負のオフセットを使用できます。または、パラメータを使用する場合は、平易な英語で:

infile = clear.txt, offset = 1, outfile = encrypted.txt

復号化するには、次を使用できます。

infile = encrypted.txt, offset = -1, outfile = decrypted.txt   

caesarcipher.py

import itertools

letters = ['a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q',
           'r','s','t','u','v','w','x','y','z']
numbers = range(26) # Numbers 0 - 25
lettersToNumbers = dict(zip(letters, numbers))
numbersToLetters = dict(zip(numbers, letters))

def printHeader():
    """ Print the program informational header """
    print """=======================================
Welcome to CaesarCipher - The unbreakable
Roman cipher.
======================================="""

def convertToNumber(letter):
    """ Convert a letter to a number using our predefined conversion table
        @param letter: The letter to convert to an integer value
        @type letter: str
        @rtype: int
    """
    return lettersToNumbers[letter]

def convertToLetter(number):
    """ Convert a number to a letter using our predefined conversion table
        @param number: The number to convert to a letter
        @type number: int
        @rtype: str
    """
    # If we shift outside of our range make sure to wrap
    if number > 25:
        return numbersToLetters[number%25]
    elif number < 0:
        return numbersToLetters[number+25]
    else:
        return numbersToLetters[number]

def shiftUp(letter, shift):
    """ Shift letter up a given number of positions
        @param letter: The letter we're shifting
        @param shift: The number of positions to shift up
        @type letter: str
        @type shift: int

        @note: For simplicity we encode both capital and lowercase letters
               to the same values
    """
    number = convertToNumber(letter.lower())
    number += shift
    return convertToLetter(number)

def prompt():
    """ Prompt for user input
        @rtype: tuple of str, int, str
    """
    infile = raw_input("File to encrypt: ")
    offset = int(raw_input("Encoding number: "))
    outfile = raw_input("Encrypted file destination: ")
    return (infile, offset, outfile)

def encrypt(infile, offset, outfile):
    """ Encrypt the file using the given offset """
    print "=== Plaintext input ==="
    printFile(infile)
    with open(infile) as red_file:
        with open(outfile, 'w') as black_file:
            for line in red_file:
                for letter in line:
                    # Only convert alphabetic characters
                    if letter.isalpha():
                        black_file.write(shiftUp(letter, offset))
                    else:
                        black_file.write(letter)
    print "=== Ciphertext output ==="
    printFile(outfile)

def printFile(path):
    """ Print the data in the given file """
    with open(path) as print_file:
        for line in print_file:
            print line

printHeader()
encrypt(*prompt()) # `*` unpacks the tuple returned by `prompt()` into 
                   # three separate arguments.

test.txt

abcdef
ABCDEF
This is some text I want to try and encrypt.

実行例:

mike@test:~$ python caesarcipher.py 
=======================================
Welcome to CaesarCipher - The unbreakable
Roman cipher.
=======================================
File to encrypt: test.txt
Encoding number: 1
Encrypted file destination: test.out 
=== Plaintext input ===
abcdef

ABCDEF

This is some text I want to try and encrypt.

=== Ciphertext output ===
bcdefg

bcdefg

uijt jt tpnf ufyu j xbou up usz boe fodszqu.
于 2013-02-24T04:10:35.467 に答える
0

あなたはファイルビットがあなたの最大の問題だと言っているので、私は次のような機能を想定しています:

def decaesar(message, shift):
   pass

つまり、暗号化されたメッセージを文字列として受け取り、復号化されたメッセージを文字列として返します。まだそれを書いていない場合は、最初にそれを行い、ハードコードされた文字列でテストしてください。この段階では「暗号化および復号化されたファイル」の部分は無視してください。プログラミングとは、一度に 1 つの問題を解決することです。

その関数を取得し、それが機能することに満足したら、文字列ではなくファイルを処理するようにプログラムを拡張するのは、次のように尋ねるのと同じくらい簡単です。

  • ファイルの名前を指定して、ファイルの内容を含む文字列を取得できますか? 、逆に、
  • 特定の名前のファイルに文字列を書き込むことはできますか?

これらの両方に「はい」と答えることができれば、decaesar関数を変更せずにこの方法でプログラムを拡張できます。ロジックは次のようになります。

# Print header
encrypted_filename, decrypted_filename, shift = # get from user input
encrypted_message = # get the contents of encrypted_filename as a string
decrypted_message = decaesar(encrypted_message, shift)
# write decrypted_message to decrypted_filename
# print encrypted_message and decrypted_message

便利なことに、Python のファイル IO は、まさにこの文字列とファイル間の変換の原則に基づいて動作します。読み取り用にファイルを開いている場合:

in_file = open(filename)

、次に戻り値:

in_file.read()

はまさに最初の点に答える文字列です。同様に、ファイルを書き込み用に開いている場合:

out_file = open(ファイル名, 'w') . それから:

out_file.write(my_string)

そのファイルに入れmy_stringます。

つまり、decaeser関数が既にある場合は、このコードを上記の疑似コードの適切な場所に差し込むことができ、ほとんどが機能するソリューションが得られます。

于 2013-02-24T05:04:18.753 に答える