Qual é a principal diferença entre uma chave, um IV e um nonce?
Uma chave, no contexto da criptografia simétrica, é algo que se mantém em segredo. Qualquer pessoa que conheça a sua chave (ou possa adivinhá-la) pode desencriptar quaisquer dados que tenha encriptado com ela (ou forjar quaisquer códigos de autenticação que tenha calculado com ela, etc.).
(Há também a criptografia “assimétrica” ou de chave pública, onde a chave efetivamente tem duas partes: a chave privada, que permite a decriptação e/ou assinatura, e uma chave pública (derivada da chave privada correspondente) que permite a criptografia e/ou verificação de assinatura.)
Um IV ou vetor de inicialização é, no seu sentido mais amplo, apenas o valor inicial usado para iniciar algum processo de iteração. O termo é usado em alguns contextos diferentes e implica diferentes requisitos de segurança em cada um deles. Por exemplo, funções criptográficas de hash tipicamente têm uma IV fixa, que é apenas uma constante arbitrária que é incluída na especificação da função hash e é usada como o valor inicial de hash antes de qualquer dado ser alimentado em:
Conversamente, a maioria dos modos de operação de cifras de bloco requerem uma IV que é aleatória e imprevisível, ou pelo menos única para cada mensagem criptografada com uma determinada chave. (Claro, se cada chave for usada apenas para encriptar uma única mensagem, é possível escapar usando um IV fixo). Este IV aleatório assegura que cada mensagem encripta de forma diferente, de modo que ver várias mensagens encriptadas com a mesma chave não dá ao atacante mais informações do que apenas ver uma única mensagem longa. Em particular, assegura que encriptar duas vezes a mesma mensagem produz dois textos cifrados completamente diferentes, o que é necessário para que o esquema de encriptação seja semanticamente seguro.
Em qualquer caso, a IV nunca precisa de ser mantida em segredo – se o fizesse, seria uma chave e não uma IV. Na verdade, na maioria dos casos, manter o segredo do soro não seria prático, mesmo se você quisesse, já que o destinatário precisa saber para decodificar os dados (ou verificar o hash, etc.).
Um nonce, no sentido amplo, é apenas “um número usado apenas uma vez”. A única coisa geralmente exigida de um nonce é que ele nunca deve ser usado duas vezes (dentro do escopo relevante, como criptografia com uma determinada chave). Os IVs únicos usados para criptografia de cifra de bloco qualificam-se como nonces, mas vários outros esquemas criptográficos fazem uso de nonces também.
Existe alguma variação sobre qual dos termos “IV” e “nonce” é usado para diferentes modos de operação de criptografia de bloco: alguns autores usam exclusivamente um ou outro, enquanto alguns fazem uma distinção entre eles. Para o modo CTR, em particular, alguns autores reservam o termo “IV” para o bloco de entrada de cifra completa formado pela concatenação do nonce e o valor inicial do contador (geralmente um bloco de todos os bits zero), enquanto outros preferem não usar o termo “IV” para o modo CTR de maneira alguma. Isso tudo é complicado pelo fato de que existem várias variações em como o nonce/IV enviado com a mensagem no modo CTR é realmente mapeado na entrada inicial da cifra do bloco.
Conversamente, para modos diferentes do CTR (ou modos relacionados como EAX ou GCM), o termo “IV” é quase universalmente preferido em vez de “nonce”. Isto é particularmente verdadeiro para o modo CBC, uma vez que ele tem requisitos no seu IV (especificamente, que eles são imprevisíveis) que vão além do requisito habitual de singularidade esperado de nãoces.