Python PyCrypto verschlüsselt / entschlüsselt Textdateien mit AES

Ich habe schon ein Arbeitsprogramm, aber das einzige, was nicht funktioniert, ist die Funktion decrypt_file (), die ich habe. Ich kann noch den verschlüsselten Text aus der Datei kopieren und ihn in meine entschlüsselung () -Funktion bringen und es funktionieren lassen, aber wenn ich versuche, meine angeblich-hand-decrypt_file () -Funktion zu verwenden, wirft es einen Fehler auf. Jetzt weiß ich, 99.999% sicher, dass meine encrypt () und entschlüsseln () Funktionen sind in Ordnung, aber es gibt etwas mit der Bytes und Strings Umwandlung, wenn ich lese und kodiere die Textdatei, die einen Fehler wirft; Ich kann den Hangup nicht finden. Bitte helfen Sie!

Mein Programm:

from Crypto import Random from Crypto.Cipher import AES def encrypt(message, key=None, key_size=256): def pad(s): x = AES.block_size - len(s) % AES.block_size return s + ((bytes([x])) * x) padded_message = pad(message) if key is None: key = Random.new().read(key_size // 8) iv = Random.new().read(AES.block_size) cipher = AES.new(key, AES.MODE_CBC, iv) return iv + cipher.encrypt(padded_message) def decrypt(ciphertext, key): unpad = lambda s: s[:-s[-1]] iv = ciphertext[:AES.block_size] cipher = AES.new(key, AES.MODE_CBC, iv) plaintext = unpad(cipher.decrypt(ciphertext))[AES.block_size:] return plaintext def encrypt_file(file_name, key): f = open(file_name, 'r') plaintext = f.read() plaintext = plaintext.encode('utf-8') enc = encrypt(plaintext, key) f.close() f = open(file_name, 'w') f.write(str(enc)) f.close() def decrypt_file(file_name, key): def pad(s): x = AES.block_size - len(s) % AES.block_size return s + ((str(bytes([x]))) * x) f = open(file_name, 'r') plaintext = f.read() x = AES.block_size - len(plaintext) % AES.block_size plaintext += ((bytes([x]))) * x dec = decrypt(plaintext, key) f.close() f = open(file_name, 'w') f.write(str(dec)) f.close() key = b'\xbf\xc0\x85)\x10nc\x94\x02)j\xdf\xcb\xc4\x94\x9d(\x9e[EX\xc8\xd5\xbfI{\xa2$\x05(\xd5\x18' encrypt_file('to_enc.txt', key) 

Die Textdatei, die ich verschlüsselt habe:

 b';c\xb0\xe6Wv5!\xa3\xdd\xf0\xb1\xfd2\x90B\x10\xdf\x00\x82\x83\x9d\xbc2\x91\xa7i M\x13\xdc\xa7' 

Mein Fehler beim Versuch decrypt_file :

  Traceback (most recent call last): File "C:\Python33\testing\test\crypto.py", line 56, in <module> decrypt_file('to_enc.txt', key) File "C:\Python33\testing\test\crypto.py", line 45, in decrypt_file plaintext += ((bytes([x]))) * x TypeError: Can't convert 'bytes' object to str implicitly [Finished in 1.5s] 

Wenn ich die Zeile 45 durch: plaintext += ((str(bytes([x])))) * x , das ist der Fehler, den ich bekomme:

 Traceback (most recent call last): File "C:\Python33\testing\test\crypto.py", line 56, in <module> decrypt_file('to_enc.txt', key) File "C:\Python33\testing\test\crypto.py", line 46, in decrypt_file dec = decrypt(plaintext, key) File "C:\Python33\testing\test\crypto.py", line 23, in decrypt plaintext = unpad(cipher.decrypt(ciphertext))[AES.block_size:] File "C:\Python33\lib\site-packages\Crypto\Cipher\blockalgo.py", line 295, in decrypt return self._cipher.decrypt(ciphertext) ValueError: Input strings must be a multiple of 16 in length [Finished in 1.4s with exit code 1] 

2 Solutions collect form web for “Python PyCrypto verschlüsselt / entschlüsselt Textdateien mit AES”

Ich habe einen genaueren Blick auf Ihren Code geworfen und sah, dass es mehrere Probleme mit ihm gab. Erstens ist das, dass die Krypto mit Bytes funktioniert, nicht Text. So ist es besser, die Daten einfach als Byte-String zu halten. Dies geschieht einfach, indem man ein "b" Zeichen in den Modus setzt. Auf diese Weise können Sie alle Kodierung und Bytes Umwandlung, die Sie versuchen zu tun, loszuwerden.

Ich habe den ganzen Code auch mit neueren Python-Idiomen umgeschrieben. Hier ist es.

 #!/usr/bin/python3 from Crypto import Random from Crypto.Cipher import AES def pad(s): return s + b"\0" * (AES.block_size - len(s) % AES.block_size) def encrypt(message, key, key_size=256): message = pad(message) iv = Random.new().read(AES.block_size) cipher = AES.new(key, AES.MODE_CBC, iv) return iv + cipher.encrypt(message) def decrypt(ciphertext, key): iv = ciphertext[:AES.block_size] cipher = AES.new(key, AES.MODE_CBC, iv) plaintext = cipher.decrypt(ciphertext[AES.block_size:]) return plaintext.rstrip(b"\0") def encrypt_file(file_name, key): with open(file_name, 'rb') as fo: plaintext = fo.read() enc = encrypt(plaintext, key) with open(file_name + ".enc", 'wb') as fo: fo.write(enc) def decrypt_file(file_name, key): with open(file_name, 'rb') as fo: ciphertext = fo.read() dec = decrypt(ciphertext, key) with open(file_name[:-4], 'wb') as fo: fo.write(dec) key = b'\xbf\xc0\x85)\x10nc\x94\x02)j\xdf\xcb\xc4\x94\x9d(\x9e[EX\xc8\xd5\xbfI{\xa2$\x05(\xd5\x18' encrypt_file('to_enc.txt', key) #decrypt_file('to_enc.txt.enc', key) 

In Python 3 (die Sie eindeutig verwenden) ist der Standardmodus für Dateien, die Sie öffnen, Text, nicht binär. Wenn du aus der Datei liest, bekommst du eher Strings als Byte-Arrays. Das geht nicht mit Verschlüsselung.

In deinem Code solltest du ersetzen:

 open(file_name, 'r') 

mit:

 open(file_name, 'rb') 

Das gleiche für, wenn Sie die Datei zum Schreiben öffnen. An diesem Punkt können Sie loswerden alle die verschiedenen Vorkommen, wo Sie konvertieren von String zu binary und umgekehrt.

Zum Beispiel kann das weggehen:

 plaintext = plaintext.encode('utf-8') 
  • Verschlüsselung / UnEncrypt Python Scripts in C
  • Ein guter Weg, um Datenbankfelder zu verschlüsseln?
  • Xor Verschlüsselung / Entschlüsselung einer Datei mit Python 3
  • Python - GPG entschlüsselt funktioniert aber GNUPG nicht
  • Passwortschutz Python
  • Python-Implementierung von sha512_crypt.c
  • Verschlüsselung einer JPG-Datei mit picrypro's AES fehlgeschlagen
  • AES Python Verschlüsselung und Ruby Verschlüsselung - unterschiedliche Verhalten?
  • Python AES Entschlüsselungsroutine (Code Hilfe)
  • Versuchen, RSA-Signatur mit Python aus C-Code zu erzeugen
  • Alte Python Hashing von links nach rechts - warum ist es schlecht?
  • Python ist die beste Programmiersprache der Welt.