Idioma: Português

tools / rsa

rsa/

Criptografe com uma chave pública RSA e descriptografe com a privada, ou criptografe com a privada e descriptografe com a pública. Preenchimento, formato da chave, formato de entrada / saída e codificação são configuráveis, e suas chaves nunca saem do navegador.

Texto simples

Chave

Texto cifrado

Histórico

Cada criptografia ou descriptografia bem-sucedida é salva automaticamente. As últimas 20 ficam guardadas, somente no navegador deste dispositivo. As chaves nunca são salvas, mas o texto simples descriptografado é; por isso, limpe o histórico ao terminar em um computador compartilhado.

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.

Quantos dados o RSA consegue criptografar de uma vez?

O RSA só consegue criptografar um pequeno bloco de dados por vez, limitado pelo tamanho da chave e pelo preenchimento. Com PKCS1Padding, o limite é o tamanho da chave em bytes menos 11, ou seja, 245 bytes para uma chave de 2048 bits. Com OAEP, é o tamanho da chave em bytes menos duas vezes o tamanho do hash menos 2, ou seja, 190 bytes para uma chave de 2048 bits com SHA-256. Dados maiores costumam ser criptografados com AES, e o RSA é usado para criptografar a chave AES.

Correspondência com os nomes do Cipher do Java

Os nomes de preenchimento seguem o Cipher do Java: para RSA/ECB/PKCS1Padding escolha PKCS1Padding; para RSA/ECB/OAEPWithSHA-256AndMGF1Padding escolha a terceira opção, já que o Java usa SHA-1 para o MGF1 por padrão; se você definir hashes personalizados com OAEPParameterSpec, escolha OAEPPadding e selecione o hash OAEP e o hash MGF1 separadamente. As codificações também seguem as regras do Java; por exemplo, o UTF-16 é codificado em big-endian, com um FE FF no início.

Por que o texto cifrado é diferente a cada vez?

Ao criptografar com a chave pública, tanto o PKCS1Padding quanto o OAEP acrescentam bytes aleatórios ao preenchimento, então o mesmo texto gera um texto cifrado diferente a cada vez, e todos eles são descriptografados com a chave privada. Isso é esperado. A criptografia com a chave privada usa preenchimento fixo, então o resultado é sempre o mesmo. O OAEP só funciona para criptografia com chave pública e descriptografia com chave privada.

Formatos de chave suportados

As chaves PEM podem ser BEGIN PUBLIC KEY, BEGIN RSA PUBLIC KEY, BEGIN PRIVATE KEY ou BEGIN RSA PRIVATE KEY, e você também pode colar apenas o corpo em Base64. Uma chave hex é o mesmo conteúdo em hexadecimal. Chaves privadas protegidas por senha precisam ser descriptografadas antes. Com o tipo de chave definido como chave pública, você também pode colar uma chave privada, e a parte pública dela será usada.

Perguntas frequentes

O que fazer quando a descriptografia falha com "a chave não corresponde, o tipo de chave ou o preenchimento está errado"?

Verifique três coisas, uma a uma. Primeiro, se a chave é o par da chave pública usada para criptografar, pois o conteúdo criptografado com uma chave pública só pode ser aberto pela chave privada correspondente. Segundo, o tipo de chave deve estar definido como chave privada. Terceiro, o preenchimento deve ser igual ao do lado que criptografou; com OAEPPadding, o hash OAEP e o hash MGF1 também precisam ser iguais. Por fim, confirme o formato de entrada, porque trocar hex por base64 (ou o contrário) também faz a descriptografia falhar.

O que fazer quando o formato da chave é recusado ou aparece que CERTIFICATE não é suportado?

Primeiro confirme que "Formato da chave" corresponde ao que você colou: escolha pem para texto que começa com -----BEGIN e hex para uma longa sequência de hexadecimais; quando estiver errado, você normalmente recebe uma mensagem dizendo para qual trocar. O PEM precisa conter uma chave pública ou privada RSA, e um certificado (BEGIN CERTIFICATE) não pode ser usado diretamente; você pode extrair a chave pública antes com openssl x509 -in cert.pem -pubkey -noout. Quando um certificado e uma chave são colados juntos, o bloco da chave é separado automaticamente.

