我希望加密数据的长度与原始文本的长度相同,因为我必须遵守长度约束。我正在使用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);
编码数据非常大,我可以做些什么来制作原始数据?
答案 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
。