Comprimir e depois criptografar, ou vice-versa?

88

Estou escrevendo um sistema VPN que criptografa (AES256) seu tráfego na rede (por que escrever o meu próprio quando já existem 1.000.001 outros por aí? Bem, o meu é especial para uma tarefa específica que nenhum dos outros se encaixa).

Basicamente, quero passar por meu pensamento para ter certeza de que estou fazendo isso na ordem certa.

No momento, os pacotes são criptografados antes de serem enviados, mas quero adicionar um nível de compactação a eles para otimizar um pouco a transferência de dados. Compressão não pesada - não quero maximizar a CPU o tempo todo, mas quero garantir que a compactação seja a mais eficiente possível.

Então, na minha opinião, devo compactar os pacotes antes de criptografar, pois um pacote não criptografado comprimirá melhor do que um pacote criptografado? Ou o contrário?

Provavelmente usarei o zlib para a compactação.

Leia mais no blog Superusuário .

Majenko
fonte
4
Escrevendo como "programação"? Seria melhor para Stack Overflow então.
Suma
4
Se eu estava perguntando sobre a programação, sim, mas não estou. Esta é uma compactação geral, em seguida, criptografar ou criptografar e, em seguida, compactar a pergunta que pode ser aplicada apenas ao trabalho com arquivos simples, se você desejar. O lado da programação é apenas o contexto do motivo pelo qual estou fazendo a pergunta.
Majenko 15/03
Veja também: stackoverflow.com/questions/4676095 stackoverflow.com/questions/4399812
BlueRaja - Danny Pflughoeft 15/11
Provavelmente uma pergunta melhor significou para security.stackexchange.com
Jeff Ferland
1
Eles sabem sobre compressão, sabem?
Majenko 16/03/11

Respostas:

176

Se a criptografia for feita corretamente , o resultado será basicamente dados aleatórios. A maioria dos esquemas de compactação funciona encontrando padrões em seus dados que podem ser levados em consideração de alguma forma e, graças à criptografia, agora não há; os dados são completamente incompressíveis.

Comprima antes de criptografar.

Mr Alpha
fonte
41
Mais importante: a compressão adiciona entropia. Adicionar entropia é bom para sua criptografia (mais difícil de quebrar com ataques de texto sem formatação conhecidos).
Olli
8
Além disso, a criptografia custa recursos, a criptografia de um arquivo menor requer menos recursos. Então comprima antes de criptografar.
precisa
9
@Lli - não necessariamente se o esquema de compactação adicionar texto conhecido. Na pior das hipóteses, imagine se ele colocasse um cabeçalho conhecido de 512 bytes na frente dos dados e você estivesse usando uma criptografia em modo de bloco.
Martin Beckett
26
Não sei por que o comentário de @ Olli foi votado, pois está incorreto; além de ser significativamente menos importante, para qualquer criptografia meio decente, ela não deve ser importante . Ou seja, a força da criptografia não deve estar completamente relacionada à entropia da mensagem.
BlueRaja - Danny Pflughoeft 15/03
8
Se você compactar alguma coisa, isso só poderá ser feito antes da criptografia da mensagem, mas lembre-se de que isso pode vazar informações sobre a 'compressibilidade' da mensagem original, portanto, você deve considerar se há alguma conseqüência para esse lado. canal. Considere um arquivo de tamanho fixo com todos os 0s ou uma mensagem. O arquivo todo 0 resultará em uma carga útil menor em qualquer esquema de compactação razoável. Não é provável que haja um problema nesse caso de uso específico.
Edward KMETT 15/03/11
22

Compactar antes da criptografia. Os dados compactados podem variar consideravelmente para pequenas alterações nos dados de origem, dificultando a realização de análises criptográficas diferenciais.

Além disso, como aponta Mr.Alpha, se você criptografar primeiro, o resultado é muito difícil de compactar.

Juancho
fonte
12
Bem, isso está correto, mas foi postado 2 horas antes de você postar ... Entropy
Konerak 15/11
3

