2016-05-06 2 views
0

Я пытаюсь внедрить шифр Вигенара. Я хочу, чтобы иметь возможность обфускации каждого отдельного символа в файле, а не только буквенных символов.Vigenere Cipher в ошибке Python

Я думаю, что я пропускаю что-то с различными типами кодирования. Я сделал несколько тестовых примеров, и некоторые символы плохо заменяются в конечном результате.

Это один тест:

, .-'`1234678abcde^* {} "?! ¿" · $% &/\ º

конец

И это результат я получаю:

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

конец

Как вы можете видеть, «» заменяется плохо с „)“, а также некоторые другие символы.

Я полагаю, что другие (например, '¿' заменены на??) Исходят из исходного символа, который не находится в диапазоне [0, 127], поэтому его нормальные изменения изменены. Но я не понимаю, почему «,» терпит неудачу.

Мое намерение состоит в том, чтобы обфускать файлы CSV, поэтому проблема «,» - это проблема, о которой я беспокоюсь в основном.

В приведенном ниже коде я использую модуль 128, но я не уверен, что это правильно. Чтобы выполнить его, поместите файл с именем «OriginalFile.txt» в ту же папку с содержимым для шифрования и запуска скрипта. Будут созданы два файла, 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

Допущение: вы пытаетесь создать новый, действительный CSV с содержимым ячеек шифрованных через Vigenere, не зашифровать весь файл.

В этом случае вы должны проверить модуль csv, который будет обрабатывать корректное чтение и запись 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 модуля вы должны быть осведомлены о понятии «dialects» - способы, что различные программы (как правило, электронная таблица, как вещи, думают, Excel) обрабатывать CSV данные. csv.reader() обычно выполняет прекрасную работу по выводу диалекта, который у вас есть во входном файле, но вам может потребоваться сообщить csv.writer(), какой диалект вам нужен для выходного файла. Вы можете получить список встроенных диалектов с помощью csv.list_dialects(), или вы можете создать свой собственный, создав собственный объект Dialect.