Como posso criptografar um objeto java.util.Properties (pode ser de qualquer tamanho) usando uma chave RSA pública?
-
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)
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