我有一个modulus key
和一个exponent key
,我创建一个RSA public key
来加密data
,但我得到了这个例外
java.lang.ArrayIndexOutOfBoundsException: too much data for RSA block
以下是详细信息:
模数值:
B390F7412F2554387597814A25BC11BFFD95DB2D1456F1B66CDF52BCC1D20C7FF24F3CCE7B2D66E143213F64247454782A377C79C74477A28AF6C317BE68BC6E8FF001D375F9363B5A7161C2DFBC2ED0850697A54421552C6288996AC61AF5A9F7DE218ABBC75A145F891266615EB81D11A22B7260F7608083B373BA4BC0756B
size: 256
指数值:
010001
要加密的数据:
1A0498EA0DF19B45043DA4688AE3A7B3D592D61CC0EBB82FB100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
size: 256
这是代码:
public static String encryptData(String data, BigInteger modulus, BigInteger exponent) throws Exception {
RSAPublicKeySpec spec = new RSAPublicKeySpec(modulus, exponent);
KeyFactory factory = KeyFactory.getInstance("RSA", "BC");
PublicKey pub = factory.generatePublic(spec);
Cipher rsa = Cipher.getInstance("RSA", "BC");
rsa.init(Cipher.ENCRYPT_MODE, pub);
byte[] cipherText = rsa.doFinal(data.getBytes()); // ERROR HERE
return Hex.toString(cipherText);
}
这是生成的公钥
30819F300D06092A864886F70D010101050003818D0030818902818100B390F7412F2554387597814A25BC11BFFD95DB2D1456F1B66CDF52BCC1D20C7FF24F3CCE7B2D66E143213F64247454782A377C79C74477A28AF6C317BE68BC6E8FF001D375F9363B5A7161C2DFBC2ED0850697A54421552C6288996AC61AF5A9F7DE218ABBC75A145F891266615EB81D11A22B7260F7608083B373BA4BC0756B0203010001
size: 342
谢谢!
答案 0 :(得分:1)
对大型文档使用公钥(非对称)加密的常用方法是创建随机的一次性密码短语。密码短语与基于密码的加密(对称)算法(例如,AES-256)一起使用。使用AES加密文档,然后使用公钥加密密码。
一般来说,对称加密算法往往比非对称加密算法快几个数量级。因此,RSA不仅不能直接加密大型文档,而且还需要更多的计算才能进行加密。
顺便说一句,我会提到加密很难做到。我强烈建议您以标准方式使用标准库,以确保安全实施。
答案 1 :(得分:0)
错误只是愚蠢:
byte[] cipherText = rsa.doFinal(data.getBytes()); // ERROR HERE
我加密data.getBytes()
,但实际上我首先需要从其十六进制表示中解码data
,然后才加密它。