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

标签 java encryption rsa public-key-encryption

我正在使用 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);
}
  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/

相关文章:

安卓.security.KeyStoreException : Unknown error On a rare number of devices

c++ - Crypto API RSA 公钥可以解密数据,不是预期的不对称

java - 在 java : HTTP response code 414 中通过 http 读取文件

java - 如何组合来自 Collectors.groupingBy 的结果

java - AsyncTask 和回调 Android

ios - 从使用 Swift 或 Objective C 中的密码短语编码的 RSA 私钥字符串中检索 SecKey

.net - 在 web.config 中加密连接字符串

java - 过滤器在 Struts2 中不起作用

java - java和android的加密区别

python - 在 Google App Engine Python SDK 上使用 RSA 私钥签署字符串