Java 使用RSA加密的数据长度非常大

Java 使用RSA加密的数据长度非常大,java,rsa,bouncycastle,Java,Rsa,Bouncycastle,我希望加密数据与原始文本具有相同的长度,因为我必须遵守长度限制。我正在使用BouncyCastle 以下是生成密钥对的代码: KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA"); keyGen.initialize(512); KeyPair keypair = keyGen.genKeyPair(); PublicKey pub = keypair.getPublic(); byte[] pubs = pub.getEnc

我希望加密数据与原始文本具有相同的长度,因为我必须遵守长度限制。我正在使用
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个,或遵守中列出的ECRYPT II或NIST建议。

无,至少不涉及RSA。RSA需要一定量的填充来确保安全,并且由于数据通过任何压缩方法都会被视为随机数据,因此您也无法对其进行压缩

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

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


顺便说一下,512位RSA被认为是不安全的。使用1024作为最小值,或遵守中列出的ECRYPT II或NIST建议。

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


RSA和ElGamal——主要的公钥密码系统——可以在几个小时内被破解,即使是在您选择的512位。1024-4096位为正常值。除非您的对手仅限于使用90年代的硬件,否则小于512位将一文不值。:-)

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


RSA和ElGamal——主要的公钥密码系统——可以在几个小时内被破解,即使是在您选择的512位。1024-4096位为正常值。除非您的对手仅限于使用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

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

基本上,对于公钥
e和私钥
d
,您需要一条消息
m
,然后您得到一条压缩消息,该消息等于
c=m^e
,并通过
n
对其进行修改。然后用
m=c^d
解密,然后再次用
n
对其进行修改(mod表示取剩余部分)

如果你想一想,一个信息的力量会导致一个更大的数字。因为你做了一个mod
n
,你得到的数字最多是
n-1
n
是键的长度

因此,基本上,无论你接收什么消息,你都会加密到像
n
一样大的东西。消息必须小于
n


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

是的,我使用的是AES,但在我的情况下它不是很安全,因为密钥非常弱(只有4位数字)。无论如何谢谢。AES密钥通常是作为数据加密的一部分随机生成的。我记得,使用AES-128大致与3072位RSA密钥一样强大。如果你使用boun