2014-01-19 3 views
1

Я пытаюсь создать файл с зашифрованным именем пользователя, паролем и именем компьютера при входе пользователя в систему. И те же данные, которые я хочу использовать для аутентификации данных, но сначала дешифруя их. Я пытаюсь использовать что-то, что встроено в python и просто.Простое шифрование и дешифрование строк с помощью bz2 в Python

import os 
import bz2 

os.chdir("D:/test") 

encrypted_username = bz2.compress('username') 
encrypted_password = bz2.compress('password') 
computer_name = os.environ['COMPUTERNAME'] 
encrypted_computer_name = bz2.compress(computer_name) 

f = open("Session.dat", "w") 
f.write(encrypted_username + '\n') 
f.write(encrypted_password + '\n') 
f.write(encrypted_computer_name) 
f.close() 

f = open("Session.dat", "r") 
data = f.read() 
d_data = bz2.decompress(data) 
f.close() 

print(d_data) 

Но когда я дешифрую данные в файле и распечатаю его. Я получаю ответ, как показано ниже. Почему я не получаю пароль и имя компьютера? Спасибо.

username 
+0

Вы должны «распаковывать» строки в файле один за другим в цикле: 'd_data = [bz2.decompress (строка) для строки в f]'. – alecxe

+0

Да, я понял, что команда read() не читает весь файл. Но иногда имя пользователя или пароль слишком длинны, что данные хранятся в файле в двух строках. В этом случае я получаю сообщение об ошибке: # Ошибка: ValueError: file строка 3: не удалось найти конец потока # Как я могу это преодолеть? – zingy

+0

Шифрование и сжатие - это две разные вещи. – hd1

ответ

3

Код сжал строки отдельно. Вы должны прочитать все строки и разложить их по строкам, как прокомментировал alecxe. Но это нецелесообразно, поскольку сжатые данные могут содержать символы новой строки.

Вместо комбинации строк (В следующем коде я использовал NULL-байт \0 в качестве разделителя), затем сжимаем комбинированную строку.

Декомпрессия: после распаковки разделяйте комбинированные строки с использованием того же разделителя.

import os 
import bz2 

#os.chdir("D:/test") 

username = 'username' 
password = 'password' 
computer_name = os.environ['COMPUTERNAME'] 

compressed = bz2.compress(username + '\0' + password + '\0' + computer_name) 

with open("Session.dat", "wb") as f: 
    f.write(compressed) 

with open("Session.dat", "rb") as f: 
    d_data = bz2.decompress(f.read()) 

print(d_data.split('\0')) 

BTW, вы должны использовать двоичный режим для чтения/записи сжатых данных.

+0

Это работало как магия. Спасибо. – zingy

Смежные вопросы