簡體   English   中英

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

[英]encrypting and decryption large file using rsa in java

我使用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);
}
  1. 它假定每次要求讀取塊時,都會讀取整個塊。 情況不一定如此。 只能讀取幾個字節。 read()方法返回實際讀取的字節數(並存儲在i )。 你不應該忽視它。
  2. 除非你的文件大小是32的倍數,否則最后一個塊很可能不完整。所以在最后一次迭代中,你要加密文件的最后N個剩余字節+存儲的32-N個字節。上一次迭代的字節數組。

使用RSA加密大文件不是一個好主意。 例如,您可以生成隨機AES密鑰,使用RSA對其進行加密並將其存儲在輸出文件中,然后使用AES加密文件本身,這樣可以更快,並且對大輸入沒有任何問題。 解密將讀取加密的AES密鑰,對其進行解密,然后使用AES解密文件的其余部分。

混合密碼系統

示例 :對於1024位密鑰,您可以加密大約1024/8 = 128個字節
注意 :精確值為128字節 - 填充為11個字節

您可以使用對稱密鑰來加密和解密要傳輸的數據(> 128字節)。 RSA只能加密一定程度的數據(例如128字節),這取決於RSA密鑰長度。

這意味着如果要傳輸大於128字節的任何內容,則必須首先傳輸<128字節的對稱密鑰,以便您可以擁有以下內容:

  1. 生成對稱密鑰(<128字節)
  2. 使用RSA加密對稱密鑰
  3. 傳輸加密的對稱密鑰
  4. 用RSA解密對稱密鑰
  5. 使用對稱密鑰加密數據(> 128字節)
  6. 傳輸加密數據
  7. 使用對稱密鑰解密加密數據

或(同時傳輸加密的對稱密鑰和加密數據)

  1. 生成對稱密鑰(<128字節)
  2. 使用RSA加密對稱密鑰
  3. 使用對稱密鑰加密數據(> 128字節)
  4. 傳輸加密的對稱密鑰和加密數據
  5. 用RSA解密對稱密鑰
  6. 使用對稱密鑰解密加密數據

有關更多信息,請單擊此處(混合密碼系統)

你可以通過runlength編碼來解決這個問題。 使用DataOutputStream在開始處寫入一個整數,表示之后寫入的字節數。 解密時,讀取該整數,並僅使用它所說的字節數。

我注意到你以錯誤的方式使用 Cipher類。 使用 update方法將字節添加到 cipher並僅使用 doFinal一次。 使用 重載方法的重載版本非常重要。 inputOffset參數設置為零,將 inputLen參數設置為 i 這將確保 Cipher僅使用它應該使用的字節。

請參閱JB Nizets的回答。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM