我正在使用 RSA 算法对大小超过 rsa key 大小的文件进行加密和解密。
在下面的加密代码中,我正在逐 block 读取文件内容并将其转换为密文。 block 大小为 32 字节。
FileInputStream fin1 = new FileInputStream(genfile);
FileOutputStream fout = new FileOutputStream(seedcipher);
byte[] block = new byte[32];
int i;
while ((i = fin1.read(block)) != -1)
{
byte[] inputfile= cipher.doFinal(block);
fout.write(inputfile);
}
fin1.close();
在解密部分,在我提到的 block 大小为 128 字节的代码中完成了相同的 block 式解密
FileInputStream fin1 = new FileInputStream(encryptedfile);
FileOutputStream fout = new FileOutputStream(seedcipher);
DataInputStream dos =new DataInputStream(fin1);
DataOutputStream dosnew =new DataOutputStream(fout);
byte[] block = new byte[128];
int i;
while ((i = fin1.read(block)) != -1)
{
byte[] inputfile= cipher.doFinal(block);
fout.write(inputfile);
}
输入文件大小为 81.3 kB,文件包含
0 1 2 3 4.....29000
文件解密后,输出包含一些不相关的额外值。为什么结果中有额外的数据?
最佳答案
您逐 block 读取的 IO 代码不正确:
while ((i = fin1.read(block)) != -1) {
byte[] inputfile= cipher.doFinal(block);
fout.write(inputfile);
}
- 它假定每次您要求读取一个 block 时,都会读取整个 block 。不一定如此。可能只读取几个字节。实际读取的字节数由 read() 方法返回(并存储在
i
中)。你不应该忽视它。 - 最后一个 block 很可能不完整,除非你的文件大小是 32 的倍数。所以在最后一次迭代中,你要加密文件的最后 N 个剩余字节 + 32 - N 个字节在上一次迭代中存储在字节数组中。
使用 RSA 加密大文件不是一个好主意。例如,您可以生成一个随机 AES key ,使用 RSA 对其进行加密并将其存储在输出文件中,然后使用 AES 对文件本身进行加密,这样速度要快得多,并且对于大输入没有任何问题。解密将读取加密的 AES key ,对其进行解密,然后使用 AES 对文件的其余部分进行解密。
关于java - 在java中使用rsa加密和解密大文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29512300/