Python PyCrypto crypter/décrypter des fichiers texte avec les AES

J'ai déjà un programme de travail, mais la seule chose qui ne fonctionne pas est le decrypt_file() fonction de ce que j'ai. Je peux toujours copier le texte crypté dans le fichier et le mettre dans mon decrypt() fonction et qu'il fonctionne, mais lorsque j'essaie d'utiliser mon supposé être à portée de main decrypt_file() la fonction renvoie une erreur. Maintenant, je sais à 99,999% sûr que mon encrypt() et decrypt() fonctions sont beaux, mais il y a quelque chose avec les octets et les chaînes de conversion lorsque je lire et encoder le fichier texte qui renvoie une erreur; j'ai simplement ne peut pas trouver le raccrochage. S'il vous plaît aider!

Mon Programme:

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)

Le fichier texte j'ai crypté:

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

Mon erreur lors de la tentative 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]

Lorsque je remplace la ligne 45: plaintext += ((str(bytes([x])))) * x, c'est l'erreur que je reçois:

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]
c'est le bytes objet. C'est un type. Vous n'avez pas la définir dans le programme donc c'est à l'aide d'un l'objet intégré. Je pense que vous vouliez dire plaintext.
Donc, vous dites que le problème est dans la ligne 46? Désolé je suis un peu fatigué sur ce coup et pas vraiment à penser clairement.
Il est dit dans le stacktrace la ligne et le code.
Désolé, lignes 45 et 46 ont été une partie de ma propre débogage type de choses, donc j'ai enlevé ceux et remplacé l'erreur avec mon erreur réelle.
Bon j'ai aussi ajouté un autre élément important de l'erreur que j'obtiens quand j'essaie de corriger les octets chose, à moins que mon " fix " est incorrecte.

OriginalL'auteur Zach King | 2013-12-31