Partage
  • Partager sur Facebook
  • Partager sur Twitter

cryptography.fernet.InvalidToken

Sujet résolu
    4 octobre 2021 à 12:24:57

    Bonjour,

    Je fais un script combinant deux tutoriel.

    Un pour crypter des données, l'autre pour les cacher dans une image.

    Voici mon code en entier : 

    from cryptography.fernet import Fernet
    
    def write_key():
        key = Fernet.generate_key()
        with open("key.crt", "wb") as key_file:
            key_file.write(key)
    
    def load_key():
        return open("key.crt", "rb").read()
    
    def encrypt(filename, key, file2):
        """
        Given a filename (str) and key (bytes), it encrypts the file and write it
        """
        f = Fernet(key)
        with open(filename, "rb") as file:
            # read all file data
            file_data = file.read()
        # encrypt data
        encrypted_data = f.encrypt(file_data)
        # write the encrypted file
        with open(file2, "ab") as file:
            file.write(encrypted_data)
        print(encrypted_data)
    
    def decrypt(filename, key, file2):
        f = Fernet(key)
        with open(filename, "rb") as file, open(file2, "wb") as out:
            content = file.read()
            offset = content.index(bytes.fromhex('FFD9'))
            file.seek(offset+2)
            # read the encrypted data
            encrypted_data = file.read()
            # decrypt data
            decrypted_data = f.decrypt(encrypted_data)
            # write the original file
            out.write(decrypted_data)
            print(decrypted_data)
    
    
    if __name__ == "__main__":
        import argparse
        parser = argparse.ArgumentParser(description="Simple File Encryptor Script")
        parser.add_argument("file", help="File to encrypt/decrypt")
        parser.add_argument("file2", help="File to save content")
        parser.add_argument("-g", "--generate-key", dest="generate_key", action="store_true",
                            help="Whether to generate a new key or use existing")
        parser.add_argument("-e", "--encrypt", action="store_true",
                            help="Whether to encrypt the file, only -e or -d can be specified.")
        parser.add_argument("-d", "--decrypt", action="store_true",
                            help="Whether to decrypt the file, only -e or -d can be specified.")
    
        args = parser.parse_args()
        file = args.file
        file2 = args.file2
        generate_key = args.generate_key
    
        if generate_key:
            write_key()
        # load the key
        key = load_key()
    
        encrypt_ = args.encrypt
        decrypt_ = args.decrypt
    
        if encrypt_ and decrypt_:
            raise TypeError("Please specify whether you want to encrypt the file or decrypt it.")
        elif encrypt_:
            encrypt(file, key, file2)
        elif decrypt_:
            decrypt(file, key, file2)
        else:
            raise TypeError("Please specify whether you want to encrypt the file or decrypt it.")
    

    Voici l'erreur donné par la console lors du décryptage des données :

    D:\crypt>main.py msg.txt img.jpg -g -e
    b'gAAAAABhWtUcdGC24sXOF4OLYVNeQtJuOlUazWDLzEnr6kzPZ4ghjlig0DB5u3o7jtyof_MHA0pLqWezWo8_XnyQdfjaVd4HZg=='
    
    D:\crypt>main.py img.jpg msg.txt -d
    Traceback (most recent call last):
      File "D:\Programmes\Python\lib\site-packages\cryptography\fernet.py", line 124, in _verify_signature
        h.verify(data[-32:])
      File "D:\Programmes\Python\lib\site-packages\cryptography\hazmat\primitives\hmac.py", line 78, in verify
        ctx.verify(signature)
      File "D:\Programmes\Python\lib\site-packages\cryptography\hazmat\backends\openssl\hmac.py", line 76, 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 "D:\crypt\main.py", line 71, in <module>
        decrypt(file, key, file2)
      File "D:\crypt\main.py", line 35, in decrypt
        decrypted_data = f.decrypt(encrypted_data)
      File "D:\Programmes\Python\lib\site-packages\cryptography\fernet.py", line 85, in decrypt
        return self._decrypt_data(data, timestamp, time_info)
      File "D:\Programmes\Python\lib\site-packages\cryptography\fernet.py", line 142, in _decrypt_data
        self._verify_signature(data)
      File "D:\Programmes\Python\lib\site-packages\cryptography\fernet.py", line 126, in _verify_signature
        raise InvalidToken
    cryptography.fernet.InvalidToken

    Si vous comprenez pourquoi, merci de me répondre.

    Ascol

    • Partager sur Facebook
    • Partager sur Twitter
      4 octobre 2021 à 18:54:36

      a priori, ça fonctionne une première fois sur un fichier image qui n'a pas été passé au script.

      Si on utilise le même fichier une seconde fois (donc avec déjà des données "cryptées" une fois), on a cette erreur; je pense donc que cette erreur se produit parce que le fichier image est crypté 2 fois. 

      • Partager sur Facebook
      • Partager sur Twitter
        4 octobre 2021 à 19:37:03

        Il me dit que c'est un problème de clé

        << File "D:\Programmes\Python\lib\site-packages\cryptography\hazmat\backends\openssl\hmac.py", line 76, 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:>>

        <<cryptography.fernet.InvalidToken>>
        La réception de la clé pose problème.

        -
        Edité par AscolRusche 4 octobre 2021 à 19:41:04

        • Partager sur Facebook
        • Partager sur Twitter
          4 octobre 2021 à 19:47:33

          Faut pas toucher à l'entête du fichier image. Faut travailler sur l'image, pas sûr le fichier image.

          -
          Edité par josmiley 4 octobre 2021 à 19:49:10

          • Partager sur Facebook
          • Partager sur Twitter

          Python c'est bon, mangez-en. 

            5 octobre 2021 à 21:17:36

            Oui ça marche merci beaucoup

            • Partager sur Facebook
            • Partager sur Twitter

            cryptography.fernet.InvalidToken

            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
            × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
            • Editeur
            • Markdown