2009-05-27 55 views
2

這是我目前使用的代碼。它使用BouncyCastle提供程序。如何使用RSA公鑰加密java.util.Properties對象(可以是任何大小)?

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) 
+0

使用NoPadding是不安全的。如果可以,請使用OAEP,如果不能,則使用PKCS#1填充(版本1.5)。 – erickson 2009-05-27 15:40:38

+0

我更新它使用OAEPWithSHA1AndMGF1Padding。謝謝你的提示。這是我第一次加密。我們正在加密的數據(許可證數據)並不重要,但我對它的瞭解越多越好。 – ScArcher2 2009-05-27 16:21:06

回答

7

使用RSA加密大量的數據是不是一個好的做法。

密碼協議採取的方法是生成一個對稱密鑰,用它來加密數據,然後使用RSA加密該對稱密鑰。

這就是PGP和S/MIME的工作原理。它還可以很容易地讓多個閱讀器通過加密每個預期收件人的對稱密鑰來解密數據,而不是爲每個收件人加密整個數據。