1

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

编码后的数据很大,怎么做才能和原始数据一样小?

4

3 回答 3

3

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

当然,您不应该直接使用 RSA 直接加密数据,而应该加密一个随机会话/数据密钥。但即便如此,您仍会将加密的会话密钥作为开销。

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

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

于 2012-06-08T20:23:10.607 回答
1

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

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

于 2012-06-08T20:26:08.800 回答
1

RSA 的本质是在加密和解密中使用幂运算。

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

如果你想一想,关于某事力量的信息会产生更大的数字。因为你做了一个 mod n,所以你最终得到的数字最多是n-1. n是密钥长度。

所以基本上,无论你接收什么消息,你都会加密到n. 消息必须小于n

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

于 2014-07-16T14:49:45.940 回答