我的问题:
我的加密代码适用于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的限制,
K
。 m
进行加密,以获取密文,例如EK(m)。 K
。 K
解密密文EK(m)以获得m
。