2016-05-06 12 views
0

私はVigenere's Cipherを実装しようとしています。私はアルファベット文字だけでなく、ファイル内のすべての文字を難読化できるようにしたい。Vigenere Cipher in Pythonバグ

さまざまな種類のエンコーディングが欠けていると思います。私はいくつかのテストケースを作っており、最終的な結果でいくつかの文字がひどく置き換えられています。

この一つのテストケースである:

、.-'`1234678abcde^* {} "?!¿" ・$%&/\

ºエンド

そして、これは私が取得していた結果である:

).- 4`1234678abcde^* {} "!??" 7 $%の& /:

エンド

あなたが見ることができるように、「」 『)』でひどく置き換えられているだけでなく、いくつかの他の文字。

私の推測では、[¿ 'は'? 'で置き換えられます。]元の文字は[0、127]の範囲外であるため、通常の文字が変更されます。しかし、私はなぜ '、'が失敗しているのか理解できません。

私の意図は、CSVファイルを難読化することです。そのため、私が主に心配しているのは「問題」です。

以下のコードでは、モジュラス128を使用していますが、それが正しいかどうかはわかりません。これを実行するには、 "OriginalFile.txt"という名前のファイルを同じフォルダに入れ、暗号化してスクリプトを実行します。 2つのファイル、Ciphered.txtとDeciphered.txtが生成されます。

""" 
Attempt to implement Vigenere cipher in Python. 
""" 

import os 

key = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" 

fileOriginal = "OriginalFile.txt" 
fileCiphered = "Ciphered.txt" 
fileDeciphered = "Deciphered.txt" 

# CIPHER PHASE 

if os.path.isfile(fileCiphered): 
    os.remove(fileCiphered) 

keyToUse = 0 

with open(fileOriginal, "r") as original: 
    with open(fileCiphered, "a") as ciphered: 
     while True: 
      c = original.read(1) # read char 

      if not c: 
       break 

      k = key[keyToUse] 
      protected = chr((ord(c) + ord(k))%128) 
      ciphered.write(protected) 
      keyToUse = (keyToUse + 1)%len(key) 

print("Cipher successful") 

# DECIPHER PHASE 

if os.path.isfile(fileDeciphered): 
    os.remove(fileDeciphered) 

keyToUse = 0 

with open(fileCiphered, "r") as ciphered: 
    with open(fileDeciphered, "a") as deciphered: 
     while True: 
      c = ciphered.read(1) # read char 

      if not c: 
       break 

      k = key[keyToUse] 
      unprotected = chr((128 + ord(c) - ord(k))%128) # +128 so that we don't get into negative numbers 
      deciphered.write(unprotected) 
      keyToUse = (keyToUse + 1)%len(key) 

print("Decipher successful") 
+1

(どのようなキーでサンプル出力が得られましたか?)範囲が128に制限されていても、スペースの前にある文字が特殊なので問題が発生します。 ASCIIの '普通'の部分をループするのは最高です:32〜126の小数点のみ。 – usr2564301

+0

カンマの場合:*それを無視していつものようにエンコードするか、それらを維持して適切にエンコードしますかCSVエントリ?(この場合、コンマに何もエンコードしないでください**) – usr2564301

+1

@RadLexusコンマもエンコードしたいと思います。私は攻撃者にCSVファイルを知らせたくありません。たぶん私はあなたが[32,126]と言っていることについていくつかの回避策を講じなければなりません。私はそれを試して、すぐに更新します。 – Guimo

答えて

1

前提:あなたはファイル全体を暗号化するのではなく、Vigenereを経由して暗号化したセルの内容を持つ新しい、有効なCSVを生成しようとしています。

この場合、あなたのCSVファイルの読み書きを正しく処理するcsvモジュールをチェックする必要があります(セルの内容を暗号化した後に表示される値のカンマが含まれるセルを含む) )。別のプログラムがCSVを扱う(通常はスプレッドシートのようなものは、Excelが考える)の方法 - あなたは「dialects」の概念を認識しておく必要がありcsvモジュールを使用する場合は

with open("...", "r") as fpin, open("...", "w") as fpout: 
    reader = csv.reader(fpin) 
    writer = csv.writer(fpout) 
    for row in reader: 
     # row will be a list of strings, one per column in the row 
     ciphered = [encipher(cell) for cell in row] 
     writer.writerow(ciphered) 

:非常に簡単に、あなたのような何かを行うことができますデータ。 csv.reader()は通常、入力ファイルにある方言を推論するうえですばらしい仕事をしますが、csv.writer()に出力ファイルにどのような方言を指定する必要があります。 csv.list_dialects()で組み込みの方言のリストを取得することも、独自のDialectオブジェクトを作成して独自の方言を作成することもできます。