Funzione hash OpenSSL per la generazione della chiave AES


8

Quale funzione hash utilizza OpenSSL per generare una chiave per AES-256? Non riesco a trovarlo da nessuna parte nella loro documentazione.

$ touch file
$ openssl aes-256-cbc -nosalt -P -in file

enter aes-256-cbc encryption password: (I type "a" and hit enter)
Verifying - enter aes-256-cbc encryption password: (I type "a" and hit enter)

key=0CC175B9C0F1B6A831C399E269772661CEC520EA51EA0A47E87295FA3245A605
iv =4FA92C5873672E20FB163A0BCB2BB4A4

Quale algoritmo hash genera l'hash non salato dopo key=sull'ultima riga, per l'ingresso "a"?

Risposte:


9

Abbastanza sicuro che sia un algoritmo digest SHA1 ma in tutta onestà non posso dire con certezza al 100%.

E chi avrebbe mai pensato che qualcosa progettato per aumentare l'ottusità avrebbe istruzioni ottuse;)

EDIT: Questo potrebbe non essere utile nelle tue circostanze, ma immagino che potresti sempre saperlo facendo

openssl enc -d -a -md sha1 -aes-256-cbc -nosalt -p 

Ho determinato che utilizza MD5 per impostazione predefinita, come quando uso il tuo comando (sidenote: nessuna di queste opzioni è documentata nella pagina del mago ...) con, md5invece di sha1, ottengo gli stessi risultati che avevo pubblicato originariamente. La domanda è: come ottiene 256 bit da MD5 (un algoritmo di hashing a 128 bit)?
mk12

Un modo per farlo è concatenare due MD5 disparati in forma binaria che si traduce in una vera chiave a 256 bit. Ci sono alcuni altri metodi anche per questo. Puoi controllare il pacchetto php "md5_base64". Anche se non sei un ragazzo php, i documenti sono piuttosto istruttivi.
Snesticle

4

È una concatenazione di due hash MD5.

È derivato in questo modo:

128bit_Key = MD5(Passphrase + Salt)
256bit_Key = 128bit_Key + MD5(128bit_Key + Passphrase + Salt)

Puoi verificarlo facendo:

$ echo Testing > file
$ openssl enc -aes-256-cbc -p -in file -out file.aes -salt
: enter aes-256-cbc encryption password: abc
: Verifying - enter aes-256-cbc encryption password: abc
: salt=3025373CA0530C93
: key=E165475C6D8B9DD0B696EE2A37D7176DFDF4D7B510406648E70BAE8E80493E5E
: iv =B030394C16C76C7A94DC22FDDB6B0744
$ perl -e 'print pack "H*", "3025373CA0530C93"' > salt
$ echo -n abc > passphrase
$ cat passphrase > key.128.tmp
$ cat salt >> key.128.tmp
$ md5sum key.128.tmp 
: e165475c6d8b9dd0b696ee2a37d7176d  key.128.tmp
$ perl -e 'print pack "H*", "e165475c6d8b9dd0b696ee2a37d7176d"' > key.128
$ cat key.128 > key.256.tmp
$ cat passphrase >> key.256.tmp
$ cat salt >> key.256.tmp
$ md5sum key.256.tmp 
: fdf4d7b510406648e70bae8e80493e5e  key.256.tmp

Notare come entrambi gli MD5 di 'key.128.tmp' e 'key.256.tmp' concatenati insieme formano la stessa chiave dell'output al comando iniziale.


E se fai una terza iterazione otterrai la IV. Questo caso è utile perché le dimensioni chiave e data = IV (256 e 128 bit) sono entrambi multipli esatti dell'output hash; in generale concatenate le uscite hash e prendete i primi K bit per la chiave e i successivi D bit per l'IV.
dave_thompson_085,

aggiornamento: il valore predefinito era md5, ma a partire dalla 1.1.0 nel 2016 è sha256. Dettagli completi su crypto.stackexchange.com/questions/3298/…
dave_thompson_085

2

OpenSSL utilizza AES con SHA1.

Se desideri esaminare una fonte meglio scritta di OpenSSL, dai un'occhiata all'articolo
C ++ che si interfaccia con le cifre OpenSSL .

L'articolo include un codice sorgente molto semplice che:

consente di crittografare e decrittografare file o stringhe utilizzando gli algoritmi di digest OpenSL AES-256-CBC e gli algoritmi digest SHA1. È interoperabile con lo strumento da riga di comando openssl che lo rende una buona introduzione all'uso di OpenSSL per le cifre.


1

Non conosco la risposta, ma probabilmente potresti trovarla abbastanza facilmente nel codice sorgente OpenSSL .


2
"Abbastanza facilmente": la mainfunzione (dove vive la funzionalità di richiesta password) è lunga ~ 500 righe e disseminata di gotos.
mk12

5
Wow. Ho appena guardato il codice sorgente. È praticamente illeggibile. Non ci sono commenti. Nomi variabili di una lettera. Ugh. Mi dispiace di averlo suggerito.
Fran,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.