未使用 RSA 加密加密的大型数据



我的问题:

我的加密代码适用于 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 位密钥加密大文本?我的代码有错误吗?

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

您可以在一个RSA块中加密的字节数由使用的密钥大小减去填充占用的任何字节数决定。

通常,RSA不适合批量加密,因为它非常慢。如果可以的话,请使用像AES这样的对称加密算法。如果确实需要 RSA 的两个密钥,请使用混合方法,使用随机对称密钥加密数据,然后使用 RSA 密钥加密该密钥。

使用对称加密的一个好处是,这些库自动支持批量加密 - 而 RSA 则不支持。

这是直接引用弗格森、施奈尔和科诺的开创性著作《Cryptography Engineering》中的一句话,

加密消息是 RSA 的规范应用,但在实践中几乎从未使用过。原因很简单:可以使用 RSA 加密的消息大小受 n 大小的限制。在实际系统中,您甚至不能使用所有位,因为编码函数具有开销。这种有限的消息大小对于大多数应用程序来说太不切实际了,而且由于 RSA 操作在计算方面非常昂贵,因此您不希望将消息拆分为较小的块并使用单独的 RSA 操作对每个块进行加密。

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

Floor(n/8) - 11 

其中 11 字节用于填充

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

512/8 - 11 = 53 bytes

再次来自书Cryptography Engineering

几乎在任何地方使用的解决方案是选择一个随机密钥K,并使用RSA密钥加密K。然后使用分组密码或流密码使用密钥 K 对实际消息 m 进行加密。因此,您发送的不是ERSA(m(之类的东西,而是ERSA(K(,EK(m(。

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

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

最新更新