Como posso criptografar um objeto java.util.Properties (pode ser de qualquer tamanho) usando uma chave RSA pública?

StackOverflow https://stackoverflow.com/questions/916061

  •  06-09-2019
  •  | 
  •  

Pergunta

Este é o código que estou usando atualmente. Ele usa o provedor BouncyCastle.

static
{
   Security.addProvider(new BouncyCastleProvider());
}

protected String encrypt(byte[] keyData, byte[] data) throws Exception {
   X509EncodedKeySpec keyspec = new X509EncodedKeySpec(keyData);
   KeyFactory kf = KeyFactory.getInstance("RSA", "BC");
   PublicKey pk = kf.generatePublic(keyspec);
   Cipher rsa =  Cipher.getInstance("RSA/None/OAEPWithSHA1AndMGF1Padding", "BC");
   rsa.init(Cipher.ENCRYPT_MODE, pk);
   byte[] output = rsa.doFinal(data);
   String result = base64EncodeBytes(output);
   return result;
}

Atualmente estou recebendo um

 java.lang.ArrayIndexOutOfBoundsException: too much data for RSA block
    at org.bouncycastle.jce.provider.JCERSACipher.engineDoFinal(Unknown Source)
    at javax.crypto.Cipher.doFinal(DashoA13*..)
    at Encryption.encrypt(RSAToken.java:60)
Foi útil?

Solução

Usando RSA para criptografar uma grande quantidade de dados não é uma boa prática.

A abordagem por protocolos de criptografia é gerar uma chave simétrica, usá-lo para criptografar os dados, em seguida, criptografar a chave simétrica com RSA.

Isto é como PGP e S / MIME trabalho. Também torna mais fácil para permitir que vários leitores para descriptografar os dados-criptografando a chave simétrica para cada destinatário, em vez de criptografar todos os dados para cada um.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top