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]
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
Vous devez vous connecter pour publier un commentaire.
J'ai pris un peu plus près de votre code, et vu qu'il y avait plusieurs problèmes avec elle. La première est que la crypto fonctions avec des octets, pas de texte. Il est donc préférable de conserver les données comme une chaîne d'octets. Cela se fait simplement en mettant un 'b' dans la mode. De cette façon, vous pouvez vous débarrasser de tous le codage et les octets de conversion que vous étiez en train de faire.
J'ai réécrit le code complet est également à l'aide de nouveaux Python idiomes. Ici, il est.
Avez-vous essayé avec .docx ou toute nature à l'exception .les fichiers txt?
Je suis sceptique sur le
plaintext.rstrip(b"\0")
dans ledecrypt
fonction. Que faire si le texte en clair est terminée avec des octets nuls? Si je crypter un fichier avec ce code, n'est-il pas un risque que le fichier soit corrompu après déchiffrement?Est-il un moyen de rendre le décryptage des fichiers plus vite ? J'ai des fichiers mp3 chiffrés et déchiffrés.
Vous avez pu lire la source en morceaux, plutôt que de le sucer dans la chose comme cela ne. c'est pour les petits fichiers texte.
OriginalL'auteur Keith
En Python 3 (qui sont clairement à l'aide de) le mode par défaut pour les fichiers que vous ouvrez est du texte, pas de binaire. Lorsque vous lisez le fichier, vous obtenez des chaînes de caractères plutôt que des tableaux d'octets. Qui ne vont pas avec le chiffrement.
Dans votre code, vous devez le remplacer:
avec:
La même pour lorsque vous ouvrez le fichier pour l'écriture. À ce stade, vous pouvez vous débarrasser de toutes les différentes occurrences où vous convertir en chaîne de caractères en binaire et vice versa.
Par exemple, cela peut aller loin:
OriginalL'auteur SquareRootOfTwentyThree