Dove si trova il sale sulla crittografia OpenSSL AES?

17

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__

    
posta bcap 24.09.2012 - 20:22
fonte

1 risposta

13

Sì, si è verificata una trasformazione: endianness ...

Guarda i byte da 8 a 15: 7ead 14f8 3192 3f2b . Questo è il tuo sale. È una stranezza nota di od : decodifica i dati per unità di 16 bit, little-endian , quindi li mostra "numericamente", quindi questo incorre in un apparente scambio di byte.

Usa od -t x1 per ottenere un risultato migliore.

Modifica: per rispondere alla tua altra domanda, ciò che OpenSSL fa non è né pratica standard né comune; è solo "ciò che OpenSSL ha sempre fatto". Non è ben documentato.

    
risposta data 24.09.2012 - 20:36
fonte

Leggi altre domande sui tag