[英]Encryption with RSA (modulus/exponent) : too much data for RSA block
我有一个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
谢谢!
对大型文档使用公钥(非对称)加密的通常方法是创建随机的一次性密码。 该密码短语与基于密码的加密(对称)算法(例如AES-256)一起使用。 使用AES加密文档,然后使用公共密钥加密密码短语。
一般而言,对称加密算法比非对称加密算法快几个数量级。 因此,RSA不仅不适合直接对大型文档进行加密,而且还需要更多的计算才能进行加密。
顺便说一句,我将提到加密很难实现。 我强烈建议您以标准方式使用标准库,以确保安全实施。
错误只是愚蠢的:
byte[] cipherText = rsa.doFinal(data.getBytes()); // ERROR HERE
我加密了data.getBytes()
,但是实际上我首先需要从其十六进制表示形式解码data
,然后才对其进行加密。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.