Função hash OpenSSL para gerar chave AES


8

Que função de hash o OpenSSL usa para gerar uma chave para o AES-256? Não encontro em nenhum lugar na documentação deles.

$ 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

Qual algoritmo de hash gera o hash sem sal key=na segunda última linha, para a entrada "a"?

Respostas:


9

Certamente, é um algoritmo de digestão SHA1, mas com toda a honestidade, não posso dizer com 100% de certeza.

E quem teria pensado que algo projetado para aumentar a obtusibilidade teria instruções obtusas;)

EDIT: Isso pode não ser útil em suas circunstâncias, mas acho que você sempre pode saber fazendo

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

Eu determinei que ele usa o MD5 por padrão, como quando eu uso o seu comando (nota de rodapé: nenhuma dessas opções está documentada na página do mago ...) com, em md5vez de sha1, eu obtenho os mesmos resultados que eu publiquei originalmente. A questão é: como obtém 256 bits do MD5 (um algoritmo de hash de 128 bits)?
Mk12

Uma maneira de fazer isso é concatenar dois MD5 díspares em formato binário, o que resulta em uma verdadeira chave de 256 bits. Existem alguns outros métodos para isso também. Você pode conferir o pacote php "md5_base64". Mesmo se você não é um cara de php, os documentos são bastante informativos.
Snesticle 8/09/12

4

É uma concatenação de dois hashes MD5.

É derivado assim:

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

Você pode verificar isso fazendo:

$ 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

Observe como os MD5 de 'key.128.tmp' e 'key.256.tmp' concatenados juntos formam a mesma chave que a saída no comando inicial.


E se você fizer uma terceira iteração, receberá o IV. Este caso é conveniente porque os tamanhos de chave e dados = IV (256 e 128 bits) são múltiplos exatos da saída de hash; em geral, você concatena as saídas de hash e pega os primeiros K bits para a chave e os próximos D bits para o IV.
precisa saber é o seguinte

update: o padrão costumava ser md5, mas a partir da 1.1.0 em 2016 é sha256. Detalhes completos em crypto.stackexchange.com/questions/3298/…
dave_thompson_085

2

O OpenSSL usa AES com SHA1.

Se você deseja examinar uma fonte melhor escrita que o OpenSSL, consulte a
classe C ++ do artigo que faz interface com as cifras do OpenSSL .

O artigo inclui código fonte muito simples que:

permite criptografar e descriptografar arquivos ou cadeias usando os algoritmos de codificação OpenSSL AES-256-CBC e de digestão SHA1. É interoperável com a ferramenta de linha de comando openssl, o que faz uma boa introdução ao uso do OpenSSL para cifras.


1

Não sei a resposta, mas você provavelmente poderia encontrá-la facilmente no código-fonte do OpenSSL .


2
"Fácil o suficiente" - a mainfunção (onde reside a funcionalidade de solicitação de senha) tem aproximadamente 500 linhas e está repleta de gotos.
Mk12 30/07/12

5
Uau. Eu apenas olhei o código fonte. É praticamente ilegível. Sem comentários. Nomes de variáveis ​​de uma letra. Ugh. Me desculpe, eu sugeri isso.
Fran
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.