Tkinter сохранения документа с паролем

Пишу текстовый редактор на Python3.8 Tkinter и хочу реализовать чтобы можно было при сохранении файла присваивать ему пароль и потом когда его открывать то просило пароль? Как это можно сделать


Ответы (2 шт):

Автор решения: Андрей Григорьев

Самое простое, но не самое надежное решение:

import json
from tkinter import simpledialog as sd, messagebox as mb

# Функция, сохраняющая заданный текст с заданным паролем по заданному пути
def save_with_password(text, password, path):
    obj = {'text': text, 'password': password}
    to_save = open(path, 'w')
    to_save.write(json.dumps(obj))
    to_save.close()

# Функция, открывающая запароленный файл
def open_passworded_file(path):
    f = open(path, 'r')
    data = json.loads(f.read())
    f.close()
    password = sd.askstring(title="Ввод данных", prompt="Введите пароль")
    if password == data['password']:
        return data['text']
    else:
        mb.showerror('Ошибка','Неверный пароль')

Чтобы сделать надежнее - можно кодировать то, что записываем в файл, а при чтении декодировать

Пример с самым простым кодированием/декодированием:

import json
from tkinter import simpledialog as sd, messagebox as mb
import base64

# Функция, сохраняющая заданный текст с заданным паролем по заданному пути
def save_with_password(text, password, path):
    obj = {'text': text, 'password': password}
    to_save = open(path, 'w')
    data = json.dumps(obj)
    encoded_data = base64.b64encode(data.encode()).decode()
    to_save.write(encoded_data) # сохранится казалось бы всякая абра кадабра
    to_save.close()

# Функция, открывающая запароленный файл
def open_passworded_file(path):
    f = open(path, 'r')
    encoded_data = f.read()
    f.close()

    json_text = base64.b64decode(encoded_data.encode()).decode()
    data = json.loads(json_text)
    password = sd.askstring(title="Ввод данных", prompt="Введите пароль")
    if password == data['password']:
        return data['text']
    else:
        mb.showerror('Ошибка','Неверный пароль')
→ Ссылка
Автор решения: user554513

Я использую модуль pickle.

import pickle
def write(text, password, way):
    data = {
        'password' : password,
        'text' : text
            }
    file = open(way, 'wb')
    pickle.dump(data, file)
    file.close()
def read(way, password):
    file = open(way, 'rb')
    data = pickle.load(file)
    file.close()
    if password == data['password']:
        return data['text']
    else:
        print('Error, wrong password')
→ Ссылка