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 meintest plaintext.
  • 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.
InformationsquelleAutor Zach King | 2013-12-31
Schreibe einen Kommentar