我遇到了一个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();
我不知道问题出在哪里以及我必须做什么。
有人能帮帮我吗?谢谢。
对不起我的英语。
答案 0 :(得分:4)
问题在于如何初始化正在读取输入的字节数组。您正在根据RSA密钥的大小而不是输入流的预期大小来设置大小。
byte[] bytesToBeEncoded = new byte[(KEY_SIZE/8)-11];
密钥大小为1024位,因此1024/8 -11 = 128 - 11 = 117字节。这是您可以从流中读取的数据量,而不应与RSA密钥的大小相关。
您应该将字节数组初始化为您需要读入的最大数据大小,这将避免异常。例如:
byte[] bytesToBeEncoded = 1024;
允许最大输入字符串为1024个字符。