RSA的加密数据长度非常大

我希望加密数据的长度与原始文本的长度相同,因为我必须遵守长度约束。 我正在使用BouncyCastle

这是生成密钥对的代码:

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

这是我的加密代码:

 Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1PADDING"); PublicKey pk = KeyFactory.getInstance("RSA").generatePublic(new X509EncodedKeySpec(pubs)); cipher.init(Cipher.ENCRYPT_MODE, pk); byte[] cipherBytes = cipher.doFinal(plainArray); 

编码数据非常大,我可以做什么做小原始数据?

没什么,至少不是关于RSA。 RSA要求一定量的填充是安全的,并且由于数据将被任何压缩方法视为随机数据,因此您也无法压缩它。

当然,您不应该直接使用RSA直接加密数据,而应该加密随机会话/数据密钥。 但即使这样,您也会将加密的会话密钥作为开销。

您可以使用椭圆曲线加密技术删除非对称加密数据/密钥的一些位(其输出是密钥大小最小的两倍,但密钥大小要小得多,以达到相同的安全级别)。 EC密码术并不适合温顺,但它有很多复杂性。

顺便说一下,512位RSA被认为是不安全的。 最少使用1024或保留http://www.keylength.com/上列出的ECRYPT II或NIST建议。

如果您可以保密密钥,则可以使用AES等对称密码系统。 如果在CFB模式下使用,它可以适应任何位长度。 即#bits输入和输出是相同的。

RSA和ElGamal–主要的公钥密码系统 – 在你选择的时候,即使是512位,也可以在几个小时内完成。 1024 – 4096位是正常的。 除非您的对手仅限于使用20世纪90年代的硬件,否则少于512位是毫无价值的。 🙂

RSA的本质是您在加密和解密中使用取幂。

基本上,对于公钥e和私钥d ,你接收消息m然后你得到一个等于c=m^e的压缩消息并用n它。 然后用m=c^d解密并再次用n它(mod意味着取余数)。

如果你仔细想想,就会发出一些关于某种东西力量的信息。 因为你做了一个mod n ,你得到一个最多为n-1n是密钥长度。

所以基本上,无论你采取什么信息,你都要加密到n那么大的东西。 消息必须小于n

但是必须使用填充方案将消息转换为整数(因此您可以进行取幂)。 该填充方案可能需要少于n位。 因此,您最终会获得比加密数据大小更大的文件。 此外,最后一个块可能小于n位,但将加密为大小n