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

时间:2018-08-09 08:00:36

标签: java android encryption 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位密钥加密大文本吗?我的代码有任何错误吗?

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

2 个答案:

答案 0 :(得分:11)

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

通常 RSA 不适合批量加密,因为它相当慢。如果可以,请改用对称加密算法,例如 AES 。如果您确实需要RSA的两个密钥,请使用混合方法,在该方法中,使用随机对称密钥加密数据,然后使用RSA密钥加密该密钥。

使用对称加密的好处还在于,这些库自动支持批量加密-不适用于RSA。

答案 1 :(得分:7)

以下是弗格森,施耐尔和科诺的著作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进行加密。因此,您发送的不是E RSA (m),而是发送E RSA (K),E K (m)。

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

  1. 使用诸如AES之类的算法生成密钥K
  2. 使用新生成的密钥对明文m进行加密,以获取密文,例如E K (m)。
  3. 用RS​​A公钥E RSA (K)加密密钥。
  4. 向客户端发送密文E K (m)和加密密钥E RSA (K)。
  5. 客户端可以使用RSA私钥解密E RSA (K),以获得K
  6. 然后,客户端使用K解密密文E K (m),以获得m