2011-08-05 66 views
1

我想使用java标准库,并且据我所知,其功能输入是有限的。所以我为此实现了两种方法。在这里,他们是:RSA加密和解密java中的长消息

private byte[] RSAenc(String in) throws Exception { 
    Cipher c = Cipher.getInstance("RSA"); 
    c.init(Cipher.ENCRYPT_MODE, privKey); 
    int l = in.length(); 

    byte[] part; 
    byte[] result = new byte[(int)(64*java.lang.Math.ceil(l/20.0))]; 
    int i = 0; 
    while(i*20+20<l) { 
     part = c.doFinal(in.substring(i*20,i*20+19).getBytes("UTF-8")); 
     System.arraycopy(part, 0, result, i*64, part.length); 
     i = i+1; 
    } 
    part = c.doFinal(in.substring(i*20,l-1).getBytes("UTF-8")); 
    System.arraycopy(part, 0, result, i*64, part.length); 
    return result; 

} 

private String RSAdec(byte [] in) throws Exception { 
    Cipher c = Cipher.getInstance("RSA"); 
    c.init(Cipher.DECRYPT_MODE, privKey); 

    String result = ""; 
    byte[] part = new byte[64]; 
    int l = in.length; 
    int i = 0; 
    while(i+64<=l) { 
     System.arraycopy(in, i, part, 0, part.length); 
     result = result + new String(c.doFinal(part), "UTF-8"); 
     i= i+64; 
    } 
    return result; 
} 

他们以这种方式工作:加密我打破字符串最多,20种大小子,然后用密码加密它们。对于解密,我将字节数组分成64字节块,并对它们应用密码解密。 有没有这样做的功能?或者至少有没有更好的解决方案?我的方法有多安全?在JRE的所有发行版上加密结果长度(result.length)始终为64?

Thanx,

+0

另请参见[如何使用非对称加密,例如RSA来加密任意长度的明文?](http://crypto.stackexchange.com/questions/14/how-can-i-use-asymmetric -cryption-such-as-rsa-to-encrypt-an-any-length)在crypto.stackexchange.com上。 –

回答

5

RSA适用于密钥加密,而不是批量数据加密。

除了使用RSA对消息进行加密之外,大多数协议都会为对称密码(如AES)生成密钥,并使用该密钥对消息进行加密。然后,使用RSA加密该对称密钥,以便只有消息收件人才能恢复它。 RSA加密的对称密钥与AES加密消息一起发送给接收方。

+0

谢谢...对称密钥(对于AES或DES)始终小于64(RSA加密器的最大值)字节? –

+0

@ kvphxga:好吧,一个好的RSA密钥至少应该是2048位,所以它应该能够加密大于64个字节。但是,是的,所有这些密码都使用64个字节或更少的密钥。 – erickson

+0

@kvphxga:DES有56位密钥 - 这是非常小的,今天不应该使用(因为暴力破解不需要太多时间)。 AES有三种密钥大小为128位(16字节),192位(24字节)或256位(32字节)的变体,并且被认为是安全的。 –