Как зашифровать объект java.util.Properties (может быть любого размера) с помощью открытого ключа RSA? - PullRequest
2 голосов
/ 27 мая 2009

Это код, который я сейчас использую. Он использует провайдера 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;
}

Я сейчас получаю

 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)

1 Ответ

7 голосов
/ 27 мая 2009

Использование RSA для шифрования большого количества данных не является хорошей практикой.

Подход, используемый криптографическими протоколами, заключается в создании симметричного ключа, его использовании для шифрования данных, а затем шифровании этого симметричного ключа с помощью RSA.

Вот так работают PGP и S / MIME. Это также позволяет нескольким читателям легко расшифровывать данные - шифруя симметричный ключ для каждого предполагаемого получателя, а не шифруя все данные для каждого.

...