GCM (Galois / modo de contador), em particular em combinação com AES, tem sido um padrão ouro de fato por anos. Criptografe e autentique em uma única etapa, isso é incrível demais, e termos como AEAD funcionam bem para impressionar uma garota, de modo que todos ganham. Mas, piada à parte …
Eu sempre me perguntei o que o torna tão especial e, quanto mais penso nisso, menos entendo. Se você olhar para ele, a magia geral não é tão incrível. Ou talvez eu seja muito estúpido para grocá-lo (daí minha pergunta).
Meus pensamentos:
Em primeiro lugar, GCM é uma forma de modo de contador . O que significa que, ao contrário de, por exemplo encadeamento de blocos de criptografia, a saída de um bloco depende de exatamente um bloco de entrada. Pior ainda: você pode modificar um único bit e o resultado descriptografado será diferente exatamente nesse bit. Porque, se você for honesto, uma cifra de bloco no modo contador não é uma ” cifra de bloco “, mas um PRNG (com chave) seguido por uma operação XOR. Basicamente, uma cifra de fluxo ” blocky “. Não é muito difícil imaginar um cenário em que alguém possa abusar disso para alterar mensagens de forma prejudicial (por exemplo, alterar ” transação: +5.000 \ $ ” para ” transação: -5.000 \ $ “). As cifras de bloco normalmente têm a propriedade inata de se transformar em um jargão completo conforme você vira um único bit (mais, com o encadeamento, todo o restante da mensagem). Essa é realmente uma propriedade muito boa e desejável, que acabamos de jogar ao mar sem um bom motivo.
Claro, com o autenticador , o ataque acima é difícil de realizar, pois a violação será descoberta. Mas, basicamente, o autenticador só corrige o problema de que a escolha do modo de operação introduzida .
GHASH é um MAC que oferece suporte a dados autenticados extras. Pelo que eu posso dizer, isso “é uma mentira absoluta. Ou chame isso de ” exagero otimista ” se você quiser. É apenas uma função de compressão com matemática não intuitiva (para não matemáticos) por trás, mas no final ela não faz nada além de uma simples multiplicação e jogando fora metade dos bits de entrada com o equivalente a ” estouro “. O que é exatamente o que, com matemática mais mundana, pode ser feito em duas linhas de código C por bloco dentro de uma dúzia de ciclos (ou se você estiver bem em usar multiplicações de 32 bits em vez de 64, pode ser feito em paralelo, por exemplo, com AVX2 ” s vpmulld para dois blocos completos em ~ 4 ciclos).
Aqueles que ainda se lembram de IDEA lembrarão que usaram o mod de adição 2 16 e o mod de multiplicação 2 16 + 1 como S-boxes que tinham a boa propriedade de serem reversíveis (meio necessário se você quiser descriptografar). Infelizmente, isso não poderia ser estendido para 32 bits porque 2 32 +1 não é ta número primo, portanto, nem todas as entradas têm a garantia de ser relativamente primo a ele e, portanto, você tem problemas para inverter a operação. Mas … isso é muito bom em nosso caso, nós não queremos nossa função de compressão seja invertível! Então, realmente, ” simples “, a multiplicação normal também deve funcionar?
Então, aquela compressão simples, sem especial e sem mágica a função passa a ser inicializada com a chave e IV, o que acidentalmente torna a saída final dependente da chave de uma forma ou de outra, então essa função comum torna-se efetivamente um MAC. Se você tiver ” dados extras “, basta inseri-los no hash antes de criptografar seus dados. Novamente, isso não é algo super especial.
No geral, não é nada que você não pudesse alcançar com praticamente todas as outras funções hash também.
Agora, Galois / counter presume que o modo contador seja usado. O modo contador (e seus derivados), bem como GHASH, têm a vantagem de poder criptografar / descriptografar blocos em paralelo. Além disso, GHASH é trivialmente paralelizável.
Sim, desempenho ! Mas sejamos honestos, isso é realmente uma vantagem, ou melhor, uma grande desvantagem ?
Faz diferença quanto tempo leva para descriptografar um gigabyte ou terabyte de tamanho mensagem, e quão bem você pode paralelizar esse trabalho? Ou aplicativos em que você deseja absolutamente ” buscar ” posições aleatórias? Bem, existem aplicações onde isso pode importar, com certeza. A criptografia de disco completo vem à mente. Mas você não gostaria de usar o GCM nesse caso, pois deseja que o tamanho de entrada e o tamanho de saída sejam idênticos.
Para um servidor ocupado (ou VPN), isso fará diferença, ou assim parece , mas eles podem processar qualquer coisa em paralelo de qualquer maneira, uma vez que têm muitas conexões simultâneas.Portanto, se você pode ou não paralelizar um stream, realmente não faz diferença no geral. E quanto aos aplicativos em que há poucas conexões? Bem, normalmente você não transmite terabytes de dados em um terminal de login e, se o fizer, sua conexão com a Internet ainda é provavelmente o fator limitante, já que o desempenho de núcleo único facilmente supera a largura de banda GbE, mesmo em processadores de desktop de 7 a 8 anos .
Tudo bem, você possivelmente terá que esperar 2-3 segundos a mais ao extrair um arquivo 7z de 2 TB criptografado em seu disco rígido (se criar milhares de entradas de diretório não for realmente o gargalo, o que estou inclinado a acredito que será o caso). Com que frequência você fez isso durante o último ano? Eu: zero vezes.
Os únicos para quem isso realmente faz diferença são os ” bandidos “, ou seja, exatamente aqueles que você não deseja que tenham uma vida fácil. Com certeza, se você puder paralelizar trivialmente, os ataques ficarão muito mais fáceis. Jogue uma sala cheia de hardware dedicado (GPUs, FPGAs, qualquer que seja) com o problema e deixe-o ir embora. Não é necessária comunicação entre os nós? Bem, perfeito, não pode ficar melhor.
Isso é realmente uma vantagem? Não sei, para mim parece uma grande desvantagem. Se qualquer coisa, eu gostaria de tornar a paralelização o mais difícil possível, não tão fácil quanto possível.
Então … ponderando o suficiente, e para a pergunta:
Qual é o algo fundamental que estou perdendo no GCM que o torna tão incrível que você deveria usá-lo?
Comentários
- Mas quem são os ” bandidos ” é impossível de definir. E isso tem um impacto ENORME nas recomendações governamentais e nas respostas neste fórum.
Resposta
TL; DR: O GCM oferece um desempenho excelente com as melhores propriedades de segurança que esperamos das cifras atuais (AEAD).
O GCM usa CTR para construir uma cifra de fluxo. Este é um método bem estudado, que tem apenas uma desvantagem: ele absolutamente precisa de alguma autenticação para evitar a inversão de bits. Antes do GCM, CTR-then-MAC era a solução. Uma vantagem principal das cifras de fluxo é a ausência de ataques de preenchimento (porque não há necessidade de preenchimento). Outra vantagem é que o AES-CTR pode se beneficiar das instruções AES-NI.
O GCM é CTR e depois MAC com melhor desempenho . Uma melhoria importante em relação ao CRT e depois ao MAC é a capacidade de sobrepor a execução da criptografia e autenticação. Além disso, ele provou ser seguro no modelo de segurança concreto e não é onerado por patentes, portanto, é “um acéfalo para usá-lo.
Ele tem algumas desvantagens: não é eficiente em hardware embarcado e é difícil de implementar de forma eficiente. O último ponto é contestado com o uso de bibliotecas escritas por outros. No entanto, essas são as razões pelas quais xchacha20-poly1305 se tornou popular em relação ao GCM.
Comentários
- Eu diria que outra razão pela qual ChaCha20 ganhou popularidade é porque não AES. Não ‘ para me interpretar mal, AES é um ótimo algoritmo, mas colocar literalmente todos os nossos ovos na mesma cesta talvez não seja a mais inteligente de todas as ideias. E ter um outro algoritmo bem testado além do AES é muito valioso
- @ MechMK1 Eu concordo com você , mas eu não escrevi que eles são todos os motivos da popularidade de ChaCha20 ‘ s, porque ‘ não é a pergunta feita aqui. Meu ponto era t hat GCM não é considerado ” incrível ” como o OP pensa.
- Absolutamente verdadeiro. Não ‘ não é uma galinha dos ovos de ouro, mas ninguém nunca foi demitido por usar AES-GCM, por assim dizer.
- E ‘ não é onerado por patentes.
- @StephenTouset Obrigado, editei minha postagem para incluir seu comentário.
Resposta
Em primeiro lugar, o GCM é uma forma de modo de contador. O que significa que, ao contrário de, por exemplo encadeamento de blocos de criptografia, a saída de um bloco depende de exatamente um bloco de entrada. Pior ainda: você pode modificar um único bit e o resultado descriptografado será diferente exatamente nesse bit. Porque, para ser honesto, uma cifra de bloco no modo contador não é uma “cifra de bloco”, mas um PRNG (chaveado) seguido por uma operação XOR. Basicamente, uma cifra de fluxo “em bloco”. Não é muito difícil imaginar um cenário em que alguém poderia abusar disso para alterar mensagens de forma prejudicial (por exemplo, alterar “transação: +5.000 \ $” para “transação: -5.000 \ $”).
A autenticação da mensagem que o GCM sobrepõe ao CTR torna sua maleabilidade irrelevante.
As cifras de bloco normalmente têm a propriedade inata de se transformar em uma tagarelice completa conforme você vira um único bit (mais, com o encadeamento, todo o restante da mensagem) . Na verdade, é uma propriedade muito boa e desejável, que simplesmente jogamos no mar sem um bom motivo.
Isso é muito, muito errado. Primeiro de tudo , O modo CBC também sofre de um tipo de fraqueza de maleabilidade; se você inverter um bit do texto cifrado, embaralhará apenas um bloco e inverta o bit correspondente do bloco de rede. E há outros ataques de maleabilidade contra CBC; consulte, por exemplo, o ataque EFail .
De maneira mais geral, sua ideia informal de mensagens “se transformando em um jargão” não é bom o suficiente. Precisamos absolutamente de computadores para detectar mecanicamente, com uma resposta definitiva “sim / não”, quando uma mensagem criptografada foi forjada. Confiar que um humano estará no loop cedo o suficiente para detectar “rabiscos” não é o suficiente.
GHASH é um MAC que suporta dados extra autenticados. Pelo que posso dizer, isso é uma mentira absoluta. Ou chame isso de “exagero otimista”, se preferir. É apenas uma função de compressão com matemática não intuitiva (para não matemáticos) por trás, mas no final ela não faz nada além de uma simples multiplicação e jogando fora metade dos bits de entrada com o equivalente a “estouro”.
O MAC não deixa de funcionar porque os usuários não entendem a matemática. Isso é como dizer que as pessoas não podem assistir TV por satélite porque não “Não sei cálculo. MACs de campo finito são uma construção padrão, conhecida há décadas.
Que é exatamente o que, com matemática mais mundana, pode ser feito em duas linhas de C código por bloco dentro de uma dúzia de ciclos (ou se você estiver OK em usar multiplicações de 32 bits em vez de 64, pode ser feito em paralelo, por exemplo, com AVX2 “s vpmulld para dois blocos completos em ~ 4 ciclos).
Há um debate real sobre se os MACs baseados em campos de Galois como GHASH ou MACs baseados em campos primos como Poly1305 são uma escolha mais prática. Muitos deles dependem das compensações entre projetar MACs para enfatizar implementações de software vs. hardware; por exemplo, multiplicações de campo de Galois são um pesadelo em software, mas muito mais simples do que multiplicações aritméticas em hardware. Uma boa parte das compensações também depende da vulnerabilidade a ataques de canal lateral, por exemplo, análise de poder .
Mas não há “um debate se os campos de Galois ou os campos principais são fundamentalmente desconhecidos WL. A matemática verifica os dois.
Oba, desempenho! Mas sejamos honestos, isso é realmente uma vantagem, ou melhor, uma enorme desvantagem?
Diga isso para os intermináveis desfiles de engenheiros ao longo das décadas que resistiram à adição de criptografia aos produtos por causa do desempenho. E não pense apenas em PCs poderosos; pense em dispositivos embarcados e tenha muito medo da Internet das Coisas.
Quer dizer, esse não é um assunto morto de forma alguma. Nos últimos dois anos, houve um intenso debate e o desenvolvimento de uma nova construção criptográfica para oferecer suporte à criptografia de disco completo em dispositivos Android low-end que foram avaliados não é poderoso o suficiente para os algoritmos baseados em AES que o Android oferecia antes.
Os únicos para quem [desempenho] realmente faz a diferença são os “bandidos”, ou seja, exatamente aqueles que você não quer ter um vida fácil. Com certeza, se você puder paralelizar trivialmente, os ataques ficarão muito mais fáceis. Jogue uma sala cheia de hardware dedicado (GPUs, FPGAs, qualquer que seja) no problema e deixe-o ir embora.
Cifras resolvem isso usando tamanhos de chave suficientemente grandes, não tornando as cifras mais lentas. A preocupação que você está trazendo surge na criptografia baseada em senha , onde você não “t temos chaves secretas entrópicas o suficiente. As chaves simétricas de 256 bits serão para sempre mais do que grandes o suficiente para derrotar qualquer ataque de força bruta em nosso universo.
O que é a coisa fundamental que estou perdendo no GCM que o torna tão incrível que você deveria usá-lo?
Você não precisa usar o GCM de forma alguma . É ao mesmo tempo:
- Fundamentall y som e amplamente suportado em hardware;
- Sobrecarregado por uma série de desvantagens que você não mencionou, como baixo desempenho do software e falha catastrófica de autenticidade na reutilização contínua, que muitas vezes o desqualificam em alguns contextos práticos .
Se você tem hardware com suporte nativo AES-GCM e software bem auditado que o aproveita, “não seria sensato não tê-lo entre seus principais candidatos.