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-1
。 n
是密钥长度。
所以基本上,无论你采取什么信息,你都要加密到n
那么大的东西。 消息必须小于n
。
但是必须使用填充方案将消息转换为整数(因此您可以进行取幂)。 该填充方案可能需要少于n位。 因此,您最终会获得比加密数据大小更大的文件。 此外,最后一个块可能小于n
位,但将加密为大小n
。