Criptografia RSA, obtendo um comprimento ruim
-
19-09-2019 - |
Pergunta
Ao chamar a seguinte função:
byte[] bytes = rsa.Encrypt(System.Text.UTF8Encoding.UTF8.GetBytes(stringToEncrypt), true);
Agora estou recebendo o erro: mau comprimento.
Com uma corda menor que funciona, quaisquer idéias qual o problema pode ser a string que estou passando é menos de 200 caracteres.
Solução
A criptografia RSA é apenas média para pequenas quantidades de dados, a quantidade de dados que você pode criptografar depende do tamanho da chave que você está usando, por exemplo, para as teclas RSA de 1024 bits e o PKCS # 1 V1.5 Padding, você pode criptografar 117 Bytes no máximo, com uma chave RSA de 2048, você pode criptografar 245 bytes.
Há uma boa razão para isso, a criptografia assimétrica é computacionalmente cara. Se você deseja criptografar grandes quantidades de dados, você deve usar a criptografia simétrica. Mas e se você quiser não repudiação? Bem, o que você faz é usar os dois. Você cria uma chave simétrica e a troca usando a criptografia assimétrica e, em seguida, trocou com segurança a chave simétrica para criptografar suas grandes quantidades de dados. É isso que o SSL e o WS-Secure usam embaixo das tampas.
Outras dicas
Para pesquisas futuras sobre as exceções do RSA de mau comprimento ...
Você pode calcular o número máximo de bytes que podem ser criptografados com um tamanho de chave específico com o seguinte:
((KeySize - 384) / 8) + 37
No entanto, se o parâmetro ideal de estofamento de criptografia assimétrica (OAEP) for verdadeiro, como está no post original, o seguinte pode ser usado para calcular os bytes máximos:
((KeySize - 384) / 8) + 7
Os tamanhos de chave legal são 384 a 16384, com um tamanho de salto de 8.
Conforme explicado acima, a solução para as exceções do tipo 'comprimento ruim' é hibridizar o uso da criptografia simétrica e assimétrica, de modo que o tamanho do texto que você está criptografando não é limitado pelo tamanho da chave. Você basicamente usa a criptografia RSA para criptografar por assimetricamente chave .
Para criptografia:
Gere uma chave aleatória do comprimento necessário para a técnica de criptografia simétrica, como AES ou Rijndael.
Criptografar simetricamente seu texto/dados usando AES/Rijndael usando a chave aleatória gerada na Etapa 1.
Usando o RSA, criptografa assimetricamente a chave aleatória gerada na etapa 1.
Para descriptografia:
Primeiro descriptografar a chave aleatória gerada por AES/Rijndael usando sua chave RSA privada.
Em seguida
Para uma demonstração, você pode dar uma olhada neste exemplo a seguir em C#:
http://www.technical-recipes.com/2013/using-rsa-to-encrypt-large-data-files-in-c/