Ich versuche, Vigenere's Cipher zu implementieren. Ich möchte in der Lage sein, jedes einzelne Zeichen in einer Datei zu verschleiern, nicht nur alphabetische Zeichen.Vigenere Cipher in Python Bug
Ich denke, ich vermisse etwas mit den verschiedenen Arten der Codierung. Ich habe einige Testfälle gemacht und einige Zeichen werden im Endergebnis schlecht ersetzt.
Dies ist ein Testfall:
, .-'`1234678abcde^* {} "?! ¿" · $% &/\ º
Ende
Und dies ist das Ergebnis erhalte ich:
) .- 4`1234678abcde^* {} "??!" 7 $% & /:
Ende
Wie Sie sehen können, ‚‘ ersetzt schlecht mit ‚)‘ sowie einigen anderen Zeichen wird.
Meine Vermutung ist, dass die anderen (z. B. "¿" durch "?" Ersetzt werden) von dem ursprünglichen Zeichen stammen, das nicht im Bereich von [0, 127] liegt. Aber ich verstehe nicht, warum ',' versagt.
Meine Absicht ist es, CSV-Dateien zu verschleiern, also ist das ',' Problem das, worüber ich hauptsächlich besorgt bin.
Im folgenden Code verwende ich Modulo 128, aber ich bin mir nicht sicher, ob das korrekt ist. Um es auszuführen, legen Sie eine Datei mit dem Namen "OriginalFile.txt" in den gleichen Ordner mit dem Inhalt zum Chiffrieren und führen Sie das Skript aus. Zwei Dateien werden generiert, Ciphered.txt und 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")
(Welcher Schlüssel gab Ihnen die Beispielausgabe?) Auch wenn der Bereich auf 128 beschränkt ist, treten Probleme auf, weil die Zeichen "vor" dem Leerzeichen ebenfalls etwas Besonderes sind. Die beste Schleife um den 'einfachen' Teil von ASCII: nur die Ordinalzahlen von 32 bis 126. – usr2564301
Für das Komma: willst du es * ignorieren * und wie gewohnt codieren, oder willst du * sie * beibehalten und nur richtig codieren? CSV-Einträge?(In diesem Fall solltest du darauf achten ** nicht ** etwas zu einem Komma zu kodieren!) – usr2564301
@RadLexus Ich möchte das Komma auch codieren. Ich möchte nicht, dass ein Angreifer seine CSV-Datei kennt. Vielleicht muss ich ein wenig Abhilfe schaffen bei dem, was Sie sagen [32, 126]. Ich werde es versuchen und bald aktualisieren. – Guimo