Minha chave privada tem senha e a página pede para descriptografá-la antes. O que faço?

Chaves privadas protegidas por senha não são suportadas (BEGIN ENCRYPTED PRIVATE KEY ou uma linha Proc-Type: 4,ENCRYPTED no cabeçalho do PEM). Remova a senha no seu próprio computador antes e depois cole a chave, por exemplo com openssl rsa -in arquivo-original -out arquivo-novo, informando a senha quando solicitado. O arquivo resultante é uma chave privada sem proteção, então trate-o com cuidado depois de usar.

Diz que o conteúdo passou do limite. Quantos caracteres chineses consigo criptografar?

O limite conta bytes, não caracteres. Uma chave de 2048 bits com PKCS1Padding permite no máximo 245 bytes, e um caractere chinês ocupa 3 bytes em UTF-8, então cerca de 81 caracteres; com a codificação GBK, um caractere ocupa 2 bytes, então cerca de 122. Ao criptografar, depois de colar uma chave, o painel da chave mostra "no máximo N bytes por criptografia" para a chave e o preenchimento atuais. Ultrapassar o limite gera um erro, e a ferramenta não divide o conteúdo em blocos automaticamente.

Como descriptografo dados criptografados com JSEncrypt ou Web Crypto no navegador?

O JSEncrypt usa PKCS1Padding e gera Base64, então escolha PKCS1Padding aqui e defina o formato de entrada como base64. O RSA-OAEP do Web Crypto do navegador usa um mesmo hash tanto para o OAEP quanto para o MGF1, então escolha OAEPPadding aqui e defina o hash OAEP e o hash MGF1 com o mesmo valor, por exemplo SHA256 nos dois. Nos dois casos, defina o tipo de chave como chave privada.

O que significam "o texto cifrado é maior que a chave" e "fora do intervalo desta chave"?

O texto cifrado RSA tem o mesmo comprimento da chave em bytes: 256 bytes para uma chave de 2048 bits, que são 512 caracteres em hex, e nunca mais que isso. Ao descriptografar, o painel da chave mostra "texto cifrado de N bytes" ao lado do título, então compare esse valor com a contagem de bytes ao lado da entrada. Um texto cifrado maior que a chave geralmente indica formato de entrada errado ou conteúdo extra copiado; um valor fora do intervalo significa que o texto cifrado não foi criptografado com a chave pública que forma par com esta chave, então troque pela chave certa.

A criptografia com chave privada e a descriptografia com chave pública servem para assinar e verificar?

Não diretamente. A criptografia com chave privada aqui apenas aplica a chave privada à sua entrada com PKCS1Padding e não faz hash, enquanto uma assinatura como SHA256withRSA calcula primeiro o hash dos dados e depois envolve o hash em uma estrutura fixa (DigestInfo). Por isso, descriptografar aqui uma assinatura padrão com a chave pública dá essa estrutura, não o texto original. Para assinar ou verificar, use uma biblioteca ou ferramenta que suporte algoritmos como SHA256withRSA.

O que o histórico guarda e ele é enviado para algum lugar?

Ele fica apenas no localStorage do navegador deste dispositivo e nunca é enviado; o código da página não faz nenhuma requisição de rede. Uma entrada é adicionada a cada criptografia ou descriptografia bem-sucedida, até 20 ficam guardadas, e o que tiver entrada ou resultado acima de 20.000 caracteres não é registrado. Cada registro guarda os parâmetros, a entrada e o resultado, além de uma impressão digital de 8 caracteres derivada da chave (os 8 primeiros caracteres hex do SHA-256 do módulo, mostrados depois do # em cada registro e usados para saber se é a mesma chave), mas nunca a chave em si; por isso, depois de clicar em "Carregar", é preciso colar a chave de novo. O texto simples descriptografado é salvo, então, em um computador compartilhado, clique em "Limpar histórico" ao terminar.