tools / des
des/
Criptografia e descriptografia simétrica DES, para trabalhar com sistemas legados que ainda usam DES. Modo, preenchimento, formato da chave e do IV e codificação são configuráveis, os resultados batem com Java e CryptoJS, e sua chave nunca sai do navegador.
Texto simples
Texto cifrado
Histórico
Cada criptografia ou descriptografia bem-sucedida é salva automaticamente. Os últimos 20 registros ficam guardados apenas no navegador deste dispositivo. As chaves nunca são salvas, mas o IV e o texto simples descriptografado são; em um computador compartilhado, limpe o histórico ao terminar.
AES, DES e RSA: o que são e quais as diferenças
AES e DES são cifras simétricas: a mesma chave criptografa e descriptografa, como uma chave que tanto tranca quanto destranca a porta. São rápidas e servem para grandes volumes de dados; a dificuldade é entregar essa chave ao outro lado com segurança.
O DES é um padrão antigo, da década de 1970, com chave efetiva de apenas 56 bits, que hoje pode ser quebrada por força bruta com hardware dedicado ou clusters de computadores; só serve para se comunicar com sistemas legados que ainda o usam. O AES substituiu o DES como padrão. Usa chaves de 128, 192 ou 256 bits, não tem nenhum ataque prático conhecido hoje e é a escolha padrão para criptografar dados.
O RSA é assimétrico: existe um par de chaves. A chave pública pode ser dada a qualquer pessoa e serve para criptografar; a chave privada fica com você e serve para descriptografar, como uma caixa de correio em que qualquer um pode deixar cartas, mas só você consegue abrir. Não é preciso combinar uma chave antes, mas o RSA é lento e só criptografa algumas centenas de bytes por vez. Sistemas reais costumam combinar os dois: o RSA criptografa uma chave AES gerada aleatoriamente para o outro lado, e o AES criptografa os dados de fato.
O que é um modo de operação e qual usar?
O DES criptografa 8 bytes por vez; o modo define como dados maiores são divididos em blocos e como os blocos se relacionam. O ECB criptografa cada bloco separadamente, então conteúdos idênticos geram textos cifrados idênticos e vazam padrões; evite. O CBC mistura cada bloco com o bloco cifrado anterior antes de criptografar, e o primeiro bloco com o IV; é a escolha mais comum. CFB, OFB e CTR transformam o DES em um fluxo de chave que sofre XOR com os dados byte a byte, então não precisam de preenchimento.
Chave, IV e preenchimento
Uma chave DES tem 8 bytes, mas o bit menos significativo de cada byte é um bit de paridade que não é usado, então a chave efetiva tem só 56 bits. Se a chave tiver mais de 8 bytes, só os primeiros 8 são usados, como no DESKeySpec do Java e no CryptoJS; chaves menores são rejeitadas. Todos os modos, exceto o ECB, precisam de um IV de 8 bytes. Ele não precisa ser secreto, mas nunca o reutilize com a mesma chave.
ECB e CBC exigem que o tamanho dos dados seja múltiplo de 8 bytes, então dados menores são completados conforme o preenchimento escolhido. PKCS5Padding e PKCS7Padding são idênticos para o DES e são os mais comuns. O ZeroPadding completa com zeros e remove todos os bytes zero finais ao descriptografar, então um texto simples que já termine em bytes zero os perde. O NoPadding não acrescenta nada, e você mesmo precisa acertar o tamanho.
Equivalência com Java e CryptoJS
O Cipher.getInstance("DES/CBC/PKCS5Padding") do Java significa CBC com PKCS5Padding; apenas "DES" usa por padrão ECB com PKCS5Padding. No Java, o CTR só funciona com NoPadding. Os modos e preenchimentos do CryptoJS.DES.encrypt têm o mesmo nome, e CryptoJS.pad.Pkcs7 é o PKCS7Padding. Em sistemas novos, use AES.
Perguntas frequentes
Dá para criptografar e descriptografar 3DES (DESede, TripleDES) aqui?
Não, aqui só existe o DES simples. Uma chave 3DES tem 16 ou 24 bytes; ao colar uma, só os primeiros 8 bytes são usados, então o resultado difere do 3DES, e o campo Chave também mostra "só os primeiros 8 bytes são usados". Para 3DES, use uma ferramenta compatível com DESede.
O que fazer quando aparece "A chave tem N bytes; uma chave DES precisa ter pelo menos 8 bytes"?
Menos de 8 bytes gera um erro, e nada é completado com zeros para você, então complete a chave até 8 bytes por conta própria. Um deslize mais provável é o formato errado: se uma chave hex de 16 caracteres for informada com o formato da chave definido como string, ela é tratada como 16 bytes de texto e só os primeiros 8 caracteres são usados. Não há erro, apenas o aviso "só os primeiros 8 bytes são usados" ao lado do campo Chave e abaixo do resultado, e a saída não vai bater. No formato string, a contagem segue a codificação escolhida, então um caractere chinês ocupa 3 bytes em UTF-8.
O que fazer quando aparece "neste modo, o IV deve ter exatamente 8 bytes"?
O IV do DES deve ter exatamente 8 bytes, e não os 16 bytes do AES, em todos os modos, exceto o ECB. Uma chave com mais de 8 bytes é cortada nos primeiros 8, mas o IV não: se for longo ou curto demais, dá erro, e um IV de 16 bytes vindo das configurações do AES precisa ser trocado por um de 8 bytes. Confira também o formato: 16 caracteres hex formam 8 bytes, enquanto os mesmos 16 caracteres no formato string são 16 bytes. O ECB não precisa de IV e oculta o campo IV.
O que fazer quando a descriptografia diz "preenchimento inválido" ou "não é múltiplo de 8"?
Um texto cifrado cujo tamanho não é múltiplo de 8 geralmente indica uma cópia incompleta ou hex e base64 trocados. Preenchimento inválido geralmente indica que a chave, o IV, o modo ou o preenchimento é diferente do usado na criptografia. ZeroPadding e NoPadding não verificam o preenchimento e, por isso, nunca geram esse erro, mas o resultado vira lixo se os parâmetros estiverem errados.
O início do texto descriptografado está ilegível, ou aparece que o resultado não é texto UTF-8 válido
Verifique o IV primeiro. Quando o texto cifrado tem mais de um bloco, um IV errado nos modos CBC e CFB estraga só o primeiro bloco de 8 bytes; o resto sai correto e nenhum erro de preenchimento aparece. Você vê caracteres ilegíveis no início e texto correto depois. Se a mensagem disser que o resultado não é texto válido, a codificação pode ser diferente da usada na criptografia, por exemplo, se o outro lado usou GBK. Definir o formato de saída como hex permite conferir primeiro os próprios bytes descriptografados.
O resultado não bate com o de Java ou CryptoJS. Como investigar?
Confira nesta ordem: modo e preenchimento, formato e quantidade de bytes da chave e do IV, codificação e formatos de entrada e saída. O texto simples em formato string não é aparado, então uma quebra de linha extra no final gera outros dados. CTR, CFB e OFB também são completados conforme o preenchimento escolhido aqui, então com PKCS5Padding o texto cifrado fica maior que o texto simples; se o back-end usa NoPadding, escolha NoPadding aqui também. O CFB daqui é a variante de bloco completo de 64 bits, então não bate com um back-end que use CFB8.
O resultado de CryptoJS.DES.encrypt começa com U2FsdGVkX1. Dá para descriptografar aqui?
Não. Quando você passa uma string simples como chave para CryptoJS.DES.encrypt(mensagem, string), o CryptoJS a trata como uma senha: acrescenta um salt aleatório e deriva a chave e o IV como o OpenSSL faz, e o resultado começa com U2FsdGVkX1. Esse formato não é suportado aqui. Para bater com esta ferramenta, converta a chave em bytes no CryptoJS com CryptoJS.enc.Utf8.parse, passe-a e defina iv, mode e padding explicitamente.
O que o histórico guarda e ele é enviado para algum lugar?
Fica só no localStorage do navegador deste dispositivo e nunca é enviado; o código da página não faz nenhuma requisição de rede. Um registro é adicionado a cada criptografia ou descriptografia bem-sucedida, até 20 são mantidos, e nada cuja entrada ou resultado passe de 20.000 caracteres é registrado. Cada registro guarda os parâmetros, o IV, a entrada e o resultado, além de uma impressão digital de 8 caracteres derivada dos primeiros 8 bytes da chave (os caracteres depois do # em cada registro, que servem para saber se é a mesma chave), mas nunca a chave em si; por isso, depois de clicar em "Carregar", você precisa informar a chave de novo. Cada registro pode ser excluído individualmente e, em um computador compartilhado, clique em "Limpar histórico" ao terminar.