web-dev-qa-db-fra.com

AES: les chaînes d'entrée doivent être un multiple de 16 de longueur

Je veux créer un script pour décrypter mes fichiers, mais quand j'essaie d'exécuter mon script puis de me montrer ce message, comment puis-je le corriger?

Traceback (dernier appel le plus récent): Fichier "F:\bug_bounty\decrypt.py", ligne 46, dans le fichier "F:\bug_bounty\decrypt.py", ligne 24, dans le fichier de décryptage "C:\Python27\lib\site-packages\Crypto\Cipher\blockalgo.py ", ligne 295, dans decrypt return self._cipher.decrypt (ciphertext) ValueError: les chaînes d'entrée doivent être un multiple de 16 de longueur

from Crypto.Hash import SHA256
from Crypto.Cipher import AES
import os
import random
import sys


def decrypt(key, filename):
    outFile = os.path.join(os.path.dirname(filename),
                           os.path.basename(filename[11:]))
    chunksize = 64 * 1024
    with open(filename, 'rb') as infile:
        filesize = infile.read(16)
        IV = infile.read(16)

        decryptor = AES.new(key, AES.MODE_CBC, IV)

        with open(outFile, 'wb') as outfile:
            while True:
                chunk = infile.read(chunksize)
                if len(chunk) == 0:
                    break

                outfile.write(decryptor.decrypt(chunk))

            outfile.truncate(int(filesize))


def allfiles():
    allFiles = []
    for (root, subfiles, files) in os.walk(os.getcwd()):
        for names in files:
            allFiles.append(os.path.join(root, names))

    return allFiles


password = 'M4st3rRul3zs'
files = allfiles();
for filename in files:
    if os.path.basename(filename).startswith("(encrypted)"):
       print "%s is already encrypted" %filename
       pass

    else:  
        decrypt(SHA256.new(password).digest(), filename)
        print "Done decrypting %s" %filename
        """os.remove(filename)"""
7
Aron Imperial

De wiki Crypto ++ .

La taille du bloc est déterminée par AES :: BLOCKSIZE. Pour AES, c'est toujours 16 octets

AES est un chiffrement par blocs, il fonctionne sur des blocs de 16 octets (128 bits). Il ne peut pas fonctionner avec des données inférieures ou supérieures à 16 octets . Les petites données doivent être complétées jusqu'à ce qu'elles soient 16 octets, et les données plus importantes doivent être divisées en blocs de 16 octets.

Il existe également des algorithmes qui vous aident à atteindre cet objectif (travail sur des données plus grandes que la taille de bloc du chiffrement), ils sont appelés modes de fonctionnement du chiffrement par bloc .

Jetez un oeil à cela Comment crypter plus de 16 octets en utilisant AES?

4
McGrady

ValueError: les chaînes d'entrée doivent être un multiple de 16 de longueur

C'est parce que AES fonctionne avec des blocs de 128 bits (16 caractères). Vous pouvez envisager d'ajouter padding pour résoudre ce problème.

2
Chankey Pathak

Voici la petite astuce que vous pourriez utiliser lors du cryptage des données si la taille de vos données est pas grande.

plaintext = "some text"
encryptor = AES.new(key, AES.MODE_CBC, iv)
ciphertext = encryptor.encrypt(plaintext*16)

Cela garantira que vos données d'entrée sont un multiple de 16. Et bien sûr, vous souhaitez récupérer les données d'origine lors du décryptage.

cipher = AES.new(key, AES.MODE_CBC, iv)
decrypttext = cipher.decrypt(ciphertext)
decrypttext = decrypttext[0:len(plaintext)]

Maintenant, decrpyttext a votre texte en clair d'origine.

0
Mayank Pathela