web-dev-qa-db-ja.com

C#でRSAを使用してファイル(巨大なデータ)を暗号化する方法

暗号化は初めてです。私は非対称暗号化アルゴリズムを実装する必要がありますが、それは秘密/公開鍵を使用すると思います。 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のコンストラクター!!!

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

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

41
ala

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

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

RSACryptoServiceProvider.ToXMLString()およびRSACryptoServiceProvider.FromXMLString()メソッドを使用して、共通公開キーを受信側アプリケーションにXML文字列リテラルとして保存できます。

対称暗号化キーを生成してRNGCryptoServiceProvider()を使用してキーを生成する場合、(擬似)乱数を生成するより安全な方法であるため、忘れないでください。

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

35
Joe Kuemerle

RSAは、キーの長さより短いデータブロックのみを暗号化できるため、通常は

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

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

解読するには

  1. RSAキーを使用してAESキーを復号化します。
  2. そのAESキーを使用してデータを復号化する
59
jcoder

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

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

20
Henk Holterman

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

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

((キーサイズ-384)/ 8)+ 37

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

((KeySize-384)/ 8)+ 7

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

18
ObjectType

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

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

6
blowdart

我々は持っています:

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

OR

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

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

1
kazem