[英]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);
}
i
)。 你不應該忽視它。 使用RSA加密大文件不是一個好主意。 例如,您可以生成隨機AES密鑰,使用RSA對其進行加密並將其存儲在輸出文件中,然后使用AES加密文件本身,這樣可以更快,並且對大輸入沒有任何問題。 解密將讀取加密的AES密鑰,對其進行解密,然后使用AES解密文件的其余部分。
混合密碼系統
示例 :對於1024位密鑰,您可以加密大約1024/8 = 128個字節
注意 :精確值為128字節 - 填充為11個字節
您可以使用對稱密鑰來加密和解密要傳輸的數據(> 128字節)。 RSA只能加密一定程度的數據(例如128字節),這取決於RSA密鑰長度。
這意味着如果要傳輸大於128字節的任何內容,則必須首先傳輸<128字節的對稱密鑰,以便您可以擁有以下內容:
- 生成對稱密鑰(<128字節)
- 使用RSA加密對稱密鑰
- 傳輸加密的對稱密鑰
- 用RSA解密對稱密鑰
- 使用對稱密鑰加密數據(> 128字節)
- 傳輸加密數據
- 使用對稱密鑰解密加密數據
或(同時傳輸加密的對稱密鑰和加密數據)
- 生成對稱密鑰(<128字節)
- 使用RSA加密對稱密鑰
- 使用對稱密鑰加密數據(> 128字節)
- 傳輸加密的對稱密鑰和加密數據
- 用RSA解密對稱密鑰
- 使用對稱密鑰解密加密數據
有關更多信息,請單擊此處(混合密碼系統)
你可以通過runlength編碼來解決這個問題。 使用DataOutputStream在開始處寫入一個整數,表示之后寫入的字節數。 解密時,讀取該整數,並僅使用它所說的字節數。
我注意到你以錯誤的方式使用
Cipher類。
使用
update
方法將字節添加到
cipher
並僅使用
doFinal
一次。
使用
此重載方法的重載版本非常重要。
將
inputOffset
參數設置為零,將
inputLen
參數設置為
i
。
這將確保
Cipher
僅使用它應該使用的字節。
請參閱JB Nizets的回答。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.