Расшифровка нескольких файлов с помощью cryptography.fernet - PullRequest
1 голос
/ 10 апреля 2020

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

Я создал каталог ключей и каталог сообщений. Каталог ключей содержит подкаталоги с файлами .key, содержащими ключ дешифрования.

Каталог сообщений содержит подкаталоги с файлами .key, содержащими зашифрованные сообщения.

Когда я выбираю подкаталог, я хочу, чтобы код расшифровал все сообщения в этом подкаталоге. На данный момент он расшифровывает только один файл выбранного подкаталога. Ключ и зашифрованный файл имеют одно и то же имя.

Кто-нибудь может мне помочь с этим? - начинающий программист noob

from cryptography.fernet import Fernet
import os
import glob

mainfolderlocation = os.path.dirname(os.path.abspath(__file__))
keyfolderlocation = mainfolderlocation+'\Keys'
messagefolderlocation = mainfolderlocation+'\Messages' 

folder = input('Choose folder:\n')
            try:
                os.chdir(messagefolderlocation+'\{}'.format(folder))
                for file in glob.glob('*.key'):
                    filem = open(file, 'rb')
                    encrypted = filem.read()
                    filem.close()
                    filename= os.path.splitext(file)[0]

                os.chdir(keyfolderlocation+'\{}'.format(folder))    
                for file in glob.glob(filename+'.key'):
                    filek = open(file, 'rb')
                    key = filek.read()
                    filek.close()

                    f = Fernet(key)
                    decrypted = f.decrypt(encrypted)
                    decode=decrypted.decode('utf-8')           
                    print(decode)

            except:
                print('\nThis folder does not exist!')

1 Ответ

1 голос
/ 18 апреля 2020

Ваша проблема в том, что в вашем l oop есть ошибка. У меня нет большого опыта работы с glob, но вы можете попробовать что-то вроде этого:

from cryptography.fernet import Fernet
import os
import glob

mainfolderlocation = os.path.dirname(os.path.abspath(__file__))
keyfolderlocation = mainfolderlocation+'\Keys'
messagefolderlocation = mainfolderlocation+'\Messages' 

files = []

folder = input('Choose folder:\n')
os.chdir(keyfolderlocation+'\{}'.format(folder))    
for file in glob.glob(file+'.key'):
    filek = open(file, 'rb')
    key = filek.read()
    filek.close()

if os.path.exists(folder):
    for r, d, f in os.walk(folder):
        for file in f:
            if '.key' in file:
                files.append(os.path.join(r, file))
else:
    print('\nThis folder does not exist!')

for i in files:
    try:
        filem = open(i, 'rb')
        encrypted = filem.read()
        filem.close()
        filename= os.path.splitext(i)[0]



        f = Fernet(key)
        decrypted = f.decrypt(encrypted)
        decode=decrypted.decode('utf-8')           
        print(decode)

    except:
        print('\nThis folder does not exist!') 

Итак, по сути дела, вы берете любой свой ключ (будьте осторожны, если у вас более одного ключа. файл у вас будут проблемы), составьте список всех файлов в каталоге папки, если он существует, а затем для каждого из этих файлов откройте его, прочитайте содержимое, расшифруйте его и распечатайте. У меня не было возможности проверить это.

Вы также можете подумать о том, чтобы добавить расшифровку в функцию и вызывать ее для каждого файла, вместо того, чтобы она была монолитной c, но это всего лишь стилистический выбор c. Также я поместил захват ключа над блоком try, потому что вы хотите захватить ключ только один раз, иначе вы потеряете производительность, установив переменную в то же значение. Если вы не используете разные файлы ключей для каждого файла, в этом случае вы можете создать словари для каждой пары, чтобы «bananasandwich.txt» соответствовал «bananasandwich.key». Желаем удачи!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...