Por que o arquivo hash é sempre diferente nos arquivos de saída do openssl aes-256-cbc?

2

Eu tentei criptografar o arquivo usando este comando:

openssl enc -aes-256-cbc -in $infile -out $outfile -pass file:$keyfile

Para o mesmo arquivo de entrada, Por que os arquivos de saída possuem hashes diferentes.

    
por cakyus 12.07.2015 / 07:37

2 respostas

3

CBC requer um IV : o primeiro bloco de dados deve ser aleatório. Ele é enviado com os dados para que o destinatário tenha o que eles precisam para descriptografar a mensagem. O IV para CBC deve ser uniformemente aleatório e imprevisível . O comando openssl enc cria um IV com 8 bytes fixos e 8 bytes aleatórios (deve ser 16 bytes aleatórios). Quando você criptografa a mesma mensagem duas vezes, o IV muda. (Há uma opção -nosalt para usar um IV fixo, o que é ainda pior para a segurança e não deve ser feito a menos que a própria senha seja gerada aleatoriamente para uma única mensagem.)

Todos os modos de criptografia não quebrados têm um IV ou equivalente, de forma que a criptografia da mesma mensagem duas vezes resulta em diferentes textos cifrados. Isso é necessário, pelo menos, para que um adversário não possa detectar se duas mensagens criptografadas têm o mesmo texto simples. Repetir o IV para mensagens distintas pode abrir outros ataques; por exemplo, com o CBC, um prefixo comum para duas mensagens é visível no texto cifrado se o IV for reutilizado. Se você descobrir que criptografar a mesma mensagem duas vezes leva ao mesmo texto cifrado, algo está quebrado.

Não use o comando openssl para trabalhos sérios . Ele serve apenas como uma vitrine das funções da biblioteca e é mal projetado até para isso. Como vimos, o comando enc não faz as coisas com segurança, já que seu IV não é tão aleatório quanto deveria. Um problema pior é a maneira como a chave é derivada da senha: openssl enc usa uma única rodada de MD5 , o que é ruim - derivar uma chave de uma senha deve usar uma função intrinsecamente lenta (a função de alongamento de teclas ) para retardar as tentativas de quebra de força bruta, onde o invasor tenta senhas prováveis (palavras do dicionário, variações de 1337, etc.).

A principal ferramenta de criptografia em nível de usuário é GPG , disponível no Ubuntu no < hnf="http://packages.ubuntu.com/gnupg"> gnupg ou gnupg pacote. Para criptografar um arquivo com uma senha, use

gpg -c filename

Você receberá uma solicitação para a frase secreta. O arquivo criptografado será armazenado em filename.gpg . Para descriptografar, execute gpg filename.gpg e insira a frase secreta.

    
por Gilles 13.07.2015 / 04:04
2

(Eu acho que você acidentalmente adicionou a opção -d descriptografia no comando em sua pergunta.)

Os arquivos criptografados diferem por causa do sal criptográfico de 64 bits aleatório que o OpenSSL gera e inclui em cada arquivo criptografado por padrão. Isso pode ser desativado com a opção -nosalt , mas como a documentação em man enc do OpenSSL indica, geralmente é uma idéia muito ruim:

  

A opção -salt deve SEMPRE ser usada se a chave for derivada de uma senha, a menos que você queira compatibilidade com          versões anteriores do OpenSSL e SSLeay.

     

Sem a opção -salt , é possível executar ataques de dicionário eficientes na senha e atacar o fluxo          codificar dados criptografados. A razão para isto é que sem o sal a mesma senha sempre gera o mesmo          chave de criptografia. Quando o sal está sendo usado, os primeiros oito bytes dos dados criptografados são reservados para o sal: é          gerado aleatoriamente ao criptografar um arquivo e ler o arquivo criptografado quando ele é descriptografado.

    
por Vincent Yu 12.07.2015 / 08:55