Sono interessato a sapere come e dove OpenSSL inserisce il sale generato su dati crittografati AES. Perché? Im crittografando i dati nelle classi Java e ho bisogno di garantire che io possa usare OpenSSL per decrittografarli.
Ad esempio, supponiamo di avere questa stringa base64 crittografata, generata con la passphrase "abc"
:
U2FsdGVkX1+tfvgUkjErP6j2kUAVwWZzNlaAmTqhzTk=
# generated with "openssl enc -aes-256-cbc -a"
Per decrittografarlo possiamo usare:
echo U2FsdGVkX1+tfvgUkjErP6j2kUAVwWZzNlaAmTqhzTk= | openssl enc -d -a -aes-256-cbc -p
# enc -d
# decryption
# -a
# input is base64
# -aes-256-cbc
# the aes algorithm used in encryption
# -p
# print salt, key and iv params
L'esecuzione di questo utilizzando la passphrase "abc"
darà come risultato:
salt=AD7EF81492312B3F
key=DEC1F5A1E5EAAA7DD539BBCFCEB1BB18868B974186ED056C27046ADD3A752C8B
iv =95A770DE9E0130E77C8E5D796D1B4EF5
Polaco
Ora, sappiamo che per AES per decrittografare i dati è necessaria la chiave e il vettore di inizializzazione.
Nel caso di OpenSSL, il manuale dice che la chiave è generata dalla passphrase e un sale e il vettore di inizializzazione è derivato dalla chiave stessa (se non specificato manualmente). Ciò significa che i dati generati non hanno bisogno di avere il IV su di esso, ma è necessario avere il sale su di esso, altrimenti la chiave per la decrittografia non verrà mai generata correttamente.
Quindi, il punto è, dov'è il sale e come viene inserito nei dati risultanti? Facendo alcune analisi di base sui dati generati (decodifica da base64 ed emettendo i valori esadecimali) possiamo vedere che il sale non è anteposto o aggiunto ai dati risultanti, ma in qualche modo è lì:
# salt: AD7EF81492312B3F
echo U2FsdGVkX1+tfvgUkjErP6j2kUAVwWZzNlaAmTqhzTk= | openssl enc -d -base64 | od -x
0000000 6153 746c 6465 5f5f 7ead 14f8 3192 3f2b
0000020 f6a8 4091 c115 7366 5636 9980 a13a 39cd
0000040
Puoi vedere che il sale "AD7E..."
non è direttamente presente nei dati crittografati. Sembra che sia avvenuta qualche trasformazione.
Sembra che il sale sia scambiato coppia per coppia e inserito nei dati, a partire dal byte # 9. È una pratica comune o qualcosa che solo OpenSSL implementa?
# salt: AD7E F814 9231 2B3F
# switch pair by pair: 7EAD 14F8 3192 3F2B
# data: 6153 746c 6465 5f5f 7ead 14f8 3192 3f2b f6a8 4091 c115 7366 5636 9980 a13a 39cd
Modifica
Come ha affermato Thomas Pornin, il problema è che od -x
restituisce i dati grezzi. Poiché il mio computer è x86_64, i dati sono in little endian e il sale sembra "scambiato". Avevo dimenticato come endianness sia difficile. Ora ricorderò sempre di usare od -t x1
Comunque, sono ancora interessato a sapere se inserire il sale al nono byte è una pratica comune o un'implementazione specifica OpenSSL. Ho anche notato che i primi byte sono i caratteri Salted__