2012-03-11 67 views
4

我在使用Java编写RSA应用程序时遇到了问题。使用RSA加密长字符串(Java)

我必须从文件中读取字符串,对其进行加密,然后将加密的字符串保存到新文件中。

我的RSA密钥长度为1024位。

代码的部分是哪里的问题,如下:

  readBytes = in.read(bytesToBeEncoded, 0, bytesToBeEncoded.length); 

      while(readBytes != -1){ 
       encodedContent = ciph.update(bytesToBeEncoded, 0, readBytes); 
       out.write(encodedContent); 
       bytesToBeEncoded= new byte[(KEY_SIZE/8)-11]; 
       readBytes = in.read(bytesToBeEncoded, 0, bytesToBeEncoded.length);     
      } 

      encodedContent = ciph.doFinal(); 
      out.write(encodedContent); 

其中变量是这样定义的:

 byte[] bytesToBeEncoded = new byte[(KEY_SIZE/8)-11]; 

     FileInputStream in = new FileInputStream(new File(file1)); 
     FileOutputStream out = new FileOutputStream(new File(file2)); 
     int readBytes; 

的一点是,当我加密一个欠于─ 117个字节的字符串,它完美(加密和然后解密孔),但是当尺寸较大时,应用程序将引发此异常:

javax.crypto.IllegalBlockSizeException: Data must not be longer than 117 bytes 

通过抛出该异常:

encodedContent = ciph.doFinal(); 

我不知道问题出在哪里,我必须做的事情。

任何人都可以帮助我吗?谢谢。

对不起,我的英语。

+1

你真的需要使用RSA加密你的数据吗?标准模式是使用RSA加密随机对称密钥,并使用该对称密钥加密实际数据。 – CodesInChaos 2012-03-11 16:33:44

+0

您应该收听CodeInChaos,而不是使用RSA密钥直接加密数据。这是违反所有良好做法的。此外,您的缓冲区大小根本不应与输入大小相关。 – 2012-03-13 23:49:49

回答

4

问题在于如何初始化您正在读取输入的字节数组。您正在根据RSA密钥的大小设置大小,而不是根据输入流的预期大小。

byte[] bytesToBeEncoded = new byte[(KEY_SIZE/8)-11]; 

密钥大小为1024位,所以1024/8 -11 = 128-11 = 117字节。这是您可以从流中读取的数据量,并且不应与RSA密钥的大小相关。

您应该将字节数组初始化为您需要读入的最大数据大小,这将避免出现异常。例如:

byte[] bytesToBeEncoded = 1024; 

将允许1024个字符的最大输入字符串。

+0

嗨史蒂文,感谢您的快速回答。 我donde(byte [] bytesToBeEncoded =新字节[1024]),但问题仍然存在。 :S程序继续抛出相同的异常。不管怎么说,还是要谢谢你。 :) – Shuli 2012-03-11 15:01:13

+0

避免我的评论,我没有看到你写的是一个例子。现在我将数组初始化为要读取的内容的大小,并稍微修改了我的代码,并且它工作正常。 ^^非常感谢! – Shuli 2012-03-11 15:24:24