Java / JCE:解密用RSA加密的“长”消息

我有一个包含在byte []中的消息,用“RSA / ECB / PKCS1Padding”加密。 为了解密它,我创建了一个Cipher c并用它启动它

c = Cipher.getInstance("RSA/ECB/PKCS1Padding"); 

直到现在我只使用doFinal()方法解密小消息,返回带有解密字节的byte []。

 c.init(Cipher.DECRYPT_MODE, privateKey); byte[] decryptetBytes = c.doFinal(encryptedBytes); 

但在这种情况下,数据更大(约500字节), doFinal()方法抛出exception(javax.crypto.IllegalBlockSizeException:数据不得超过128字节)。 我想我需要使用update() – 方法,但我无法弄清楚如何让它正常工作。 这是怎么做到的?

我认为使用RSA加密除了密钥传输之外的任何东西都是滥用。

为对称密码生成新密钥,并使用该密钥加密批量数据。 然后用RSA加密密钥。 将对称加密的密文与非对称加密的内容加密密钥一起发送给收件人。

使用RSA,您只能加密/解密块,其大小可达到密钥长度减去填充长度。 如果你的数据长于你的密钥,它可能只是合并在一个数组中,所以你应该把它拆分成你的密钥大小的块(128字节表示没有填充的1024键,我不确定它是否可能)。 使用update()不是这里的情况。

简单地说,您必须知道如何创建此数组。

一般来说,RSA不应该用于加密大量数据,因为它非常耗时。 应该用于加密密钥到对称密码,如AES。

看看这里: https : //www.owasp.org/index.php/Digital_Signature_Implementation_in_Java

像埃里克森说的,

您应该采取加密的步骤是:

  1. 生成RSA密钥对(或从密钥库中检索公钥)
  2. 生成对称密钥(AES)
  3. 使用AES密钥加密数据
  4. 使用公共RSA密钥加密AES密钥
  5. 存储(或发送给具有私钥的人)加密的AES密钥和AES加密数据

要解密:

  1. 获取与用于加密的密钥对关联的私钥
  2. 使用私钥解密AES密钥
  3. 使用AES密钥解密数据
  4. 使用数据