java - RSA ( 模数/指数) 加密:RSA块数据太多

  显示原文与译文双语对照的内容

我有 modulus keyexponent 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);
}

下面是 public 密钥生成


30819F300D06092A864886F70D010101050003818D0030818902818100B390F7412F2554387597814A25BC11BFFD95DB2D1456F1B66CDF52BCC1D20C7FF24F3CCE7B2D66E143213F64247454782A377C79C74477A28AF6C317BE68BC6E8FF001D375F9363B5A7161C2DFBC2ED0850697A54421552C6288996AC61AF5A9F7DE218ABBC75A145F891266615EB81D11A22B7260F7608083B373BA4BC0756B0203010001
size: 342

谢谢!

时间: 原作者:

通常使用大型文档 public 密钥( 非对称) 加密的方法是创建一个随机的。单一的密码短语。 密码密码与基于密码的加密( 对称) 算法( 比如,aes-256 ) 一起使用。 使用AES加密文档,然后使用 public 密钥加密密码短语。

一般来说,对称加密算法往往比非对称加密算法快一些。 不仅如这里,RSA不仅不能直接对大型文档进行加密,而且还需要更多的计算来进行加密。

另外,我将提到加密是很难找到的。 我强烈建议你以标准的方式使用标准库以确保安全实现。

原作者:

错误是愚蠢的:


byte[] cipherText = rsa.doFinal(data.getBytes());//ERROR HERE

我加密 data.getBytes(),但实际上我首先需要从它的十六进制表示中解码 data,然后再加密它。

原作者:
...