Отправка зашифрованных данных через сокет и дешифрование не работает - PullRequest
0 голосов
/ 25 апреля 2019

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

Я сделал версию без сети.Мне удалось отправить небольшой файл размером до 8 КБ в другой версии

Моя программа основана на функциях, поэтому программа отходит от главного меню к другим меню и функциям.Поскольку есть немного прыжков, было бы лучше, чтобы показать весь код.https://github.com/BaconBombz/Dencryptor/blob/Version-2.0/Dencryptor.py

Разъем подключается, и все необходимые данные отправляются.Затем файл шифруется AES и отправляется через сокет.Принимающая сторона записывает зашифрованные данные в файл и расшифровывает их.Программа скажет, что файл был отправлен, но на приемном конце программа выдает структурную ошибку, потому что файл, который должен иметь зашифрованные данные, пуст.

1 Ответ

1 голос
/ 25 апреля 2019

Код слишком ненастоящий - минимальный , поэтому вот минимальный пример загрузки незашифрованного файла.Кроме того, TCP является потоковым протоколом, и использование спящих для разделения ваших данных некорректно.Вместо этого определите протокол для потока байтов.Это протокол моего примера:

  1. Откройте соединение.
  2. Отправьте имя в кодировке UTF-8, а затем новую строку.
  3. Отправьте закодированный файлразмер в десятичном виде с последующим переводом строки.
  4. Отправьте байты файла.
  5. Закройте соединение.

Примечание Код Python 3.Python 2 мертв для меня.Поддержка заканчивается в следующем году, так что обновите!

server.py

from socket import *
import os

CHUNKSIZE = 1_000_000

# Make a directory for the received files.
os.makedirs('Downloads',exist_ok=True)

sock = socket()
sock.bind(('',5000))
sock.listen(1)

with sock:
    while True:
        client,addr = sock.accept()

        # Use a socket.makefile() object to treat the socket as a file.
        # Then, readline() can be used to read the newline-terminated metadata.
        with client, client.makefile('rb') as clientfile:
            filename = clientfile.readline().strip().decode()
            length = int(clientfile.readline())
            print(f'Downloading {filename}:{length}...')
            path = os.path.join('Downloads',filename)

            # Read the data in chunks so it can handle large files.
            with open(path,'wb') as f:
                while length:
                    chunk = min(length,CHUNKSIZE)
                    data = clientfile.read(chunk)
                    if not data: break # socket closed
                    f.write(data)
                    length -= len(data)

            if length != 0:
                print('Invalid download.')
            else:
                print('Done.')

client.py

from socket import *
import os

CHUNKSIZE = 1_000_000

filename = input('File to upload: ')

sock = socket()
sock.connect(('localhost',5000))
with sock,open(filename,'rb') as f:
    sock.sendall(filename.encode() + b'\n')
    sock.sendall(f'{os.path.getsize(filename)}'.encode() + b'\n')

    # Send the file in chunks so large files can be handled.
    while True:
        data = f.read(CHUNKSIZE)
        if not data: break
        sock.sendall(data)
...