数据在aes文件传输python tkinter上损坏
我正在做一个项目,你可以通过套接字发送一个文件,它是aes加密的。它可以工作它加密数据并通过套接字发送,它可以很好地解密,但是下面的图像被弄乱了,这是之前图像的例子,之后我如何更正 之前: 之后: 加密和解密在我创建的一个单独的模块中,这就是为什么它们像下面一样被引用的原因 加密和解密代码:数据在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
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的填充函数。只需确保填充最后一个块,而不管其大小,否则将无法正确取消填充。