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 回答