2

「RSA/ECB/PKCS1Padding」で暗号化されたbyte[]に含まれるメッセージがあります。それを復号化するために、私は暗号cを作成し、それを開始します

c = Cipher.getInstance("RSA/ECB/PKCS1Padding");

これまで、 doFinal()メソッドを使用して、復号化されたバイトを含むbyte[]を返す小さなメッセージのみを復号化していました。

c.init(Cipher.DECRYPT_MODE, privateKey);
byte[] decryptetBytes = c.doFinal(encryptedBytes);

ただし、この場合、データは大きく(約500バイト)、doFinal()メソッドは例外をスローします(javax.crypto.IllegalBlockSizeException:データは128バイトを超えてはなりません)。update() -メソッドを使用する必要があると思いますが、正しく機能させる方法がわかりません。これはどのように行われますか?

4

3 に答える 3

4

キー転送以外に RSA 暗号化を使用するのは悪用だと思います。

対称暗号の新しいキーを生成し、それを使用してバルク データを暗号化します。次に、鍵を RSA で暗号化します。対称的に暗号化された暗号文を、非対称的に暗号化されたコンテンツ暗号化キーと共に受信者に送信します。

于 2012-04-20T20:30:28.140 に答える
2

RSA を使用すると、キーの長さからパディングの長さを引いたサイズのブロックのみを暗号化/復号化できます。キーよりも長いデータがある場合は、1 つの配列にマージされている可能性があるため、キーのサイズでチャンクに分割する必要があります (128 バイトはパディングなしの 1024 キーを示唆していますが、可能かどうかはわかりません)。update() の使用はここでは当てはまりません。

簡単に言えば、この配列がどのように作成されたかを知る必要があります。

一般に、RSA は大量のデータの暗号化には時間がかかるため、使用しないでください。キーを AES などの対称暗号に暗号化するために使用する必要があります。

こちらをご覧ください: https://www.owasp.org/index.php/Digital_Signature_Implementation_in_Java

于 2012-01-19T06:53:32.297 に答える
1

エリクソンが言ったように、

暗号化する必要がある手順は次のとおりです。

  1. RSA キー ペアを生成する (またはキー ストアから公開キーを取得する)
  2. 対称キー (AES) を生成する
  3. AES キーでデータを暗号化する
  4. 公開 RSA キーで AES キーを暗号化する
  5. 暗号化された AES 鍵と AES 暗号化データを保存 (または秘密鍵を持っている人に送信)

復号化するには:

  1. 暗号化に使用された鍵ペアに関連付けられた秘密鍵を取得する
  2. 秘密鍵で AES 鍵を復号化する
  3. AES キーでデータを復号化する
  4. データを使用する
于 2012-06-20T15:58:20.037 に答える