2012-03-11 37 views
4

私はJavaで行う必要があるRSAアプリケーションに問題があります。RSA(Java)で長い文字列を暗号化

ファイルから文字列を読み取り、暗号化してから、暗号化された文字列を新しいファイルに保存する必要があります。

私のRSAキーの長さは1024ビットです。

問題があるコードの一部で、以下の通りです:変数は次のように定義されている

  readBytes = in.read(bytesToBeEncoded, 0, bytesToBeEncoded.length); 

      while(readBytes != -1){ 
       encodedContent = ciph.update(bytesToBeEncoded, 0, readBytes); 
       out.write(encodedContent); 
       bytesToBeEncoded= new byte[(KEY_SIZE/8)-11]; 
       readBytes = in.read(bytesToBeEncoded, 0, bytesToBeEncoded.length);     
      } 

      encodedContent = ciph.doFinal(); 
      out.write(encodedContent); 

 byte[] bytesToBeEncoded = new byte[(KEY_SIZE/8)-11]; 

     FileInputStream in = new FileInputStream(new File(file1)); 
     FileOutputStream out = new FileOutputStream(new File(file2)); 
     int readBytes; 

点は、私はあまりthan-を暗号化する場合117バイト文字列は、それが(暗号化した後、ウェル解読)完璧に動作するが、サイズが大きい場合、アプリケーションはこの例外をスロー:

javax.crypto.IllegalBlockSizeException: Data must not be longer than 117 bytes 
スロー

encodedContent = ciph.doFinal(); 

問題があると私は何をする必要がどこか分かりません。

誰でもお手伝いできますか?ありがとうございました。

私の英語については残念です。

+1

本当にRSAでデータを暗号化する必要はありますか?標準パターンは、RSAでランダムな対称鍵を暗号化し、その対称鍵で実際のデータを暗号化することです。 – CodesInChaos

+0

CodeInChaosを聞いて、RSA鍵で直接データを暗号化しないでください。それはすべての良い習慣に違反している。さらに、あなたのバッファサイズは入力サイズに全く関係していてはなりません。 –

答えて

4

問題は、入力を読み取っているバイト配列をどのように初期化するかにあります。予想される入力ストリームのサイズではなく、RSAキーのサイズに基づいてサイズを設定しています。

byte[] bytesToBeEncoded = new byte[(KEY_SIZE/8)-11]; 

キーサイズは1024ビットなので、1024/8 -11 = 128-11 = 117バイトです。これは、ストリームから読み取ることができるデータの量であり、RSAキーのサイズには関連してはいけません。

バイト配列を読み込みが必要なデータの最大サイズに初期化する必要があります。これにより、例外が回避されます。たとえば、

byte[] bytesToBeEncoded = 1024; 

の場合、入力文字列の最大文字数は1024文字です。

+0

こんにちはスティーブン、あなたの速い応答に感謝します。 私はdonode(byte [] bytesToBeEncoded = new byte [1024])が問題は解決しません。 :Sプログラムは同じ例外をスローし続けます。とにかくありがとう。 :) – Shuli

+0

私のコメントを避ける、私はあなたが書いたことが一例であるとは思わなかった。今度は、配列を読み込みコンテンツのサイズに初期化して、コードを少し修正して、うまくいきました。 ^^ありがとうございます! – Shuli

関連する問題