Quais deles são preferidos em quais circunstâncias?
Gostaria de ver a lista de critérios de avaliação para os vários modos e talvez uma discussão sobre a aplicabilidade de cada critério.
Por exemplo, acho que um dos critérios é "tamanho do código" para criptografia e descriptografia, o que é importante para sistemas incorporados por microcódigo, como adaptadores de rede 802.11. Se o código necessário para implementar a CBC for muito menor do que o necessário para a CTR (não sei se isso é verdade, é apenas um exemplo), então eu poderia entender por que o modo com o código menor seria preferido. Mas se estou escrevendo um aplicativo que é executado em um servidor, e a biblioteca AES que estou usando implementa CBC e CTR de qualquer maneira, esse critério é irrelevante.
Veja o que quero dizer com "lista de critérios de avaliação e aplicabilidade de cada critério"?
Isso não é realmente relacionado à programação, mas é relacionado ao algoritmo.
fonte
Respostas:
O BCE não deve ser usado se criptografar mais de um bloco de dados com a mesma chave.
CBC, OFB e CFB são semelhantes; no entanto, OFB / CFB é melhor porque você só precisa de criptografia e não descriptografia, o que pode economizar espaço no código.
A CTR é usada se você deseja uma boa paralelização (ou seja, velocidade), em vez de CBC / OFB / CFB.
O modo XTS é o mais comum se você estiver codificando dados acessíveis aleatoriamente (como um disco rígido ou RAM).
O OCB é de longe o melhor modo, pois permite criptografia e autenticação em uma única passagem. No entanto, existem patentes nos EUA.
A única coisa que você realmente precisa saber é que o BCE não deve ser usado, a menos que você esteja criptografando apenas 1 bloco. O XTS deve ser usado se você estiver criptografando dados acessados aleatoriamente e não um fluxo.
fonte
Por favor, considere demorado e difícil se você não consegue implementar sua própria criptografia
A verdade feia da questão é que, se você estiver fazendo essa pergunta, provavelmente não poderá projetar e implementar um sistema seguro.
Deixe-me ilustrar meu argumento: imagine que você está construindo um aplicativo da Web e precisa armazenar alguns dados da sessão. Você pode atribuir a cada usuário um ID de sessão e armazenar os dados da sessão no servidor em um ID de sessão de mapeamento de mapa de hash para os dados da sessão. Mas então você tem que lidar com esse estado desagradável no servidor e, em algum momento, precisar de mais de um servidor, tudo ficará confuso. Então, em vez disso, você tem a ideia de armazenar os dados da sessão em um cookie no lado do cliente. Você o criptografará, é claro, para que o usuário não possa ler e manipular os dados. Então, qual modo você deve usar? Chegando aqui, você lê a resposta do topo (desculpe-me por destacar o myforwik). O primeiro coberto - ECB - não é para você, você deseja criptografar mais de um bloco, o próximo - CBC - soa bem e você não precisa do paralelismo da CTR, não precisa de acesso aleatório, portanto, nenhum XTS e patentes são PITA, portanto não OCB. Usando sua biblioteca de criptografia, você percebe que precisa de algum preenchimento porque só pode criptografar múltiplos do tamanho do bloco. Você escolhePKCS7 porque foi definido em alguns padrões sérios de criptografia. Depois de ler em algum lugar que o CBC é comprovadamente seguro se usado com um IV aleatório e uma cifra de bloco segura, você fica tranquilo, mesmo armazenando seus dados confidenciais no lado do cliente.
Anos mais tarde, após o fato de seu serviço ter aumentado significativamente, um especialista em segurança de TI entrará em contato com você em uma divulgação responsável. Ela está lhe dizendo que pode descriptografar todos os seus cookies usando um ataque oracle padding , porque seu código produz uma página de erro se o preenchimento estiver de alguma forma quebrado.
Este não é um cenário hipotético: a Microsoft tinha essa falha exata no ASP.NET até alguns anos atrás.
O problema é que existem muitas armadilhas em relação à criptografia e é extremamente fácil criar um sistema que pareça seguro para o leigo, mas que seja trivial para um invasor experiente.
O que fazer se você precisar criptografar dados
Para conexões ativas, use TLS (verifique o nome do host do certificado e a cadeia do emissor). Se você não pode usar o TLS, procure a API de nível mais alto que seu sistema oferece para sua tarefa e certifique-se de entender as garantias que ele oferece e, mais importante, o que ele não garante. No exemplo acima, uma estrutura como o Play oferece recursos de armazenamento no lado do cliente , mas não invalida os dados armazenados depois de algum tempo; se você alterou o estado no lado do cliente, um invasor pode restaurar um estado anterior sem você perceber.
Se não houver abstração de alto nível disponível, use uma biblioteca de criptografia de alto nível. Um exemplo proeminente é o NaCl e uma implementação portátil com muitas ligações de idioma é o sódio . Ao usar essa biblioteca, você não precisa se preocupar com os modos de criptografia, etc., mas precisa ter ainda mais cuidado com os detalhes de uso do que com uma abstração de nível superior, como nunca usar um nonce duas vezes.
Se, por algum motivo, você não puder usar uma biblioteca de criptografia de alto nível, por exemplo, porque você precisa interagir com o sistema existente de uma maneira específica, não há como se educar completamente. Eu recomendo a leitura de Engenharia de Criptografia por Ferguson, Kohno e Schneier . Por favor, não se engane, acreditando que pode criar um sistema seguro sem o conhecimento necessário. A criptografia é extremamente sutil e quase impossível testar a segurança de um sistema.
Comparação dos modos
Somente criptografia:
Criptografia autenticada:
Para evitar ataques de preenchimento oracle e alterações no texto cifrado, é possível calcular um código de autenticação de mensagem (MAC) no texto cifrado e descriptografá-lo apenas se não tiver sido adulterado. Isso é chamado de criptografar-então-mac e deve ser preferido a qualquer outro pedido . Exceto em poucos casos de uso, a autenticidade é tão importante quanto a confidencialidade (o último dos quais é o objetivo da criptografia). Os esquemas de criptografia autenticados (com dados associados (AEAD)) combinam o processo de criptografia e autenticação em duas partes no modo de criptografia em bloco que também produz uma marca de autenticação no processo. Na maioria dos casos, isso resulta em melhoria de velocidade.
Recomendação:
Considerando a importância da autenticação, eu recomendaria os dois modos de codificação de bloco a seguir para a maioria dos casos de uso (exceto para fins de criptografia de disco): Se os dados forem autenticados por uma assinatura assimétrica, use CBC, caso contrário, use o GCM.
fonte
https://your.server
em qualquer lugar do aplicativo, do que inventar algum protocolo de troca de chaves e faça com que as bibliotecas de criptografia de ambos os lados funcionem juntas sem problemas.Uma análise formal foi feita por Phil Rogaway em 2011, aqui . A Seção 1.6 apresenta um resumo que transcrevo aqui, adicionando minha ênfase em negrito (se você estiver impaciente, a recomendação dele é usar o modo CTR, mas sugiro que você leia meus parágrafos sobre integridade de mensagens versus criptografia abaixo).
Observe que a maioria deles exige que o IV seja aleatório, o que significa imprevisível e, portanto, deve ser gerado com segurança criptográfica. No entanto, alguns exigem apenas um "nonce", que não exige essa propriedade, mas exige apenas que ela não seja reutilizada. Portanto, os projetos que dependem de um noncece são menos propensos a erros do que os que não o fazem (e acredite, já vi muitos casos em que o CBC não é implementado com a seleção IV apropriada). Então você verá que eu adicionei negrito quando Rogaway diz algo como "a confidencialidade não é alcançada quando o IV é inaceitável", significa que se você escolher o seu IV criptograficamente seguro (imprevisível), então não há problema. Mas se não o fizer, estará perdendo as boas propriedades de segurança. Nunca reutilize um IV para nenhum desses modos.
Além disso, é importante entender a diferença entre integridade da mensagem e criptografia. A criptografia oculta os dados, mas um invasor pode modificar os dados criptografados e os resultados podem ser potencialmente aceitos pelo seu software se você não verificar a integridade da mensagem. Enquanto o desenvolvedor disser "mas os dados modificados voltarão a ser lixo após descriptografia", um bom engenheiro de segurança encontrará a probabilidade de que o lixo cause comportamento adverso no software e depois transformará essa análise em um ataque real. Eu já vi muitos casos em que a criptografia foi usada, mas a integridade da mensagem era realmente mais necessária do que a criptografia. Entenda o que você precisa.
Devo dizer que, embora o GCM tenha criptografia e integridade de mensagem, é um design muito frágil: se você reutilizar um IV, está ferrado - o invasor pode recuperar sua chave. Outros projetos são menos frágeis, então, pessoalmente, tenho medo de recomendar o GCM com base na quantidade de código de criptografia ruim que eu vi na prática.
Se você precisar de ambos, integridade da mensagem e criptografia, poderá combinar dois algoritmos: geralmente vemos o CBC com o HMAC, mas não há razão para se vincular ao CBC. O importante é saber criptografar primeiro, depois o conteúdo criptografado por MAC , e não o contrário. Além disso, o IV precisa fazer parte do cálculo do MAC.
Não conheço problemas de IP.
Agora, para as coisas boas do professor Rogaway:
Modos de cifras de bloco, criptografia, mas não integridade da mensagem
BCE : Uma codificação em bloco, o modo codifica as mensagens que são um múltiplo de n bits, codificando separadamente cada parte de n bits. As propriedades de segurança são fracas , o método perde a igualdade de blocos nas posições e no tempo dos blocos. De considerável valor legado e de valor como elemento básico para outros esquemas, mas o modo não alcança qualquer objetivo de segurança geralmente desejável por si só e deve ser usado com considerável cuidado; O BCE não deve ser considerado como um modo de confidencialidade "de uso geral" .
CBC : um esquema de criptografia baseado em IV, o modo é seguro como um esquema de criptografia probabilístico, alcançando indistinguibilidade de bits aleatórios, assumindo um IV aleatório. A confidencialidade não é alcançada se o IV for meramente um nonce , nem se for um nonce codificado sob a mesma chave usada pelo esquema, como o padrão sugere incorretamente fazer. Os textos cifrados são altamente maleáveis. Nenhuma segurança de ataque de texto cifrado (CCA) escolhida. A confidencialidade é perdida na presença de um oráculo de preenchimento correto para muitos métodos de preenchimento. Criptografia ineficiente por ser inerentemente serial. Amplamente usadas, as propriedades de segurança somente para privacidade do modo resultam em uso indevido frequente. Pode ser usado como um componente básico para os algoritmos CBC-MAC. Não consigo identificar vantagens importantes sobre o modo CTR.
CFB : um esquema de criptografia baseado em IV, o modo é seguro como um esquema de criptografia probabilístico, alcançando indistinguibilidade de bits aleatórios, assumindo um IV aleatório. A confidencialidade não é alcançada se o IV for previsível , nem se for produzido por um nonce codificado sob a mesma chave usada pelo esquema, como o padrão sugere incorretamente fazer. Os textos cifrados são maleáveis. Sem segurança CCA. Criptografia ineficiente por ser inerentemente serial. O esquema depende de um parâmetro s, 1 ≤ s ≤ n, normalmente s = 1 ou s = 8. Ineficiente para precisar de uma chamada de código de bloco para processar apenas s bits. O modo obtém uma propriedade interessante de "auto-sincronização"; a inserção ou exclusão de qualquer número de caracteres de s bits no texto cifrado apenas interrompe temporariamente a descriptografia correta.
OFB : Um esquema de criptografia baseado em IV, o modo é seguro como um esquema de criptografia probabilístico, alcançando indistinguibilidade de bits aleatórios, assumindo um IV aleatório. A confidencialidade não é alcançada se o IV é um noncece, embora uma sequência fixa de IVs (por exemplo, um contador) funcione bem. Os textos cifrados são altamente maleáveis. Sem segurança CCA. Criptografia e descriptografia ineficientes por serem inerentemente seriais. Criptografa nativamente seqüências de caracteres de qualquer tamanho de bit (não é necessário preenchimento). Não consigo identificar vantagens importantes sobre o modo CTR.
CTR : um esquema de criptografia baseado em IV, o modo alcança indistinguibilidade de bits aleatórios, assumindo um nonce IV. Como um esquema não baseado em segurança, o modo também pode ser usado como um esquema de criptografia probabilístico, com um IV aleatório. Falha total na privacidade se um nonce for reutilizado na criptografia ou descriptografia. A paralelicidade do modo geralmente o torna mais rápido, em algumas configurações, muito mais rápido do que outros modos de confidencialidade. Um bloco de construção importante para esquemas de criptografia autenticada. No geral, geralmente a melhor e mais moderna maneira de obter criptografia apenas com privacidade.
XTS : um esquema de criptografia baseado em IV, o modo funciona aplicando um código de bloco tweakable (seguro como um PRP forte) a cada pedaço de n bits. Para mensagens com comprimentos não divisíveis por n, os dois últimos blocos são tratados especialmente. O único uso permitido do modo é para criptografar dados em um dispositivo de armazenamento estruturado em bloco. A largura estreita do PRP subjacente e o mau tratamento dos blocos finais fracionários são problemas. Mais eficiente, mas menos desejável do que um código de bloco seguro por PRP (de bloco amplo) seria.
MACs (integridade da mensagem, mas não criptografia)
ALG1–6 : Uma coleção de MACs, todos baseados no CBC-MAC. Muitos esquemas. Alguns são comprovadamente seguros como VIL PRFs, outros como FIL PRFs e outros não têm segurança comprovável. Alguns dos esquemas admitem ataques prejudiciais. Alguns dos modos são antigos. A separação de teclas é inadequada para os modos que a possuem. Não deve ser adotado em massa, mas a seleção seletiva dos “melhores” esquemas é possível. Também seria bom adotar nenhum desses modos, em favor da CMAC. Alguns dos MACs ISO 9797-1 são amplamente padronizados e usados, especialmente no setor bancário. Uma versão revisada da norma (ISO / IEC FDIS 9797-1: 2010) será lançada em breve [93].
CMAC : um MAC baseado no CBC-MAC, o modo é comprovadamente seguro (até o limite do aniversário) como um PRF (VIL) (assumindo que o código de bloco subjacente é um bom PRP). Sobrecarga essencial mínima para um esquema baseado em CBCMAC. Natureza inerentemente serial, um problema em alguns domínios de aplicativos, e o uso com uma codificação de bloco de 64 bits exigiria uma reinserção ocasional. Mais limpo que a coleção ISO 9797-1 de MACs.
HMAC : um MAC baseado em uma função de hash criptográfico em vez de em um código de bloco (embora a maioria das funções de hash criptográfico sejam baseadas em códigos de bloco). O mecanismo possui fortes limites de segurança comprovável, embora não de suposições preferidas. Várias variantes intimamente relacionadas na literatura complicam a compreensão do que é conhecido. Nunca foram sugeridos ataques prejudiciais. Amplamente padronizado e usado.
GMAC : um MAC não baseado em GCE que é um caso especial do GCM. Herda muitas das boas e más características do GCM. Mas o non-requisito é desnecessário para um MAC, e aqui ele compra pouco benefício. Ataques práticos se as tags forem truncadas para ≤ 64 bits e a extensão da descriptografia não for monitorada e reduzida. Falha completa na não reutilização. De qualquer forma, o uso está implícito se o GCM for adotado. Não recomendado para padronização separada.
criptografia autenticada (criptografia e integridade da mensagem)
CCM : um esquema AEAD não baseado em código que combina a criptografia no modo CTR e o CBC-MAC bruto. Inerentemente serial, limitando a velocidade em alguns contextos. Provavelmente seguro, com bons limites, assumindo que o código de bloco subjacente seja um bom PRP. Construção deselegante que demonstra o trabalho. Mais simples de implementar que o GCM. Pode ser usado como um MAC não baseado em EC. Amplamente padronizado e usado.
GCM : um esquema AEAD não baseado em código que combina criptografia no modo CTR e uma função hash universal baseada em GF (2128). Boas características de eficiência para alguns ambientes de implementação. Bons resultados comprovadamente seguros, assumindo o truncamento mínimo de tags. Ataques e baixos limites de segurança comprovável na presença de truncamento substancial de tags. Pode ser usado como um MAC não baseado em GCE, que é chamado GMAC. Escolha questionável para permitir nonces que não sejam 96 bits. Recomenda restringir nonces a 96 bits e tags a pelo menos 96 bits. Amplamente padronizado e usado.
fonte
fonte
Você começou lendo as informações sobre isso na Wikipedia - Bloquear modos de operação de cifra ? Em seguida, siga o link de referência na Wikipedia para NIST: Recomendação para Modos de Operação de Cifra em Bloco .
fonte
Você pode escolher com base no que está amplamente disponível. Eu tive a mesma pergunta e aqui estão os resultados da minha pesquisa limitada.
Limitações de hardware
Limitações de código aberto
[1] http://www.codeproject.com/Articles/57478/A-Fast-and-Easy-to-Use-AES-Library
[2] https://openaes.googlecode.com/files/OpenAES-0.8.0.zip
fonte
Conheço um aspecto: embora o CBC ofereça melhor segurança alterando o IV para cada bloco, ele não é aplicável ao conteúdo criptografado acessado aleatoriamente (como um disco rígido criptografado).
Portanto, use CBC (e os outros modos seqüenciais) para fluxos sequenciais e o BCE para acesso aleatório.
fonte