2012-06-08 30 views
0

我希望加密的数据与我的原始文本具有相同的长度,因为我必须尊重长度限制。我正在使用BouncyCastle加密数据的长度非常大,RSA

这里是我的代码生成密钥对:

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); 

编码的数据量非常大,我能做些什么来让尽可能小原始数据?

回答

2

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

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

通过使用椭圆曲线密码(其输出是密钥大小最小值的两倍,但密钥大小远小于实现相同安全级别),您可以删除非对称加密数据/密钥的一些位。 EC密码学并不是为了温顺,它有很多复杂性。

512位RSA被认为是不安全的方式。最少使用1024或保持在http://www.keylength.com/列出的ECRYPT II或NIST建议。

+0

啊好吧我明白了,谢谢。 –

+0

我一直给你带来好消息,不是 - 对不起,你当然欢迎。 –

+0

HHH不,他们是我的坏消息,但他们良好的信息;) –

1

如果你能保持密钥的秘密,你可以使用像AES这样的对称密码系统。如果在CFB模式下使用,它可以适应任何位长度。即#位输入&输出是相同的。

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

+0

是的,我用的是AES,但由于密钥是非常弱的(只有4位是不是在我的情况非常安全)。不管怎么说,还是要谢谢你。 –

+1

AES密钥通常是随机生成的,作为对数据进行加密的一部分。我记得,使用AES-128是大致为3072位RSA密钥一样强。如果使用BouncyCastle的提供的设施(我随便忘记的名字,但考虑PGPDataEncryptorBuilder),它应该做的大部分工作适合你。 – bdow

0

RSA的本质是这样的,你可以在加密和解密中使用指数。

基本上,公钥e和私钥d,你带个口信m,然后你会得到一个压缩消息等于c=m^e和国防部它通过n。然后你用m=c^d进行解密,然后再用n(mod表示剩下的部分)进行解密。

如果你仔细想一想,那么一个强大的东西会导致更大的数字。因为你做了一个mod n,你最终得到的数字最多是n-1n是关键长度。

因此,基本上,你采取任何消息,你加密为高达n东西。该消息必须小于n

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