Resumo

  • Na RFC 2040, RC5 só identifica uma transformação interoperável quando W, R, b, bytes da chave, modo, IV e tratamento final estão todos definidos.
  • Código, ASN.1 e vetores comprovam concordância em entradas específicas; não comprovam segurança, aleatoriedade, IV único, apagamento efetivo de memória, integração ou uso em produção.

Publicada em outubro de 1996 por Robert Baldwin e Ronald Rivest, a RFC 2040 descreveu quatro construções em detalhe suficiente para interoperabilidade: RC5, RC5-CBC, RC5-CBC-Pad e RC5-CTS. O enquadramento é essencial. O registro do RFC Editor a classifica como Informational e afirma que ela não especifica um padrão da Internet.

O texto também se apresenta como reformulação de material publicado anteriormente. A contribuição que importa aqui não é reivindicar a origem do RC5, mas registrar tudo que duas implementações precisam compartilhar para produzir os mesmos bytes.

Uma tupla, não apenas um nome

W representa o tamanho da palavra. O bloco B tem duas palavras, e BB expressa esse tamanho em bytes. R é o número de rodadas. b é o comprimento da chave do usuário e K são seus bytes reais. A expansão produz S, com T = 2(R+1) palavras. O CBC ainda depende de um vetor de inicialização I do tamanho de um bloco.

Dois programas podem declarar RC5 e executar máquinas diferentes. Basta divergirem em W, R, comprimento ou ordem dos bytes da chave, modo, IV ou regra final. Até uma coincidência de W/R/b permanece incompleta sem a chave efetivamente ligada ao objeto.

A expansão evidencia essa dependência. Os bytes de K entram em palavras little-endian, S é inicializada por constantes vinculadas a W, e os dois espaços são misturados durante três vezes o maior de seus comprimentos. O exemplo em C fixa um bloco de 64 bits. Seu resultado valida esse caminho específico, não todas as parametrizações da família.

O objeto torna o estado observável

A apresentação separa objetos de chave e de cifra. O objeto CBC guarda a opção de preenchimento, as rodadas, a chave expandida, o IV original, o bloco corrente de encadeamento, um bloco parcial de entrada e seu índice.

Encrypt_Init liga e expande a chave e recupera o encadeamento a partir do IV. SetIV preserva a chave expandida, mas troca o IV e reinicia corrente e buffer. Update recebe partes sucessivas da mensagem, segura a sobra, emite apenas blocos inteiros, combina cada bloco por XOR com a corrente e transforma o resultado na corrente seguinte.

É Final que resolve o significado da sobra. No CBC comum, bytes residuais causam erro. No CBC-Pad, a função sempre cria um bloco final e acrescenta de um a BB bytes, cada qual com o valor da quantidade adicionada. Uma mensagem já alinhada recebe um bloco inteiro de preenchimento. Finalizar faz parte da identidade da cifra.

Três modos se separam no fim

O CBC comum exige múltiplos do bloco. CBC-Pad aceita outros comprimentos aumentando a saída. CTS preserva o comprimento, mas rearranja as duas últimas porções. Primeiro cifra o penúltimo bloco encadeado; usa o prefixo necessário do intermediário como fragmento cifrado final; completa a última porção clara com zeros, combina-a com o intermediário e cifra novamente para gerar o bloco completo que será emitido antes do fragmento roubado.

Por isso CTS requer que o objeto retenha até dois blocos até Final. Antes desse momento, ele não sabe qual bloco completo é realmente o penúltimo nem quantos bytes irão para a ponta curta.

Os errata verificados completam a leitura executável. O Errata 513 restringe CTS a textos maiores que um bloco. O 514 manda usar o IV quando não há bloco cifrado anterior. O 587 restaura no procedimento de decifragem um XOR omitido e a mesma regra do IV. Uma implementação fiel apenas à versão não corrigida pode divergir justamente nos casos de fronteira.

O alcance real dos vetores

A seção 9 diz que o programa e os resultados ajudam a confirmar a correção de uma implementação. O programa usa blocos de oito bytes e lê sinal de preenchimento, rodadas, bytes da chave, IV de oito bytes e texto claro.

Uma saída igual é evidência concreta de acordo, para aquela tupla, no carregamento e expansão da chave, transformação de bloco, encadeamento e finalização. Uma saída diferente prova uma ruptura de acordo, mas não diagnostica sozinha o componente responsável.

Os resultados publicados cobrem CBC e CBC-Pad, não CTS. Tampouco observam geração de chave e IV, unicidade do IV, margem criptográfica, uso correto da interface, comportamento de compilador, apagamento de memória, transporte de parâmetros ou implantação. Um teste determinístico não pode responder a perguntas que não recebeu como entrada.

ASN.1 carrega uma identidade parcial

A seção 11 atribui arcos numéricos terminados em 8 e 9 a CBC e CBC-Pad. A sequência de parâmetros contém versão, rodadas, tamanho de bloco e IV opcional. Sem IV, a regra histórica usa um bloco de zeros do tamanho indicado. O Errata 6380 corrige nomes, capitalização e sintaxe de restrições do ASN.1, sem acrescentar campos.

b, bytes da chave e chave expandida ficam fora; CTS não recebe identificador nessa seção. O OID decide uma parte do contrato de interpretação, não todo o contexto executável. Um IV zero por regra de ausência mostra como ler a codificação, não que um sistema real tenha produzido IVs aleatórios ou únicos.

Intenção no código não é efeito observado

As funções de destruição escrevem zeros nas estruturas antes de liberá-las. Isso prova uma instrução no código-fonte. Não prova que o compilador manteve as escritas, que o alocador não guardou cópias ou que o processo apagou todo dado sensível. As passagens de 1996 sobre segurança e patentes também registram uma época; não são parecer atual.

Lida na escala correta, a RFC 2040 é um forte artefato de coordenação. Ela enumera decisões que precisam convergir. O erro começa quando concordância de bytes é promovida a evidência de segurança, operação correta ou adoção.

Fontes