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
.