我正在使用 RSA 算法对大小超过 rsa 密钥大小的文件进行加密和解密。
在下面的加密代码中,我正在按块读取文件内容并转换为密文。块大小为 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();
在解密部分,在代码中完成了相同的分块解密,其中我提到块大小为 128 字节
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
文件解密后,输出包含一些不相关的额外值。为什么结果中有额外的数据?
您逐块读取的 IO 代码不正确:
while ((i = fin1.read(block)) != -1) {
byte[] inputfile= cipher.doFinal(block);
fout.write(inputfile);
}
- 它假设每次您要求读取一个块时,都会读取整个块。情况不一定如此。只能读取几个字节。实际读取的字节数由 read() 方法返回(并存储在
i
)。你不应该忽视它。
- 最后一个块很有可能不完整,除非您的文件大小是 32 的倍数。因此,在最后一次迭代中,您要加密文件的最后 N 个剩余字节 + 存储在的 32 - N 个字节上一次迭代的字节数组。
使用 RSA 加密大文件并不是一个好主意。例如,您可以生成一个随机 AES 密钥,使用 RSA 对其进行加密并将其存储在输出文件中,然后使用 AES 加密文件本身,这样速度更快,并且对于大输入不会有任何问题。解密将读取加密的 AES 密钥,对其进行解密,然后使用 AES 解密文件的其余部分。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)