Mesmo que dependa do caso de uso específico, aconselho Encrypt-then-Compress. Caso contrário, um invasor pode vazar informações do número de blocos criptografados.

Assumimos que um usuário envia uma mensagem ao servidor e um invasor com a possibilidade de anexar texto à mensagem do usuário antes de enviar (via javascript, por exemplo). O usuário deseja enviar alguns dados sensíveis para o servidor e o invasor deseja obter esses dados. Para que ele possa tentar anexar mensagens diferentes aos dados que o usuário envia ao servidor. Em seguida, o usuário compacta sua mensagem e o texto anexado do atacante. Assumimos uma compactação DEFLATE LZ77, portanto, a função substitui as mesmas informações por um ponteiro para a primeira aparição. Portanto, se o invasor puder reproduzir o texto sem formatação do furo, a função de compactação reduzirá o tamanho do texto sem formatação ao tamanho original e a um ponteiro. E após a criptografia, o invasor pode contar o número de blocos de criptografia, para poder ver se os dados anexados eram os mesmos que o usuário enviou ao servidor. Mesmo que este caso pareça um pouco construído, é um sério problema de segurança no TLS. Essa ideia é usada por um ataque chamado CRIME para vazar cookies em uma conexão TLS para roubar sessões.

fonte: http://www.ekoparty.org/archive/2012/CRIME_ekoparty2012.pdf

Tobias Braun
fonte
2

A meu ver, quando você comprime uma mensagem, a projeta para uma dimensão mais baixa e, portanto, há menos bits, o que significa que a mensagem compactada (assumindo a compressão sem perdas) tem as mesmas informações em menos bits (os que você livrou foram redundantes! ) Portanto, você tem mais informações por bit e, consequentemente, mais entropia por bit, mas a mesma entropia total que você tinha antes quando a mensagem não era compactada. Agora, a aleatoriedade é outra questão e é aí que os padrões de compressão podem acionar uma chave de macaco.

Prof
fonte
1

A compactação deve ser feita antes da criptografia. um usuário não quer gastar tempo aguardando a transferência de dados, mas precisa que seja feito imediatamente, sem perder tempo.

sqlchild
fonte
1

Compactação antes da criptografia, conforme apontado anteriormente. A compressão procura a estrutura que pode compactar. A criptografia embaralha os dados para evitar que a estrutura seja detectada. Ao compactar primeiro, é muito mais provável que você tenha um arquivo menor e, portanto, menos carga útil para transferir. A criptografia fará seu trabalho, independentemente de estar compactada ou não e, novamente, como apontado anteriormente, provavelmente será mais difícil realizar análises criptográficas diferenciais em um arquivo compactado.

Sempre aprendendo
fonte
Parece ser uma repetição das respostas aceitas e da segunda. Cada resposta deve contribuir com uma solução substancialmente nova para a pergunta.
fixer1234
0

A compactação reduz a entropia da informação. A compressão máxima torna a entropia mínima. Para dados perfeitamente criptografados (ruído), a entropia máxima e mínima é a mesma.

AbiusX
fonte
2
Espere, você não tem isso ao contrário? Eu pensei que a entropia aumentava à medida que a redundância diminuía. Portanto, a compressão deve aumentar a entropia.
Zan Lynx
Não, menos entropia = mais padrões. A aleatoriedade tem mais entropia.
AbiusX 16/03/11
1
Mas é entropia da informação, por isso é tudo sobre significado. Aleatoriedade não significa nada, portanto não se aplica. Uma frase em inglês pode ter letras alteradas e ainda significar a mesma coisa, portanto, tem baixa entropia. Uma sentença em inglês compactada pode ser ilegível se um único bit mudar para que ele tenha mais. Ou então eu acho.
Zan Lynx
Entropia não é sobre senso e capacidade de ler ou entender, é tudo sobre padrões. Os arquivos compactados estão cheios de padrões.
AbiusX 16/03/11
1
@AbiusX: Certo. Padrões. E quanto menos padrões, mais entropia. O que significa que a compactação que substitui todos os padrões repetidos por uma única cópia aumenta a entropia.
Zan Lynx