2

これは私が現在使用しているコードです。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)
4

1 に答える 1

7

RSA を使用して大量のデータを暗号化することは、適切な方法ではありません。

暗号化プロトコルで採用されているアプローチは、対称キーを生成し、それを使用してデータを暗号化し、その対称キーを RSA で暗号化することです。

これが PGP と S/MIME の仕組みです。また、対象の受信者ごとにデータ全体を暗号化するのではなく、対象の受信者ごとに対称キーを暗号化することで、複数のリーダーがデータを復号化できるようにすることも容易になります。

于 2009-05-27T14:45:46.863 に答える