Crypter un Fichier à l'aide d'AES et de PyCrypto en Python 3
Je suis l'aide de PyCrypto pour crypter un fichier binaire en utilisant AES en mode CBC (Python 3.2.3 64 bits et PyCrypto 2.6). En utilisant le code suivant: http://eli.thegreenplace.net/2010/06/25/aes-encryption-of-files-in-python-with-pycrypto/
Mais en cours d'exécution dans le message d'erreur suivant: ValueError: IV doit être de 16 octets de long.
Voici le code:
def encryptFile(key, in_filename, out_filename=None, chunksize=64*1024):
""" Encrypts a file using AES (CBC mode) with the
given key.
key:
The encryption key - a string that must be
either 16, 24 or 32 bytes long. Longer keys
are more secure.
in_file:
Input file
out_file:
If None, a StringIO will be returned.
chunksize:
Sets the size of the chunk which the function
uses to read and encrypt the file. Larger chunk
sizes can be faster for some files and machines.
chunksize must be divisible by 16.
"""
if not out_filename:
out_filename = in_filename + '.enc'
iv = ''.join(chr(random.randint(0, 0xFF)) for i in range(16))
encryptor = AES.new(key, AES.MODE_CBC, iv)
filesize = os.path.getsize(in_filename)
with open(in_filename, 'rb') as infile:
with open(out_filename, 'wb') as outfile:
outfile.write(struct.pack('<Q', filesize))
outfile.write(iv)
while True:
chunk = infile.read(chunksize)
if len(chunk) == 0:
break
elif len(chunk) % 16 != 0:
chunk += ' ' * (16 - len(chunk) % 16)
outfile.write(encryptor.encrypt(chunk))
J'ai essayé de chercher et d'expérimenter, mais ne semble pas possible de le faire fonctionner. Python est assez nouveau pour moi et si le chiffrement est. Toute aide serait grandement appréciée. Merci à l'avance.
OriginalL'auteur user1445421 | 2012-06-08
Vous devez vous connecter pour publier un commentaire.
Comme le PyCrypto API dit, le IV doit être une chaîne d'octets, pas un texte chaîne.
Votre bout de code va fonctionner en Python 2, parce qu'ils sont la même chose (qui est, ils sont tous de la classe
str
, à moins que vous traitez avec le texte Unicode). En Python 3, ils sont deux totalement différents types:bytes
etstr
.Le code doit donc être:
Ce code (à côté de ne pas être cryptographique sécurisé comme Federico points) ne fonctionneront pas correctement en Python 2. L'alternative suivante fonctionne bien dans les deux cas, il est sûr et il est plus efficace:
Je suis d'accord, mais ma suggestion est d'utiliser PyCrypto de
Random
module, pasrandom.randint
.OriginalL'auteur SquareRootOfTwentyThree
je suppose que je suis trop en retard, mais simple-crypte fournit un simple wrapper autour de pycrypto que (1) permettrait de résoudre votre problème et (2) comprend la clé de l'expansion et un hmac pour la détection de modifications (il utilise AES256 CTR mode).
OriginalL'auteur andrew cooke