Eu li que
Um fluxo típico a cifra criptografa o texto simples um byte por vez, embora uma cifra de fluxo possa ser projetada para operar em um bit por vez ou em unidades maiores que um byte por vez.
(Fonte: Criptografia e segurança de rede , William Stallings.)
Uma cifra de bloco criptografa um bloco de cada vez. O bloco pode ter um byte ou mais ou menos. Isso significa que também podemos criptografar um bloco de um byte com a ajuda de uma cifra de fluxo como um fluxo.
Então, qual é exatamente a diferença entre uma cifra de fluxo e uma cifra de bloco?
Comentários
- Muitos conceitos / definições IMHO não são exatamente definidos, mas têm limites em um sentido bastante fluidos. Eles são usados dessa forma porque são convenientes no discurso em que normalmente existem contextos apropriados para ajudar a uma compreensão mais exata. Portanto, existem redundâncias. Suponho que uma boa analogia para o problema aqui é ” um homem rico ” vs. ” um homem pobre “.
- O primeiro parágrafo da pergunta parece ter sido copiado palavra por palavra de Cryptography and Network Security (William Stallings, Seção 6.3). Você deve sempre atribuir a fonte de qualquer material que copie de fontes externas; consulte crypto.stackexchange.com/help/referencing .
- Uma cifra de stream pode usar ou ‘ envolve ‘ uma cifra de bloco. Por exemplo, AES SIC pode ser usado para gerar o fluxo de chaves. O fato de o fluxo de chaves ter N vezes o tamanho do bloco de comprimento não tem qualquer influência sobre o comprimento dos textos cifrados / simples
Resposta
Uma cifra de bloco é uma função determinística e computável de $ k $ -bit keys e $ n $ -bit (texto simples) blocos para blocos de $ n $ de bits (texto cifrado). (De modo mais geral, os blocos não precisam ter o tamanho de bits, $ n $ -blocos de caracteres caberiam aqui também). Isso significa que, quando você criptografa o mesmo bloco de texto simples com a mesma chave, você obterá o mesmo resultado. (Normalmente também queremos que a função seja invertível, ou seja, dada a chave e o bloco de texto cifrado, podemos calcular o texto simples.)
Para criptografar ou descriptografar uma mensagem (de qualquer tamanho), você não ” não use a cifra de bloco diretamente, mas coloque-a em um modo de operação . O modo mais simples seria modo de livro de código eletrônico (ECB) , que simplesmente corta a mensagem em blocos, aplica a cifra a cada bloco e produz os blocos resultantes. (No entanto, este geralmente não é um modo seguro.)
Alguns esquemas de criptografia anteriores, como o usado por Caesar, poderiam ser categorizados como uma “cifra de bloco com blocos de 1 caractere no ECB -mode “. Ou, geralmente, tudo que tem um livro de código .
Normalmente usamos outros modos de operação, que incluem um vetor de inicialização e algum tipo de feedback, de modo que cada bloco de cada mensagem é criptografada de uma maneira diferente.
Uma cifra de fluxo é uma função que mapeia diretamente $ k $ chaves de bits e textos simples de comprimento arbitrário para texto cifrado (mesmo comprimento arbitrário), em tal forma que os prefixos do texto simples mapeiam os prefixos do texto cifrado, ou seja, podemos calcular a parte inicial do texto cifrado antes que a parte final do texto seja conhecida. (Freqüentemente, os tamanhos das mensagens também podem ser limitados a múltiplos de algum “tamanho de bloco”, mas geralmente com blocos menores, como bytes inteiros ou algo assim.)
Se uma parte do texto simples se repete, o texto cifrado correspondente geralmente não é o mesmo – partes diferentes da mensagem serão criptografadas de maneiras diferentes.
Freqüentemente, essas cifras de fluxo funcionam produzindo um fluxo de chave a partir da chave real (e talvez um vetor de inicialização ) e, em seguida, simplesmente fazer XOR com a mensagem – eles são chamados de cifras de fluxo síncrono . Outras cifras de fluxo podem variar a criptografia de partes futuras da mensagem, dependendo das partes anteriores.
Alguns modos de operação de cifra de bloco criam uma cifra de fluxo síncrono, como CTR e modo OFB .
Você nunca deve reutilizar uma chave (e IV, se aplicável) de uma cifra de fluxo síncrono (que inclui cifras de bloco em modos de streaming) para mensagens diferentes, pois isso pode levar a compromissos. (E mesmo para a mesma mensagem, ele mostrará que você repetiu uma mensagem.)
Observe que, no uso real, você também vai querer um MAC, por exemplo, proteção de integridade, para sua mensagem. (Alguns esquemas são quebrados no caso de um ataque de texto cifrado escolhido, por exemplo, e tal MAC irá impedir isso (se você apenas passar a mensagem para o descriptografador após verificar o MAC).)
Comentários
- Quando você escolheria entre stream e bloqueio? Existe uma diferença na segurança? Ou a velocidade da criptografia?
- @anoopelias As cifras de bloco são geralmente lentas em comparação com as cifras de fluxo. Além disso, não tenho certeza, mas acho que as cifras de fluxo são boas em fornecer segurança da informação, enquanto as cifras de bloco são boas em fornecer segurança computacional
- Com relação ao último parágrafo – você poderia fornecer um link para um exemplo em que adicionar um MAC protege contra um ataque de texto cifrado escolhido?
Resposta
Matematicamente, uma cifra de bloco é apenas um família pseudoaleatória de permutação no conjunto $ \ {0,1 \} ^ n $ de blocos de $ n $ -bit. (Na prática, geralmente também exigimos uma maneira eficiente de calcular a permutação inversa.) Uma cifra de bloco por conta própria não é muito útil para criptografia prática, pelo menos a menos que você precise criptografar pequenos mensagens que cabem cada uma em um único bloco.
No entanto, verifica-se que as cifras de bloco são blocos de construção extremamente versáteis para a construção de outras ferramentas criptográficas: assim que você tiver uma boa cifra de bloco, você pode construir facilmente qualquer coisa, desde cifras de fluxo a funções hash, códigos de autenticação de mensagens, funções de derivação de chaves, geradores de números pseudo-aleatórios, pools de entropia etc. com base em apenas uma cifra de bloco.
Nem todos esses aplicativos necessariamente precisa de uma cifra de bloco; por exemplo, muitos deles podem ser baseados em qualquer função pseudo-aleatória que não precisa ser uma permutação (mas, convenientemente, há “sa lema que diz que uma permutação pseudo-aleatória irá, no entanto, funcionar). Além disso, muitas das construções são indiretas; por exemplo, você pode construir uma função de derivação de chave a partir de um código de autenticação de mensagem, que você pode construir a partir de uma função hash, que você pode —, mas não precisa para — construir a partir de um bloco cifra. Mas ainda assim, se você tiver uma cifra de bloco, você pode construir todo o resto com ela.
Além disso, essas construções normalmente vêm com provas de segurança (condicionais) que reduzem a segurança das funções construídas à da cifra de bloco subjacente. Assim, você não precisa realizar a tarefa trabalhosa e não confiável de criptanalisar cada uma dessas funções separadamente — em vez disso, você “está livre para concentrar todos os seus esforços na cifra de bloco, sabendo que qualquer confiança que você tiver na segurança da cifra de bloco se traduz diretamente em confiança em todas as funções baseadas nela.
Obviamente, tudo isso é muito conveniente se você estiver, digamos, trabalhando em uma pequena plataforma incorporada em que incluir código eficiente e seguro para muitas cripto primitivas separadas pode ser difícil e caro. Mas mesmo se você não estiver em uma plataforma tão restrita, escrever e analisar código criptográfico de baixo nível pode ser trabalhoso devido à necessidade de prestar atenção a coisas como ataques de canal lateral . É mais fácil se restringir a um número limitado de blocos de construção de baixo nível e construir tudo o que você precisa a partir deles.
Além disso, mesmo em plataformas rápidas com muita memória, como CPUs de desktop, implementar operações criptográficas de baixo nível diretamente no hardware pode ser muito mais rápido do que fazê-las no software —, mas não é prático fazer isso para mais do que alguns deles . Devido à sua versatilidade, as cifras de bloco são excelentes candidatas para implementação de hardware (como no conjunto de instruções AES para CPUs x86 modernas).
E quanto às cifras de stream, então?
Matematicamente, uma cifra de stream — no sentido mais geral do termo — também é uma família de funções pseudo-aleatórias com chave invertível, mas no conjunto $ \ {0,1 \} ^ * $ de bitstrings de comprimento arbitrário em vez de em blocos de comprimento limitado.
(Existem algumas sutilezas aqui; por exemplo, a maioria das construções de cifras de fluxo exigem que a entrada inclua um valor nonce único, e não garantir a segurança — no sentido de indistinguibilidade de uma função verdadeiramente aleatória — se o mesmo nonce for usado para duas entradas diferentes. Além disso, como não há distribuição uniforme em funções invertíveis de $ \ {0,1 \} ^ * $ para si mesmo para escolher funções aleatórias, precisamos definir cuidadosamente o que significa para uma cifra de fluxo parecer “indistinguível de aleatória”, e esta definição tem implicações práticas de segurança — por exemplo, a maioria das cifras de fluxo vazam o comprimento da mensagem. Praticamente, geralmente também exigimos que as cifras de fluxo, em na verdade, ser “streaming”, no sentido de que fluxos de bits de entrada arbitrariamente longos podem ser criptografados — e descriptografados — usando o apenas armazenamento constante e tempo linear no comprimento da mensagem.)
Claro, as cifras de fluxo são muito mais imediatamente úteis do que as cifras de bloco: você pode usá-las diretamente para criptografar mensagens de qualquer tamanho. No entanto, eles “são também menos úteis como blocos de construção para outras ferramentas criptográficas: se você tiver uma cifra de bloco, pode facilmente transformá-lo em uma cifra de stream , ao passo que transformar uma cifra de stream arbitrária em uma cifra de bloco é difícil, senão impossível .
Então, por que as pessoas se preocupam em projetar cifras de fluxo dedicadas, então, se as cifras de bloco podem fazer o trabalho tão bem? Principalmente, o motivo é a velocidade: às vezes, você precisa de uma cifra rápida para criptografar muitos dados, e há alguns realmente designs de cifra de fluxo dedicado rápidos por aí. Alguns desses projetos também são projetados para serem muito compactos para implementação, seja em software ou hardware ou em ambos, de forma que se você realmente precisar apenas de uma cifra de fluxo, poderá economize no tamanho do código / circuito usando uma dessas cifras em vez de uma cifra de bloco geral baseada.
No entanto, o que você ganha em velocidade e compactação, perde em versatilidade. Por exemplo, não parece haver uma maneira simples de criar uma função hash de uma cifra de fluxo , então se você precisa de uma delas (e você costuma (porque as funções hash, além de serem úteis por si mesmas, também são blocos de construção comuns para outras ferramentas de criptografia), você terá que implementá-las separadamente. E, adivinhe, a maioria das funções hash são baseadas em cifras de bloco, então, se você tiver uma, também pode reutilizar a mesma cifra de bloco para criptografia (a menos que você realmente precise da velocidade bruta da cifra de fluxo dedicado).
Comentários
- Eu questionei se é necessário ter dois termos diferentes. De acordo com o que você explicou, uma cifra de fluxo é simplesmente um caso especial de uma cifra de bloco, ou seja, uma para o caso limite em que on no conjunto {0,1} ^ n é 1. Portanto, eu argumentaria para não manter a corrente distinção de terminologias.
- @ Mok-KongShen Na verdade, uma cifra de fluxo não é simplesmente uma cifra de bloco com tamanho de bloco 1 (além das cifras monoalfabéticas clássicas, que podem ser ambas). Uma cifra de fluxo geralmente traduz os bits / bytes / … do fluxo de maneira diferente, dependendo do estado interno atual da cifra, enquanto uma cifra de bloco para a mesma entrada tem a mesma saída (e, portanto, é geralmente usada em um ” modo de operação ” para criar uma cifra de fluxo).
- @PauloEbermann. IMHO, você respondeu para mim uma pergunta de CodesinChaos sobre ” dinâmica e variabilidade “.
- @ Mok-KongShen Não ele não ‘ t. A única vantagem que uma cifra de fluxo dedicado tem sobre uma cifra de bloco em um modo apropriado é o desempenho. Você não pode ‘ desconsiderar os modos de encadeamento, já que ninguém em sã consciência usa cifras de bloco sem o encadeamento apropriado.
- @CodesInChaos. Aplicativos diferentes têm requisitos de desempenho diferentes. Para criptografar, por exemplo um e-mail, não ‘ não é necessário o desempenho que seria desejável para criptografar, digamos, um arquivo de vídeo.
Resposta
Uma cifra de bloco por si só mapeia n
bits para n
bits usando uma chave. ou seja, é uma permutação pseudoaleatória com chave. Não pode aceitar textos mais longos ou mais curtos.
Para realmente criptografar uma mensagem, você sempre precisa de um modo de encadeamento. O ECB é um desses modos de encadeamento. (e um muito ruim), e não é a cifra de bloco puro. Mesmo o BCE consiste em “operações de processamento complementares”. Esses modos de encadeamento podem ter propriedades bastante diferentes.
Um dos modos de encadeamento mais populares, o modo Contador (CTR) constrói uma cifra de fluxo síncrono a partir de uma cifra de bloco.Outro modo, o CFB constrói uma cifra de stream de sincronização automática, com propriedades em algum lugar entre as de CBC e uma cifra de stream síncrona.
Portanto, sua suposição de que não há cifras entre stream e blockciphers não é realmente verdadeira. Criptógrafos apenas prefira construí-los a partir do primitivo de cifra de bloco bem compreendido, em vez de criar um sistema completamente novo.
Eu chamaria Vigenère de cifra de fluxo, embora com um período muito curto. Ele usa uma codificação de 26 símbolos em vez de uma codificação de 2 símbolos, mas isso não significa que não seja uma cifra de fluxo. Veja em Solitaire / Pontifex uma construção moderna de uma cifra de fluxo com 26 símbolos.
Comentários
- Se eu não ‘ errar, ” encadeando ” em a criptografia de bloco é normalmente empregada no contexto de ” encadeamento de bloco “, ou seja, tornando os blocos sucessivos dependentes uns dos outros, de modo a tornar o análise mais difícil. Portanto, IMHO ECB não teria, por definição, nenhum efeito de encadeamento como tal.
- Você errou. Um bom modo de encadeamento terá essas propriedades, mas modos ruins ainda existem!
Resposta
Existem dois tipos básicos de criptografia
- Simétrica. Ele usa a mesma chave para criptografia e descriptografia.
- Assimétrico. Ele usa duas chaves diferentes (pública e privada) para criptografar e descriptografar.
O Block Cipher e o Stream Cipher fazem parte da Symmetric Encryption. O Stream Cipher gera um fluxo de chave estendido da chave fornecida pelo usuário e, em seguida, XoR com texto simples (para criptografia) / texto cifrado (para descriptografia).
Enquanto o Block Cipher pega um bloco de dados como entrada, execute várias rodadas junto com a combinação de teclas e produção de texto cifrado As Cifras de Bloco têm vários modos de operação, dos quais o modo Contador (CTR) funciona de maneira semelhante à cifra de fluxo. Um número sequencial é inserido na cifra de bloco e sua saída é Xored com Texto Simples para fazer Texto Cifrado. Neste modo de operação, apenas o código de criptografia da cifra de bloco é necessário. Não há necessidade de código de descriptografia, para descriptografar simplesmente inserimos o mesmo número sequencial para bloquear a cifra e Xored sua saída com Texto cifrado para obter texto simples. Às vezes, um nounce é usado junto com o contador, portanto, a cifra de bloco de entrada é dividida em dois, ou seja, um nounce fixo e um contador incremental.
Outro modo de operações são: –
- ECB (fornece confidencialidade)
- CBC e CTR (fornece confidencialidade e Sementicamente seguro contra ataque de texto simples escolhido)
- EAX, CCM e GCM (fornece criptografia autenticada)
Mais detalhes podem ser encontrados AQUI