RSA的加密数据长度非常大

时间:2012-06-08 20:05:19

标签: java rsa bouncycastle

我希望加密数据的长度与原始文本的长度相同,因为我必须遵守长度约束。我正在使用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);

编码数据非常大,我可以做些什么来制作原始数据?

3 个答案:

答案 0 :(得分:3)

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

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

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

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

答案 1 :(得分:1)

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

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

答案 2 :(得分:1)

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

基本上,对于公钥 e 和私钥 d ,您会收到消息 m 然后您会收到等于 c=m^e 的压缩邮件,并按 n 进行修改。然后用 m=c^d 解密,然后再按 n 进行修改(mod表示取余数)。

如果你仔细想想,就会发出一些信息来传达更多数字。因为您执行mod n ,所以最终会得到一个最多 n-1 的数字。 n 是密钥长度。

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

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