Funkcja skrótu OpenSSL do generowania klucza AES

8

Jakiej funkcji skrótu używa OpenSSL do generowania klucza dla AES-256? Nigdzie nie mogę tego znaleźć w ich dokumentacji.

$ 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

Który algorytm mieszania generuje niesolony skrót key=w drugim ostatnim wierszu dla wejścia „a”?

mk12
źródło

Odpowiedzi:

9

Dość pewien, że jest to algorytm skrótu SHA1, ale szczerze mówiąc, nie mogę powiedzieć ze 100% pewnością.

A kto by pomyślał, że coś zaprojektowanego w celu zwiększenia tępoty będzie miał instrukcje tępe;)

EDYCJA: To może nie być pomocne w twoich okolicznościach, ale myślę, że zawsze możesz to zrobić

openssl enc -d -a -md sha1 -aes-256-cbc -nosalt -p 
Snesticle
źródło
Stwierdziłem, że domyślnie używa MD5, tak jak kiedy używam twojego polecenia (sidenote: żadna z tych opcji nie jest udokumentowana na stronie maga ...) md5zamiast sha1, otrzymuję takie same wyniki, jak pierwotnie opublikowałem. Pytanie brzmi: w jaki sposób uzyskuje 256 bitów z MD5 (128-bitowy algorytm mieszający)?
mk12
Jednym ze sposobów jest to połączenie dwóch różnych MD5 w postaci binarnej, co daje prawdziwy 256-bitowy klucz. Istnieje również kilka innych metod. Możesz sprawdzić pakiet php „md5_base64”. Nawet jeśli nie jesteś facetem php, dokumenty są dość pouczające.
Snesticle,
4

To połączenie dwóch skrótów MD5.

Wywodzi się tak:

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

Możesz to sprawdzić, wykonując:

$ 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

Zauważ, że oba MD5 „key.128.tmp” i „key.256.tmp” połączone razem tworzą ten sam klucz co dane wyjściowe przy pierwszym poleceniu.

użytkownik3281907
źródło
A jeśli wykonasz trzecią iterację, otrzymasz IV. Ten przypadek jest wygodny, ponieważ klucz i dane = rozmiary IV (256 i 128 bitów) są dokładnymi wielokrotnościami wyniku mieszania; generalnie łączysz wyniki mieszania i bierzesz pierwsze K bitów dla klucza, a następne D bitów dla IV.
dave_thompson_085,
aktualizacja: domyślnie był to md5, ale od 1.1.0 w 2016 roku jest to sha256. Pełne informacje na stronie crypto.stackexchange.com/questions/3298/…
dave_thompson_085,
2

OpenSSL używa AES z SHA1.

Jeśli chcesz sprawdzić lepiej napisane źródło niż OpenSSL, zapoznaj się z
klasą C ++ w artykule, która łączy się z szyframi OpenSSL .

Artykuł zawiera bardzo prosty kod źródłowy, który:

umożliwia szyfrowanie i deszyfrowanie plików lub ciągów przy użyciu szyfru OpenSSL AES-256-CBC i algorytmów skrótu SHA1. Jest kompatybilny z narzędziem wiersza poleceń openssl, co czyni go dobrym wprowadzeniem do używania OpenSSL dla szyfrów.

harrymc
źródło
1

Nie znam odpowiedzi, ale prawdopodobnie można ją łatwo znaleźć w kodzie źródłowym OpenSSL .

Fran
źródło
2
„Łatwo” - mainfunkcja (gdzie funkcjonuje funkcja pytania o hasło) ma długość ~ 500 linii i jest wypełniona gotos.
mk12
5
Łał. Właśnie spojrzałem na kod źródłowy. Jest to praktycznie nieczytelne. Bez komentarza. Jednoliterowe nazwy zmiennych. Ugh. Przepraszam, że to zasugerowałem.
Fran