PyCrypto Possibile verificare se il file è già crittografato con 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))

Questo è il modo in cui crittografo il file, ma se lo si esegue due o più volte sullo stesso file continueranno a crittografarlo senza fare domande, voglio aggiungere una sorta di controllo if se non è già crittografato da AES? È possibile?

    
posta Boris Daka 30.07.2014 - 02:00
fonte

2 risposte

2

Come accennato da Valmiky Arquissandas, il testo crittografato è generalmente considerato computazionalmente indistinguibile dai dati casuali. Quindi, l'unico modo efficace pubblicamente noto da fare
qualcosa come controllare se un file è "non già crittografato da AES" è eseguire un test di casualità .

Tuttavia, la tua applicazione dovrebbe utilizzare crittografia autenticata in ogni caso,
e se lo fa allora può usare la procedura di verifica per determinare con molto
elevata precisione indipendentemente dal fatto che il file fosse già crittografato dalla stessa chiave .

Inoltre, come indicato anche da Valmiky, può utilizzare un wrapper personalizzato per consentirne la distinzione
altissima precisione tra file già crittografati e file indipendenti da esso.
(Tuttavia, dato il codice del tuo programma, sarebbe facile crearne uno
file che si registra come il primo senza essere stato crittografato da esso.)

    
risposta data 30.07.2014 - 03:18
fonte
0

Non ho guardato il tuo codice. Tuttavia, una cosa che dovresti sapere sulla crittografia avanzata: il testo crittografato dovrebbe essere indistinguibile dai dati casuali .

Detto questo, puoi fare un'euristica che usa un test statistico per decidere se il testo appare casuale e quindi sembra essere crittografato (questo significa anche che non potresti crittografare intenzionalmente qualcosa che sembrava casuale - come una password di alta qualità), oppure puoi avvolgere il testo crittografato in qualcosa che lo identifichi come tale nella tua applicazione.

    
risposta data 30.07.2014 - 03:02
fonte

Leggi altre domande sui tag