2008-11-17 99 views
2

我有一个包含在一个字节[]中的消息,用“RSA/ECB/PKCS1Padding”加密。对其进行解密我创建Cipher c和与Java/JCE:解密用RSA加密的“long”消息

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

发起它直到现在我只解密小消息,使用doFinal()方法,返回与该解密后的字节的字节[]。

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

但是,在这种情况下,数据是大(约500个字节),和doFinal() -method抛出异常(javax.crypto.IllegalBlockSizeException:数据必须不长于128个字节)。我想我需要使用更新() - 方法,但我不知道如何让它正常工作。这是如何完成的?

回答

3

我想使用RSA加密的任何东西,但关键的运输滥用。

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

0

使用RSA,您只能加密/解密块的大小,直到您的密钥长度减填充长度。如果你的数据比你的密钥长,也许它只是合并到一个数组中,所以你应该把它分成大小与你的密钥(128字节建议1024键没有填充,我不知道是否有可能)。这里使用update()不是这种情况。

简单地说,你必须知道这个数组是如何创建的。

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

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

0

像埃里克森说,

你应该采取加密的步骤如下:

  1. 生成RSA密钥对(或密钥存储检索公钥)
  2. 生成对称密钥(AES)
  3. 使用AES密钥加密数据
  4. 使用公共RSA密钥加密AES密钥
  5. 存储(或发送给p与私钥erson)加密的AES密钥,以及AES加密数据

要解密:

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