Python PyCrypto verschlüsseln/entschlüsseln von text-Dateien mit AES
Ich habe bereits ein funktionierendes Programm, aber das einzige, was nicht funktioniert, ist die decrypt_file()
Funktion, die ich habe. Ich kann immer noch kopieren Sie den verschlüsselten text aus der Datei aus und steckte es in meine decrypt()
Funktion und es funktioniert, aber wenn ich versuche, mit meinem vermeintlichen-zu-sein handy decrypt_file()
Funktion wirft einen Fehler. Jetzt weiß ich zu 99,999% sicher, dass meine encrypt()
und decrypt()
Funktionen sind in Ordnung, aber es ist etwas mit den bytes und strings Konvertierung, wenn ich Lesen und Kodieren die text-Datei, wird ein Fehler; ich kann einfach nicht finden, die auflegen. Bitte um Hilfe!!
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)
Den text-Datei, die ich verschlüsselt:
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, wenn Sie versuchen 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 ersetzen Sie die Zeile 45 mit: plaintext += ((str(bytes([x])))) * x
dies ist die Fehlermeldung die 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]
- es ist die
bytes
Objekt. Das ist ein built-in-Typ. Sie wusste nicht, definieren Sie es in das Programm, so dass es mit einem built-in-Objekt. Ich denke, du meintestplaintext
. - So werden Sie sagen, das problem ist in Zeile 46? Sorry, ich bin irgendwie müde, auf diese und nicht wirklich klar zu denken.
- Es sagt, Recht in den stacktrace der Zeile und dem code.
- Sorry, Zeilen 45 und 46 wurden einige meiner eigenen debugging-Art Sachen, so dass ich entfernt und ersetzt die Fehler, die mit meinem eigentlichen Fehler.
- Okay ich habe auch ein weiterer wichtiger Fehler, den ich bekomme, wenn ich zu beheben versuchen die bytes Ding, es sei denn, meine 'fix' ist falsch.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nahm ich einen genaueren Blick auf Ihren code, und sah, dass es gab einige Probleme mit ihm. Erste ist, dass die crypto-Funktionen mit bytes, nicht auf text. So ist es besser, nur halten Sie die Daten als byte-string. Dies geschieht ganz einfach, indem Sie ein 'b' - Zeichen in der mode. Auf diese Weise können Sie loszuwerden, alle die Kodierung und bytes, die Umwandlung, die Sie versuchten zu tun.
Schrieb ich den kompletten code auch mit neueren Python idioms. Hier ist es.
plaintext.rstrip(b"\0")
imdecrypt
Funktion. Was ist, wenn der plaintext endete mit null-bytes? Wenn ich eine Datei verschlüsseln mit diesem code gibt es nicht die Gefahr, dass die Datei beschädigt nach der Entschlüsselung?In Python 3 (welches Sie klar mit) der Standard-Modus für Dateien, die Sie öffnen, ist der text, nicht Binär. Wenn Sie aus der Datei Lesen, bekommst du strings statt byte-arrays. Das geht nicht zusammen mit Verschlüsselung.
In Ihrem code, den Sie ersetzen soll:
mit:
Das gleiche für, wenn Sie öffnen die Datei zum schreiben. An diesem Punkt, können Sie loszuwerden, alle die verschiedenen Vorkommnissen, wo Sie konvertieren von string in Binär und Umgekehrt.
So können Weggehen: