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
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.
× 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.
Python c'est bon, mangez-en.