通过网络发送加密消息时的Cryptography.fernet.InvalidToken

时间:2019-07-02 02:03:48

标签: python python-3.x networking encryption cryptography

我正在尝试使用套接字和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

1 个答案:

答案 0 :(得分:0)

问题是由服务器中的while True循环引起的。当它接收到数据时,它将再次经历循环,但不会等待新数据。我已经对其进行了修改,以使其在处理完消息后脱离循环。