我的问题:

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

注意:如果有人想要完整的代码,我将在以后进行更新。

最佳答案

这是弗格森(Ferguson),施奈尔(Schneier)和科诺(Kohno)的一本开创性著作《 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的限制,
  • 使用诸如AES之类的算法生成密钥K
  • 使用新生成的密钥对明文m进行加密,以获取密文,例如EK(m)。
  • 将秘密密钥加密为RSA公共密钥ERSA(K)。
  • 向客户端发送密文EK(m)和加密密钥ERSA(K)。
  • 客户端可以使用RSA私钥解密ERSA(K)以获得K
  • 然后,客户端使用K解密密文EK(m)以获得m

    07-24 09:49
    查看更多