Perché openssl enc -aes-256-cbc -a -salt aumenta le dimensioni del file?

5

Sto utilizzando openssl enc -aes-256-cbc -a -salt per i backup differenziali automatizzati su Amazon Glacier. Ma ho notato che l'utilizzo di questo comando aumenta quasi del 35% le dimensioni del file.
A mio avviso, un cifrario a blocchi non dovrebbe cambiare così tanto la dimensione del file, con la mia attuale conoscenza, so che aggiunge alla maggior parte 16 byte alla fine per creare il padding. Ma questo non conta per 17 MB + sui miei backup.

Che cosa sta causando questo aumento di dimensioni?

Log lines:

09:09:16 Created tarbal of 165 files of size            106M
09:09:50 Created /archief/2014-05-10.encrypted of size  143M

09:09:11 Created tarbal of 186 files of size            132M
09:09:52 Created /archief/2014-05-17.encrypted of size  179M
    
posta gnur 20.05.2014 - 16:00
fonte

1 risposta

11

L'aumento principale è il flag -a che significa che base64 codifica il tuo testo cifrato.

Da man enc :

NAME
   enc - symmetric cipher routines

SYNOPSIS
   openssl enc -ciphername [-in filename] [-out filename] [-pass arg] [-e] [-d] [-a] [-A] [-k password]
   [-kfile filename] [-K key] [-iv IV] [-p] [-P] [-bufsize number] [-nopad] [-debug]

   [...]

   -a  base64 process the data. This means that if encryption is taking place the data is base64 encoded
       after encryption. If decryption is set then the input data is base64 decoded before being
       decrypted.

Codifica Base64 significa che per ogni tre byte di dati binari (un byte è un numero di 8 bit che significa che ha un valore da 0 a 2 8 -1 = 255) che sei codificato in quattro byte di dati a 6 bit (con valore da 0 a 2 6 -1 = 63, sebbene rappresentati in simboli ASCII stampabili). Base64 è comodo in quanto i simboli per i 64 valori possono essere scelti come caratteri ASCII stampabili (ad esempio, in genere 0 = 'A', 1 = 'B', ... 25 = 'Z', 26 = 'a' ,. ..51 = 'z', 52 = '0', ..., 61 = '9', 62 = '+', 63 = '/' sebbene gli ultimi due spesso siano definiti diversamente in diverse varianti). Nota tre byte 8 * 3 ha 24 bit, così come quattro gruppi di numeri codificati base64 6 * 4.

Ad esempio se il tuo testo cifrato era di tre byte (in esadecimale): f0 bb 5c (240, 187, 92) in binario i bit raggruppati in tre byte sarebbero:

 11110000 10111011 01011100

in base64 sarebbero gli stessi bit, tranne che raggruppati in quattro gruppi di 6 bit:

 111100 001011 101101 011100

che mappano ai valori 60, 11, 45, 28, che su una tabella base64 tipica verrebbero mappati ai caratteri ASCII stampabili 8Ltc che impiegheranno quattro byte sul disco (invece dei tre byte che avrebbe preso senza codifica Base64).

Pertanto la codifica base64 dovrebbe rappresentare all'incirca un aumento di file del 33%. È leggermente più di questo come openssl aggiunge anche un carattere di nuova riga ogni 64 caratteri di ascii con codifica base64 (quindi il testo viene eseguito a 64 byte). Queste due caratteristiche insieme rappresentano un aumento generale della dimensione del file di (4/3 * 65/64 - 1) = 35,4%

C'è anche un po 'di overhead dal tuo schema. Specificando -salt si prende la password in chiaro e si concatena un salt di otto byte casuale al messaggio insieme a un'intestazione Salted__ che specifica che è stato usato un salt, e questi saranno codificati in base64. (Lo scopo del sale è di rendere meno conveniente per un utente malintenzionato precompilare le tabelle arcobaleno per le password comuni). Se crittografo un file casuale nel tuo schema (specificando il sale come DEADBEEFDEADBEEF usando openssl enc -aes-256-cbc -a -salt -S DEADBEEFDEADBEEF la prima riga del mio file crittografato era

U2FsdGVkX1/erb7v3q2+7ybJfdPaLlVzOp7lKpOljvNK8ONCrgFrQpaJHQ8EqO1X

che decodifica in (usando python):

>>> import base64
>>> base64.b64decode("U2FsdGVkX1/erb7v3q2+7ybJfdPaLlVzOp7lKpOljvNK8ONCrgFrQpaJHQ8EqO1X")
'Salted__\xde\xad\xbe\xef\xde\xad\xbe\xef&\xc9}\xd3\xda.Us:\x9e\xe5*\x93\xa5\x8e\xf3J\xf0\xe3B\xae\x01kB\x96\x89\x1d\x0f\x04\xa8\xedW'

Quindi combinando la codifica base64, le interruzioni di riga, il salt, il vettore di inizializzazione (per la modalità CBC) e il padding (per essere equamente divisibile come blocchi di 128 bit per AES), un un sovraccarico di circa il 35% sembra perfettamente ragionevole.

MODIFICA: in realtà, openssl non memorizza un vettore di inizializzazione quando si ricava una chiave da una password con un valore salt. Da man enc : "Quando viene specificata una password utilizzando una delle altre opzioni, l'IV viene generato da questa password.". Usando questo e facendo un paio di file di test, le dimensioni dei file corrispondono perfettamente. Il sale 8 byte più Salted__ aggiunge 16 byte al file. Il file è riempito per essere un multiplo di 16 byte (aggiungendo al massimo 16 byte). Se non la codifica in base64 le dimensioni del file coincidono perfettamente, e quindi puoi ottenere un file che corrisponde esattamente alla versione base64 se poi applichi base64 --wrap=64 .

    
risposta data 20.05.2014 - 16:06
fonte

Leggi altre domande sui tag