我正在尝试使用套接字和cryptography.fernet库在本地网络上发送加密的字符串,但是当接收到字节时,会引发“ cryptography.fernet.InvalidToken”错误。如果我在一个文件中进行加密和解密,它确实可以工作,但是如果我在本地或两台不同的计算机上托管服务器和客户端,则无法工作。
服务器
import socket
from cryptography.fernet import Fernet
crypt = Fernet('sqcyNL5kz2mxWb1KL2QSZWY-GCERE-scEgWBbvq9CCk=')
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
s.bind((host, port))
s.listen(10)
conn, addr = s.accept()
with conn:
while True:
messageEncrypt = conn.recv(2048)
message = crypt.decrypt(messageEncrypt, None).decode()
print(message)
客户
import socket
from cryptography.fernet import Fernet
crypt = Fernet('sqcyNL5kz2mxWb1KL2QSZWY-GCERE-scEgWBbvq9CCk=')
message = 'sentence'
messageEncode = message.encode()
messageEncrypt = crypt.encrypt(messageEncode)
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
s.connect((host, port))
s.sendall(messageEncrypt)
s.close()
客户端对消息进行编码,加密然后发送,然后客户端将其接收并解密。服务器确实可以正确解密和打印消息,但是会立即崩溃,从而阻止程序的其余部分运行。 奇怪的是,解密后它有足够的时间在崩溃前打印。有谁知道为什么会这样?
服务器控制台:
sentence
Traceback (most recent call last):
File "E:/Google Drive/School/###/###/python/project/morseSrv.py", line 50, in <module>
message = crypt.decrypt(messageEncrypt).decode()
File "C:\Python\lib\site-packages\cryptography\fernet.py", line 74, in decrypt
timestamp, data = Fernet._get_unverified_token_data(token)
File "C:\Python\lib\site-packages\cryptography\fernet.py", line 92, in _get_unverified_token_data
raise InvalidToken
cryptography.fernet.InvalidToken
Process finished with exit code 1
答案 0 :(得分:0)
问题是由服务器中的while True循环引起的。当它接收到数据时,它将再次经历循环,但不会等待新数据。我已经对其进行了修改,以使其在处理完消息后脱离循环。