数据在aes文件传输python tkinter上损坏

数据在aes文件传输python tkinter上损坏,python,sockets,encryption,aes,Python,Sockets,Encryption,Aes,我正在做一个项目,你可以通过套接字发送一个文件,它是aes加密的。它可以工作它加密数据并通过套接字发送,它可以很好地解密,但是下面的图像被弄乱了,这是之前图像的例子,之后我如何更正 之前: 之后: 加密和解密在我创建的一个单独的模块中,这就是为什么它们像下面一样被引用的原因 加密和解密代码: def encrypt(key, data, iv): encryptor = AES.new(key, AES.MODE_CBC, iv) return encryptor.encry

我正在做一个项目,你可以通过套接字发送一个文件,它是aes加密的。它可以工作它加密数据并通过套接字发送,它可以很好地解密,但是下面的图像被弄乱了,这是之前图像的例子,之后我如何更正

之前:

之后:

加密和解密在我创建的一个单独的模块中,这就是为什么它们像下面一样被引用的原因

加密和解密代码:

def encrypt(key, data, iv):
    encryptor = AES.new(key, AES.MODE_CBC, iv)
    return encryptor.encrypt(data)

def decrypt(key, data, iv):
    decryptor = AES.new(key, AES.MODE_CBC, iv)
    return decryptor.decrypt(data)
服务器代码:

s = socket.socket()
s.bind(("127.0.0.1", 5000))
s.listen(1)
c, addr = self.s.accept

name = c.recv(1024)
name = name.split("/")[-1]

newFile = open(self.curpath + name, "wb")
stop = False

while True:
    data = c.recv(24*1024)

    print(data[-4:])
    if data[-4:] == "DONE":
        break

    data = decrypt(self.key, data, self.iv)
    newFile.write(data)

    print("STOP")
    newFile.close()
客户端代码:

s. = socket.socket()
s.connect(("127.0.0.1", 5000)

item = "Splash.png"
s.send(item)

with open(item, "rb") as fp:
        while True:
            chunk = fp.read(64*1024)

            if len(chunk) == 0:
                break
            elif len(chunk) % 16 != 0:
                chunk += " " * (16 - len(chunk) % 16)
            s.send(encrypt(self.key, chunk, self.iv))

s.send("DONE")
print("Done")

通过使用@t.m.adam comment,我能够使用
.rstrip(“”
)使软件正确运行通过使用@t.m.adam comment,我能够使用
.rstrip(“”
使软件正确运行示例代码无法运行,因为创建连接的代码丢失了。@snakecharmerb很抱歉,我刚刚更新了它!您正在向发送的数据块添加填充,以使其大小达到16的倍数,但在接收数据块时您不会删除该填充,而且无论如何也不可能删除,因为无法确定添加了多少填充。@jasonharper填充的好方法是什么?您可以尝试
.rstrip(“”)
删除右侧空格。但是,最好使用PKCS7填充。如果您正在使用Pycryptodome,您将在
Crypto.Util.padding
中找到填充函数。如果您使用的是Pycrypto,则可以复制Pycryptodome的填充函数。只需确保填充最后一个块而不管其大小,否则将无法正确取消填充。示例代码无法运行,因为创建连接的代码丢失。@snakecharmerb很抱歉,我刚刚更新了它!您正在向发送的数据块添加填充,以使其大小达到16的倍数,但在接收数据块时您不会删除该填充,而且无论如何也不可能删除,因为无法确定添加了多少填充。@jasonharper填充的好方法是什么?您可以尝试
.rstrip(“”)
删除右侧空格。但是,最好使用PKCS7填充。如果您正在使用Pycryptodome,您将在
Crypto.Util.padding
中找到填充函数。如果您使用的是Pycrypto,则可以复制Pycryptodome的填充函数。只需确保填充最后一个块,而不管其大小,否则将无法正确取消填充。