Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

encrypting and decryption large file using rsa in java

I am using RSA algorithm for encryption and decryption of a file with size more than rsa key size.

In the code below for encryption, i am reading file content in block-wise and converting into cipher text. Block-size is 32 bytes.

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();

At decryption part, same block-wise decryption is done in the code where i have mentioned the block size as 128 bytes

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);
}

Input file size is 81.3 kB and file contains

0
1
2
3
4.....29000 

After the file is decrypted,output contain some extra values which are not relevant. why is that extra data in the result?

like image 863
Prajwal Rai Avatar asked Aug 13 '26 20:08

Prajwal Rai


1 Answers

Your IO code for reading block by block is incorrect:

while ((i = fin1.read(block)) != -1) {
    byte[] inputfile= cipher.doFinal(block);
    fout.write(inputfile);
}
  1. It assumes that every time you ask to read a block, a whole block is read. That is not necessarily the case. Only a few bytes might be read. The number of bytes that are actually read are returned by the read() method (and stored in i). You should not ignore it.
  2. The last block has a pretty good chance of being incomplete, unless your file size is a multiple of 32. So at the last iteration, you're encrypting the last N remaining bytes of the file + the 32 - N bytes that were stored in the byte array at the previous iteration.

Using RSA to encrypt a large file is not a good idea. You could for example generate a random AES key, encrypt it using RSA and store it in the output file, and then encrypt the file itself with AES, which is much faster and doesn't have any problem with large inputs. The decryption would read the encrypted AES key, decrypt it, and then decrypt the rest of the file with AES.

like image 92
JB Nizet Avatar answered Aug 15 '26 08:08

JB Nizet