私は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")
(どのようなキーでサンプル出力が得られましたか?)範囲が128に制限されていても、スペースの前にある文字が特殊なので問題が発生します。 ASCIIの '普通'の部分をループするのは最高です:32〜126の小数点のみ。 – usr2564301
カンマの場合:*それを無視していつものようにエンコードするか、それらを維持して適切にエンコードしますかCSVエントリ?(この場合、コンマに何もエンコードしないでください**) – usr2564301
@RadLexusコンマもエンコードしたいと思います。私は攻撃者にCSVファイルを知らせたくありません。たぶん私はあなたが[32,126]と言っていることについていくつかの回避策を講じなければなりません。私はそれを試して、すぐに更新します。 – Guimo