Pergunta

É recomendado que eu use um vetor de inicialização criptografar/descriptografar meus dados?Isso tornará as coisas mais seguras?É uma daquelas coisas que precisa ser avaliada caso a caso?

Para colocar isso em contexto real, a função Win32 Cryptography, CryptSetKeyParam permite a configuração de um vetor de inicialização em uma chave antes da criptografia/descriptografia.Outras APIs também permitem isso.

O que geralmente é recomendado e por quê?

Foi útil?

Solução

Um IV é essencial quando a mesma chave pode ser usada para criptografar mais de uma mensagem.

A razão é porque, na maioria dos modos de criptografia, duas mensagens criptografadas com a mesma chave podem ser analisadas juntas.Em uma cifra de fluxo simples, por exemplo, fazer XOR em dois textos cifrados criptografados com a mesma chave resulta no XOR das duas mensagens, das quais o texto simples pode ser facilmente extraído usando técnicas tradicionais de criptoanálise.

Um IV fraco é parte do que tornou o WEP quebrável.

Um IV basicamente mistura alguns dados exclusivos e não secretos na chave para evitar que a mesma chave seja usada duas vezes.

Outras dicas

Na maioria dos casos você deve usar IV.Como o IV é gerado aleatoriamente a cada vez, se você criptografar os mesmos dados duas vezes, as mensagens criptografadas serão diferentes e será impossível para o observador dizer se essas duas mensagens são iguais.

Dê uma boa olhada na foto (veja abaixo) do modo CBC.Você perceberá rapidamente que um invasor conhecendo o IV é como o invasor conhecendo um bloco anterior de texto cifrado (e sim, eles já sabem muito disso).

Aqui está o que eu digo:a maioria dos "problemas" com IV=0 são problemas gerais com modos de criptografia de bloco quando você não garantir a integridade dos dados.Você realmente deve garantir a integridade.

Aqui está o que eu faço:use uma soma de verificação forte (hash criptográfico ou HMAC) e anexe-a ao texto simples antes de criptografar.Aí está o seu primeiro bloco conhecido de texto cifrado:é o IV da mesma coisa sem a soma de verificação, e você precisa da soma de verificação por um milhão de outros motivos.

Finalmente:qualquer analogia entre CBC e cifras de fluxo não é muito esclarecedora, IMHO.

Basta olhar a foto do modo CBC, acho que você ficará agradavelmente surpreso.

Aqui está uma foto:

http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation

Texto do link

Encontrei o artigo sobre HTTP Digest Auth (RFC 2617) muito útil para entender o uso e a necessidade de IVs/nonces.

Se a mesma chave for usada várias vezes para vários segredos diferentes, poderão surgir padrões nos resultados criptografados.O IV, que deve ser pseudo-aleatório e usado apenas uma vez com cada chave, existe para ofuscar o resultado.Você nunca deve usar o mesmo IV com a mesma chave duas vezes, pois isso iria contra o propósito dele.

Para não ter que se preocupar em acompanhar o IV, a coisa mais simples é anexá-lo ou anexá-lo ao segredo criptografado resultante.Dessa forma, você não precisa pensar muito sobre isso.Você sempre saberá que o primeiro ou o último N bits é o IV.

Ao descriptografar o segredo, você apenas divide o IV e o usa junto com a chave para descriptografar o segredo.

É uma daquelas coisas que precisam ser avaliadas caso a caso? base?

É sim.Sempre leia sobre a cifra que você está usando e como ela espera que suas entradas sejam.Algumas cifras não usam IVs, mas exigem sais para serem seguras.IVs podem ter comprimentos diferentes.O modo da cifra pode alterar para que o IV é usado (se for usado) e, como resultado, quais propriedades ele precisa para ser seguro (aleatório, único, incremental?).

Geralmente é recomendado porque a maioria das pessoas está acostumada a usar AES-256 ou cifras de bloco semelhantes em um modo chamado 'Cipher Block Chaining'.Esse é um padrão bom e sensato para muitos usos de engenharia e precisa que você tenha um IV apropriado (não repetitivo).Nesse caso, não é opcional.

O IV permite que o texto simples seja criptografado de forma que o texto criptografado seja mais difícil de descriptografar para um invasor.Cada bit de IV usado dobrará as possibilidades de texto criptografado de um determinado texto simples.

Por exemplo, vamos criptografar 'hello world' usando um IV de um caractere.O IV é selecionado aleatoriamente para ser 'x'.O texto então criptografado é 'xhello world', que produz, digamos, 'asdfghjkl'.Se criptografarmos novamente, primeiro gere um novo IV - digamos que obtemos 'b' desta vez - e criptografe normalmente (criptografando assim 'bhello world').Desta vez temos 'qwertyuio'.

A questão é que o invasor não sabe o que é o IV e, portanto, deve calcular todos os IV possíveis para um determinado texto simples para encontrar o texto cifrado correspondente.Desta forma, o IV atua como um sal de senha.Mais comumente, um IV é usado com uma cifra de encadeamento (uma cifra de fluxo ou de bloco).Em uma cifra de bloco encadeado, o resultado de cada bloco de texto simples é alimentado ao algoritmo de cifra para encontrar o texto cifrado para o próximo bloco.Desta forma, cada bloco é encadeado.

Então, se você tiver um IV aleatório usado para criptografar o texto simples, como descriptografá-lo?Simples.Passe o IV (em texto simples) junto com seu texto criptografado.Usando nosso primeiro exemplo acima, o texto cifrado final seria 'xasdfghjkl' (IV + texto cifrado).

Sim, você deve usar um soro intravenoso, mas certifique-se de escolhê-lo corretamente.Use uma boa fonte de números aleatórios para fazer isso.Nunca use o mesmo IV duas vezes.E nunca use um IV constante.

O artigo da Wikipédia sobre vetores de inicialização fornece uma visão geral.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top