Python 3 - 使用 PyCrypto 的套接字聊天加密给出 UnicodeDecodeError

Python 3 - Socket Chat Encryption with PyCrypto gives UnicodeDecodeError

我正在尝试在 Python 3 中设置加密的套接字聊天,但是在解码 UTF-8 时出现错误。

代码如下:

客户:

from Crypto.Cipher import AES 
from Crypto import Random 
import socket, sys
host = 'localhost'
port = 5558
IV = Random.new().read(16) 
c = AES.new('abcd1234efgh5678', AES.MODE_CFB, IV) 
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((host,port))
data = 'hey'.encode('utf-8') # 1
data = c.encrypt(data) # 2
s.sendall(data)

服务器:

from Crypto.Cipher import AES 
from Crypto import Random 
import socket, sys
host = ''
port = 5558
IV = Random.new().read(16) 
c = AES.new('abcd1234efgh5678', AES.MODE_CFB, IV) 
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.bind((host,port))
s.listen(10)
sock, addr = s.accept()
data = sock.recv(512)


data = c.decrypt(data) # 1
data = data.decode('utf-8') # 2
print(data)

运行安装这些程序后,服务器出现此错误:

UnicodeDecodeError:'utf-8'编解码器无法解码位置 0 中的字节 0xa5:起始字节无效

因此,我尝试将服务器代码中的 'utf-8' 更改为 'latin-1',但每次程序 运行 时它都会继续打印不同的 unicode 字符。然后我交换了客户端和服务器中标有注释的 2 行,当然它给出了这个错误:

AttributeError: 'bytes' 对象没有属性 'encode'

我试过 Google 但所有使用 PyCrypto 的程序都使用 Python 2,而不是 3。例如。 Encrypt & Decrypt using PyCrypto AES 256

http://eli.thegreenplace.net/2010/06/25/aes-encryption-of-files-in-python-with-pycrypto/

除了上面的代码使用 // 作为注释(应该是 #)之外,我 运行 下面的代码(删除了所有套接字)并发现了错误:您在解密之前重新初始化 IV。这样你就不会得到原始值 - 只是一些在 utf-8 中可能无法解码的乱码。

您必须将 IV 发送到服务器 (How to communicate AES initialization Vector to client for hybrid cryptosystem)。

from Crypto.Cipher import AES 
from Crypto import Random 

# CLIENT -----------------------------------------
IV = Random.new().read(16) 
c = AES.new('abcd1234efgh5678', AES.MODE_CFB, IV) 
data = 'hey'.encode('utf-8') #  1
data = c.encrypt(data) #  2


# SERVER -----------------------------------------

# THIS IS WHERE YOUR CODE GOES WRONG!
# IV = Random.new().read(16) 

c = AES.new('abcd1234efgh5678', AES.MODE_CFB, IV) 

data = c.decrypt(data) # 1
data = data.decode('utf-8') # 2
print(data)