45

私は暗号化が初めてです。秘密鍵/公開鍵を使用すると思われる非対称暗号化アルゴリズムを実装する必要があります。RSACryptoServiceProvider のサンプルを使い始めました。暗号化する小さなデータで問題ありませんでした。しかし、比較的大きなデータ "2 行" で使用すると、CryptographicException "Bad Length" という例外が発生します。

//Create a new instance of RSACryptoServiceProvider.
using (RSACryptoServiceProvider RSA = new RSACryptoServiceProvider())
{

    //Import the RSA Key information. This only needs
    //toinclude the public key information.
    //RSA.ImportParameters(RSAKeyInfo);
    byte[] keyValue = Convert.FromBase64String(publicKey);
    RSA.ImportCspBlob(keyValue);

    //Encrypt the passed byte array and specify OAEP padding.  
    //OAEP padding is only available on Microsoft Windows XP or
    //later.  
    encryptedData = RSA.Encrypt(DataToEncrypt, DoOAEPPadding);
}

次に、CryptoStream を使用して大きなデータ (またはファイル) を暗号化するサンプルをいくつか見つけ、DES や 3DES などの対称アルゴリズムのみを使用します。これには、CryptoStream のコンストラクターへの入力の 1 つとして ICryptoTransform を返す関数 CreateEncryptor があります!!!

CryptoStream cStream = new CryptoStream(fStream,
                new TripleDESCryptoServiceProvider().CreateEncryptor(Key, IV),
                CryptoStreamMode.Write);

RSA を使用してファイルを暗号化する方法は何ですか?

4

6 に答える 6

65

RSA はキーの長さよりも短いデータ ブロックのみを暗号化できるため、通常行うことは次のとおりです。

  1. AES (または同様のもの) に必要な正しい長さのランダム キーを生成します。
  2. そのキーを使用して、AESまたは同様のものを使用してデータを暗号化します
  3. RSA キーを使用してランダム キーを暗号化する

次に、2 と 3 の両方の出力を公開します

解読するには

  1. RSA キーを使用して AES キーを復号化します。
  2. その AES キーを使用してデータを復号化する
于 2009-07-29T09:59:38.067 に答える
37

他の回答で述べたように、非対称暗号化は、キーサイズよりも小さいデータを暗号化するためにのみ設計されています。

2つのシステム間で大量の暗号化データを転送する必要があるときに実装したオプションの1つは、送信者と受信者の両方に公開鍵がわかっているRSAキーペアを用意し、データを送信する必要があるときに受信者が新しいRSAキーペアを生成することです。 、そのキーペアの公開鍵を共通の公開鍵で暗号化し、暗号化された公開鍵を送信者に送信します。送信者は、その秘密鍵を使用して受信者の公開鍵を復号化し(送信者が受信者が生成した秘密鍵を知る必要がないのと同様に、受信者はこれを知る必要はありません)、対称暗号化鍵を生成し、対称鍵でデータを暗号化します次に、受信者から受信した公開鍵を使用して対称鍵を暗号化します。

RSACryptoServiceProvider.ToXMLString()およびメソッドを使用してRSACryptoServiceProvider.FromXMLString()、共通の公開鍵をXML文字列リテラルとしてレシーバーアプリケーションに格納できます。

対称暗号化キーを生成するときは、キーの生成に使用することを忘れないでください。RNGCryptoServiceProvider()これは、(疑似)乱数を生成するためのはるかに安全な方法です。

また、対称暗号化アルゴリズムとして3DESを使用しないことを強くお勧めします。これは古く、古くなり始めています。AesCryptoServiceProvicerまたはRijndaelManagedクラスのいずれかでAES対称暗号化を使用します。

于 2009-07-29T14:15:45.227 に答える
21

通常、RSA は対称キーを転送するためにのみ使用され (たとえば、ストリームの開始時)、バルク データはそのキーで暗号化されます。

非対称暗号化は、大量のデータを転送するには効率的ではありません。

于 2009-07-29T09:38:52.807 に答える
18

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

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

((KeySize-384)/ 8)+ 37

ただし、最適非対称暗号化パディング(OAEP)パラメーターがtrueの場合、以下を使用して最大バイト数を計算できます。

((KeySize-384)/ 8)+ 7

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

于 2010-07-15T07:03:18.307 に答える
8

RSA (およびすべての公開/秘密キー アルゴリズム) の .NET 実装は、大きなデータ ブロックをサポートしていません。これは、公開/秘密キーの目的ではないためです。

代わりに、新しい対称キーを生成し、それを使用してデータを暗号化します。次に、公開/秘密キーを使用して対称キーを暗号化し、相手と安全に交換します。次に、対称キーを復号化し、それを使用してデータの暗号化を解除します。

于 2009-07-29T09:52:11.780 に答える
1

我々は持っています:

MaxBlockSize=((KeySize - 384) / 8) + 37

また

MaxBlockSize=((KeySize - 384) / 8) + 7

そのため、データをいくつかのブロックに分割し、それぞれを暗号化してからマージできます

于 2013-05-26T13:46:17.810 に答える