web-dev-qa-db-ja.com

RSA暗号化、長さが不適切

次の関数を呼び出すとき:

byte[] bytes = rsa.Encrypt(System.Text.UTF8Encoding.UTF8.GetBytes(stringToEncrypt), true);

エラーが発生しました:長さが間違っています。

それが機能する小さな文字列では、問題が私が渡す文字列である可能性のあるアイデアは200文字未満です。

50
JL.

RSA暗号化は、少量のデータのみを意味します。暗号化できるデータの量は、使用しているキーのサイズによって異なります。たとえば、1024ビットRSAキー、およびPKCS#1 V1.5パディングでは、暗号化できます最大2048バイトのRSAキーを使用すると、245バイトを暗号化できます。

これには正当な理由があり、非対称暗号化は計算コストが高くなります。大量のデータを暗号化する場合は、対称暗号化を使用する必要があります。しかし、否認防止が必要な場合はどうでしょうか?それでは、両方を使用します。対称キーを作成し、非対称暗号化を使用して交換した後、対称キーを安全に交換して大量のデータを暗号化します。これは、SSLおよびWS-Secureがカバーの下で使用するものです。

69
blowdart

RSAの不正な長さの例外に関する今後の検索について...

次を使用して、特定のキーサイズで暗号化できる最大バイト数を計算できます。

((KeySize - 384) / 8) + 37

ただし、元の投稿にあるように、最適な非対称暗号化パディング(OAEP)パラメーターがtrueの場合、次を使用して最大バイトを計算できます。

((KeySize - 384) / 8) + 7

有効なキーサイズは384〜16384で、スキップサイズは8です。

45
ObjectType

上記で説明したように、「不正な長さ」タイプの例外の解決策は、対称暗号化と非対称暗号化の使用をハイブリッド化することです。これにより、暗号化するテキストのサイズはキーサイズによって制約されません。基本的にRSA暗号化を使用して、ランダムkeyを非対称的に暗号化します。

暗号化の場合:

  1. AESやRijndaelなどの対称暗号化技術に必要な長さのランダムキーを生成します。

  2. 手順1で生成されたランダムキーを使用して、AES/Rijndaelを使用してテキスト/データを対称的に暗号化します。

  3. RSAを使用して、手順1で生成されたランダムキーを非対称的に暗号化します。

復号化の場合:

  1. まず、RSA秘密鍵を使用して、AES/Rijndaelで生成されたランダムキーを解読します。

  2. 次に、RSAで復号化されたランダムキーを使用して元のテキスト/データを復号化します

デモンストレーションのために、C#で次の例をご覧ください。

http://www.technical-recipes.com/2013/using-rsa-to-encrypt-large-data-files-in-c/

17
AndyUK