通过套接字发送加密的数据和解密不起作用 [英] Sending Encrypted Data Through Socket And Decrypting Doesn't Work

查看:187
本文介绍了通过套接字发送加密的数据和解密不起作用的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I am creating a simple encryption software. The problem I currently have is that sending encrypted aes file data through a socket doesn't work. At the receiving end, the file that should be written to is empty. I have looked through my code for a good while and can't see to solve it.

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

I have made a version without networking. I have been able to send a small file up to 8 KB on a different version

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

My Program Is Function Based So The Program Branches Off From The Main Menu To Other Menues And Functions. Since There is A Bit Of Jumping, It Would Be Best To Show All The Code. https://github.com/BaconBombz/Dencryptor/blob/Version-2.0/Dencryptor.py

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

The socket connects, and all required data is sent. Then, the file is AES encrypted and sent through the socket. The Receiving end writes encrypted data to a file and decrypts it. The program will say the file was sent but on the recieving end, the program spits out a struct error because the file that should have the encrypted data is empty.

推荐答案

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

The code is too non-minimal so here's a minimal example of downloading an unencrypted file. Also, TCP is a streaming protocol and using sleeps to separate your data is incorrect. Define a protocol for the byte stream instead. This is the protocol of my example:


  1. 打开连接。

  2. 发送UTF-8 -编码的文件名后跟换行符。

  3. 以十进制形式发送编码后的文件大小,后跟换行符。

  4. 发送文件字节。
  5. >
  6. 关闭连接。

  1. Open the connection.
  2. Send the UTF-8-encoded filename followed by a newline.
  3. Send the encoded file size in decimal followed by a newline.
  4. Send the file bytes.
  5. Close the connection.

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

Note Python 3 code. Python 2 is dead to me. Support ends next year for it so upgrade!

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)

这篇关于通过套接字发送加密的数据和解密不起作用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