gpt4 book ai didi

java - 在java中使用rsa加密和解密大文件

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:24:57 25 4
gpt4 key购买 nike

我正在使用 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,文件包含

01234.....29000 

文件解密后,输出包含一些不相关的额外值。为什么结果中有额外的数据?

最佳答案

您逐 block 读取的 IO 代码不正确:

while ((i = fin1.read(block)) != -1) {
byte[] inputfile= cipher.doFinal(block);
fout.write(inputfile);
}
  1. 它假定每次您要求读取一个 block 时,都会读取整个 block 。不一定如此。可能只读取几个字节。实际读取的字节数由 read() 方法返回(并存储在 i 中)。你不应该忽视它。
  2. 最后一个 block 很可能不完整,除非你的文件大小是 32 的倍数。所以在最后一次迭代中,你要加密文件的最后 N 个剩余字节 + 32 - N 个字节在上一次迭代中存储在字节数组中。

使用 RSA 加密大文件不是一个好主意。例如,您可以生成一个随机 AES key ,使用 RSA 对其进行加密并将其存储在输出文件中,然后使用 AES 对文件本身进行加密,这样速度要快得多,并且对于大输入没有任何问题。解密将读取加密的 AES key ,对其进行解密,然后使用 AES 对文件的其余部分进行解密。

关于java - 在java中使用rsa加密和解密大文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29512300/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com