大型数据未使用RSA加密

10

我的问题:

我的加密代码在64个字符以下正常工作。但如果超过64个字符,我会收到以下错误:

javax.crypto.IllegalBlockSizeException: input must be under 64 bytes

加密代码

        cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding);
        cipher.init(Cipher.ENCRYPT_MODE, publicKey);
        encryptedBytes = cipher.doFinal(message.getBytes(StandardCharsets.UTF_8));
        rsaEncrypted= Base64.encodeToString(encryptedBytes, Base64.NO_WRAP);

密钥生成代码

      KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA");
      keyGen.initialize(512);
      KeyPair keypair = keyGen.genKeyPair();
      PublicKey pub = keypair.getPublic();
      byte[] pubs = pub.getEncoded();

我的问题:

使用512位密钥加密大文本是否可行?我的代码有任何错误吗?

注意:如果有人需要完整的代码,我将稍后更新。


3
要加密的数据大小受RSA密钥大小的限制。使用更大的密钥或使用对称加密。 - pedrofb
问题已经得到解答,为什么还要费心设置赏金呢? - President James K. Polk
2
希望这个问题能帮到你。 - Ashvin solanki
2
https://dev59.com/Wmkw5IYBdhLWcg3wSogs - Ashvin solanki
1
512位RSA密钥对于加密来说太短了。 - Ebbe M. Pedersen
显示剩余5条评论
2个回答

14

一个RSA块可以加密的字节数取决于所使用的密钥大小减去填充所占用的字节数。

一般情况下,由于速度较慢,RSA不适合用于大量加密。如果可能的话,请使用对称加密算法,例如AES。如果确实需要使用RSA的两个密钥,则可以使用混合方法,在此方法中,您使用随机对称密钥加密数据,然后再使用RSA密钥加密该密钥。

使用对称加密的好处之一是库自动支持批量加密,而它们不支持RSA。


12

以下是来自Ferguson, Schneier和Kohno合著的开创性书籍《Cryptography Engineering》中的直接引用:

加密消息是RSA的典型应用,但实际上几乎从未被使用。原因很简单:RSA可以加密的消息大小受n的大小限制。在实际系统中,你甚至不能使用所有位数,因为编码函数有一定的开销。这种受限制的消息大小对于大多数应用程序来说过于不切实际,而且由于RSA操作在计算方面相当昂贵,所以你不想将消息分成较小的块,并使用单独的RSA操作加密每个块。

换句话说,对于一个n位的RSA密钥,RSA能够加密的数据的最大长度(以字节为单位)为

Floor(n/8) - 11 

其中11字节是为了填充而保留的。

因此,对于512位密钥大小,可以加密的最大数据长度为,

512/8 - 11 = 53 bytes

以下是来自书籍《密码学工程》的内容:

几乎所有地方都使用的解决方案是选择一个随机秘密密钥 K,并使用 RSA 密钥加密 K。然后,使用块密码或流密码使用密钥 K 加密实际消息 m。因此,不发送类似 ERSA(m) 的内容,而是发送 ERSA(K),EK(m)。

基本上,它告诉您执行以下操作以克服 RSA 的限制:

  1. 使用 AES 等算法生成一个秘密密钥 K。
  2. 使用新生成的秘密密钥对明文 m 进行加密,得到密文,例如 EK(m)。
  3. 用 RSA 公钥加密密钥,得到 ERSA(K)。
  4. 向客户端发送密文 EK(m) 和加密密钥 ERSA(K)。
  5. 客户端可以使用 RSA 私钥解密 ERSA(K) 以获得 K。
  6. 然后客户端使用 K 解密密文 EK(m) 以获取 m。

请考虑此解决方案 https://dev59.com/oLT3oIgBc1ULPQZFjCu0#71268250。这不需要混合加密。 - Nandhan Thiravia

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接