2

我有一条消息包含在一个字节 [] 中,用“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()方法会引发异常(javax.crypto.IllegalBlockSizeException:数据不得超过 128 字节)。我想我需要使用update() - 方法,但我不知道如何让它正常工作。这是怎么做到的?

4

3 回答 3

4

我认为将 RSA 加密用于除密钥传输之外的任何事情都是滥用。

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

于 2012-04-20T20:30:28.140 回答
2

使用 RSA,您只能加密/解密大小不超过您的密钥长度减去填充长度的块。如果您的数据比您的密钥长,则它可能只是合并到一个数组中,因此您应该将其拆分为具有密钥大小的块(128 字节表示没有填充的 1024 密钥,我不确定是否可能)。使用 update() 不是这里的情况。

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

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

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

于 2012-01-19T06:53:32.297 回答
1

正如埃里克森所说,

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

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

解密:

  1. 获取与用于加密的密钥对关联的私钥
  2. 用私钥解密 AES 密钥
  3. 使用 AES 密钥解密数据
  4. 使用数据
于 2012-06-20T15:58:20.037 回答