大数据未使用RSA加密进行加密

Ran*_*mar 7 java encryption android rsa

我的问题:

我的加密代码适用于64个以下的字符.但如果它超过64个字符,我得到以下错误

javax.crypto.IllegalBlockSizeException: input must be under 64 bytes
Run Code Online (Sandbox Code Playgroud)

加密代码

        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);
Run Code Online (Sandbox Code Playgroud)

密钥生成代码

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

我的问题:

有可能用512位密钥加密大文本吗?我的代码中有错误吗?

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

Ebb*_*sen 11

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

通常RSA不适合批量加密,因为它很慢.如果可以,请使用AES等对称加密算法.如果您确实需要两个RSA密钥,请使用混合方法,使用随机对称密钥对数据进行加密,然后使用RSA密钥加密该密钥.

使用对称加密的好处还在于库自动支持批量加密 - 它们不适用于RSA.


Ind*_*sak 8

以下是Cryptography EngineeringFerguson,Schneier和Kohno 撰写的开创性着作中的直接引用,

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

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

Floor(n/8) - 11 
Run Code Online (Sandbox Code Playgroud)

其中11个字节用于填充

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

512/8 - 11 = 53 bytes
Run Code Online (Sandbox Code Playgroud)

再次从书中Cryptography Engineering,

几乎在所有地方使用的解决方案是选择随机密钥K,并使用RSA密钥加密K. 然后使用分组密码或流密码用密钥K对实际消息m进行加密.因此,不是发送类似E RSA(m)的东西,而是发送E RSA(K),E K(m).

基本上,它告诉你做以下事情来克服RSA的限制,

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