通过套接字发送加密的数据和解密不起作用

时间:2019-04-24 23:39:56

标签: python-2.7 sockets encryption aes

我正在创建一个简单的加密软件。我目前遇到的问题是通过套接字发送加密的aes文件数据不起作用。在接收端,应写入的文件为空。我已经看了很长时间的代码,看不到要解决它。

我制作了一个没有联网的版本。 我已经能够在不同版本上发送一个最大8 KB的小文件

我的程序基于功能,因此该程序从主菜单分支到其他菜单和功能。由于存在一些跳跃,因此最好显示所有代码。 https://github.com/BaconBombz/Dencryptor/blob/Version-2.0/Dencryptor.py

套接字已连接,并且所有必需的数据已发送。然后,文件经过AES加密并通过套接字发送。接收端将加密的数据写入文件并解密。程序会说该文件已发送,但在接收端,该程序会发出结构错误,因为应该包含加密数据的文件为空。

1 个答案:

答案 0 :(得分:1)

代码太不minimal,因此这是下载未加密文件的最小示例。另外,TCP是一种流协议,使用睡眠来分离数据是不正确的。为字节流定义一个协议。这是我的示例的协议:

  1. 打开连接。
  2. 发送UTF-8编码的文件名,后跟换行符。
  3. 以十进制形式发送编码后的文件大小,后跟换行符。
  4. 发送文件字节。
  5. 关闭连接。

注意Python 3代码。 Python 2对我已经死了。支持将在明年结束,因此请升级!

server.py

.js

client.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.')