2013-03-05 115 views
2

我試圖使用RSAngine庫在彈性城堡中使用2048位長度密鑰進行加密/解密。我能夠創建密鑰,存儲在不同的文件中並從文件中獲取,但是當我解密圖像時,會產生一些我不知道解密文件無法正確顯示的情況。文件創建正確,我認爲這個問題是在processBlock方法,同時加密和/或decrypting.The代碼如下加密:使用RSA Bouncy Castle加密/解密無法正常工作

InputStream clearTextFile; 
    FileOutputStream textFileProcessed=new FileOutputStream(fileName); 
      //getKey is a method I implemented and works correctly 
    RSAKeyParameters key=getKey(keyFileName); 
    RSAEngine rsaEngine=new RSAEngine(); 
    rsaEngine.init(true,key);   
    clearTextFile=new FileInputStream(nameClearTextFile); 
    byte[] bytesReaded; 
    int nBytesReaded; 
    int inputBlockSize=rsaEngine.getInputBlockSize(); 
    do 
    { 
     bytesReaded = new byte[inputBlockSize]; 
     nBytesReaded=clearTextFile.read(bytesReaded); 
     if(nBytesReaded>-1) 
     {  //This is for the last block if it's not 256 byte length 
      if(nBytesReaded<inputBlockSize) 
      { 
       byte[] temp=new byte[nBytesReaded]; 
       for(int i=0;i<nBytesReaded;i++) 
       { 
        temp[i]=bytesReaded[i]; 
       } 
       byte[] encryptedText=rsaEngine.processBlock(temp,0,nBytesReaded); 
       textFileProcessed.write(encryptedText); 
      } 
      else 
      { 
       byte[] encryptedText=rsaEngine.processBlock(bytesReaded,0,inputBlockSize); 
       textFileProcessed.write(encryptedText); 
      } 
     } 
    }while(nBytesReaded>-1); 
    textFileProcessed.flush(); 
    textFileProcessed.close(); 
    textFileProcessed.close(); 

並且解密:提前

InputStream encryptedTextFile=new FileInputStream(nameOfFile); 
    OutputStream decryptedTextFile=new FileOutputStream(nameOfFile); 
    RSAKeyParameters key=getKey(nameKeyFile); 
    RSAEngine rsaEngine=new RSAEngine(); 
    rsaEngine.init(false,key); 
    byte[] bytesReaded; 
    int nBytesReaded; 
    int inputBlockSize=rsaEngine.getInputBlockSize(); 
    do 
    { 
     bytesLeidos = new byte[inputBlockSize]; 
     nBytesReaded=encryptedTextFile.read(bytesReaded); 
     if(nBytesReaded>-1) 
     { 
       byte[] decryptedText=rsaEngine.processBlock(bytesReaded,0,inputBlockSize);   
       decryptedTextFile.write(decryptedText);     
     } 
    }while(nBytesReaded>-1); 
    decryptedTextFile.flush(); 
    decryptedTextFile.close(); 
    encryptedTextFile.close(); 

感謝

+0

請簡化代碼刪除所有文件讀/寫。這將有助於隔離問題是加密還是IO工作。嘗試創建一個[SSCCE](http://sscce.org/) - 這對我們很有幫助,它是解決您自己問題的好方法。 – 2013-03-06 08:01:52

+0

問題是我認爲錯誤在於加密或解密,錯誤可能在於保存文件中的字節或從那裏讀取。我不知道它是這種方式,但它可能會保存有關數據,這是真正的問題 – Javier 2013-03-06 11:06:06

+2

我建議簡化的原因是要找出問題所在。刪除IO操作,您將確定您的密碼學是否有問題。如果不是,那麼這可能是IO操作。這是一個基本的調試原理。 – 2013-03-06 14:59:11

回答

0

我想你需要更改此行:

if(nBytesReaded>1) 

這個

if(nBytesReaded>-1) 

而在decypt部分改變這一點,也許:

rsaEngine.init(false,clave); 

這個

rsaEngine.init(false,key); 

但可能還有更多。如果最後一個塊不是全尺寸,則不會對整個輸入進行加密。

+0

謝謝,我沒有看到第一個。第二個是翻譯時的錯誤。顯然它需要整個輸入,因爲在21KB文件大小和getInputBlockSize最後一個它是82字節長度,這就是我創建temp.After處理後的原因RSAEngine添加填充或類似的東西,如果我沒有錯。儘管我修復了錯誤,但問題依然存在 – Javier 2013-03-06 00:51:30

0

RSAEngine不會添加填充,因此會導致數據塊中的前導零丟失。您還需要使用其中一種編碼模式。

我建議使用對稱密鑰算法,以及只使用RSA加密對稱密鑰。它會更快,並且根據您的數據,也更安全。

問候,

大衛

相關問題