PyCrypto es posible verificar si el archivo ya está encriptado AES?

2
import os, random, struct
from Crypto.Cipher import AES

def encrypt_file(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_filename:
            Name of the input file

        out_filename:
            If None, '<in_filename>.enc' will be used.

        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))

Así es como cifro el archivo, pero si lo ejecuta dos o más veces en el mismo archivo, continuará cifrándolo sin hacer preguntas. ¿Quiero agregar algún tipo de comprobación si no está cifrado por AES? ¿Es esto posible?

    
pregunta Boris Daka 30.07.2014 - 02:00
fuente

2 respuestas

2

Como mencionó Valmiky Arquissandas, generalmente se espera que el texto encriptado sea indistinguible computacionalmente de los datos aleatorios. Por lo tanto, la única manera eficiente de hacer público
Algo así como verificar si un archivo "no está encriptado por AES" es ejecutar una prueba de aleatoriedad .

Sin embargo, su aplicación debe utilizar cifrado autenticado de todos modos,
y si lo hace, entonces puede utilizar el procedimiento de verificación para determinar con muy
alta precisión si el archivo ya estaba encriptado por la misma clave .

Además, como lo indicó Valmiky, también puede usar un envoltorio personalizado para permitir que se distinga con
Muy alta precisión entre los archivos que ya están encriptados y los archivos que son independientes de ellos.
(Sin embargo, dado el código de su programa, sería fácil crear un
archivo que se registra como el anterior sin haber sido cifrado por él.)

    
respondido por el user49075 30.07.2014 - 03:18
fuente
0

No he mirado tu código. Sin embargo, una cosa que debe saber sobre el cifrado sólido: se supone que el texto cifrado no se puede distinguir de los datos aleatorios .

Dicho esto, puede hacer una heurística que utilice una prueba estadística para decidir si el texto aparece aleatorio y, por lo tanto, parece estar cifrado (esto también significa que no podrá cifrar a propósito algo que parecía aleatorio) (como una contraseña de alta calidad), o puede incluir el texto cifrado en algo que lo identifique como tal en su aplicación.

    
respondido por el Valmiky Arquissandas 30.07.2014 - 03:02
fuente

Lea otras preguntas en las etiquetas