Sending Encrypted Data Through Socket And Decrypting Doesn't Work

后端 未结 1 1091
后悔当初
后悔当初 2020-12-07 06:08

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 fi

相关标签:
1条回答
  • 2020-12-07 06:37

    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. 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.

    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)
    
    0 讨论(0)
提交回复
热议问题