-1

我编写了这个原型代码来加密一些文本(反之亦然)。当我将命令设置为self.get()whileself.write正常工作时,我不断收到此错误。我不知道是什么导致了这个错误或如何解决它......帮助......

from cryptography.fernet import Fernet

class EncodingText:
    def __init__(self):
        self.key = Fernet.generate_key()
        self.f = Fernet(self.key)
        self.get()

    def write(self):
        stuff = "hello there".encode()
        token = self.f.encrypt(stuff)
        open_file_for_edit = open("file.txt", 'wb')
        open_file_for_edit.write(token)
        open_file_for_edit.close()

    def get(self):
        read_file = open("file.txt", 'rb')
        reading = read_file.read()
        print(reading)
        token = self.f.decrypt(reading)
        print(token)
        read_file.close()


if __name__ == "__main__":
    EncodingText()

我得到的错误如下:

Traceback (most recent call last):
  File "C:\Users\xoxo\AppData\Local\Programs\Python\Python38-32\lib\site-packages\cryptography\fernet.py", line 113, in _verify_signature
    h.verify(data[-32:])
  File "C:\Users\xoxo\AppData\Local\Programs\Python\Python38-32\lib\site-packages\cryptography\hazmat\primitives\hmac.py", line 70, in verify
    ctx.verify(signature)
  File "C:\Users\xoxo\AppData\Local\Programs\Python\Python38-32\lib\site-packages\cryptography\hazmat\backends\openssl\hmac.py", line 78, in verify
    raise InvalidSignature("Signature did not match digest.")
cryptography.exceptions.InvalidSignature: Signature did not match digest.

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "c:/Users/xoxo/Desktop/Python Programs/xoxo/xoxo.py", line 26, in <module>
    EncodingText()
  File "c:/Users/xoxo/Desktop/Python Programs/xoxo/xoxo.py", line 7, in __init__
    self.get()
  File "c:/Users/xoxo/Desktop/Python Programs/xoxo/xoxo.py", line 20, in get
    tokenf = self.f.decrypt(reading)
  File "C:\Users\xoxo\AppData\Local\Programs\Python\Python38-32\lib\site-packages\cryptography\fernet.py", line 76, in 
decrypt
    return self._decrypt_data(data, timestamp, ttl, int(time.time()))
  File "C:\Users\xoxo\AppData\Local\Programs\Python\Python38-32\lib\site-packages\cryptography\fernet.py", line 125, in _decrypt_data
    self._verify_signature(data)
  File "C:\Users\xoxo\AppData\Local\Programs\Python\Python38-32\lib\site-packages\cryptography\fernet.py", line 115, in _verify_signature
    raise InvalidToken
cryptography.fernet.InvalidToken
4

1 回答 1

1

让我们逐行浏览代码:

  1. 在方法中__init__

    1. 第 1 行:密钥生成。

      self.key = Fernet.generate_key()  # this is called
      

      每次调用该方法时,我们都会生成一个随机密钥。

    2. 第 2 行:密码生成

      self.f = Fernet(self.key)
      

      我们正在创建一个具有完全随机密钥的密码。

    3. 第 3 行:解密

      self.get()
      

      我们正在调用一种新方法。

  2. 在方法中get

    1. 第 1、2 和 3 行:读取文件

      read_file = open("file.txt", 'rb')
      reading = read_file.read()
      print(reading)
      

      在这里,有两件事是可能的。

      1. 该文件在路径中丢失,并且FileNotFoundError被引发并且程序停止。

      2. 该文件存在。

      假设文件存在(#2)。将读取文件内容并打印内容。

    2. 第 4 行:解密

      token = self.f.decrypt(reading)
      

      在这里,我们的文件内容将被解密。请记住,从 1.1.1 和 1.1.2 开始,每次调用我们的程序时,都会生成一个随机密钥,并使用随机密钥生成密码。

      由于Fernet,通过实现,使用AES,这是一个对称密码,我们需要相同的密钥来加密和解密。

      但是,在 1.1.1 和 1.1.2 中,每次程序运行时我们都会生成一个随机密钥。

      这解释了错误消息。密码试图从使用完全随机密钥和另一个随机密钥加密的文件中解密数据,这会导致解密不正确。


如果在self.write()之前插入self.get(),程序运行。这是因为相同的密钥用于解密数据。

于 2020-11-03T09:03:37.513 回答