RSA を使用して C# でファイル (巨大なデータ) を暗号化する方法
-
20-09-2019 - |
質問
暗号化については初心者です。非対称暗号化アルゴリズムを実装する必要があります。これは秘密鍵/公開鍵を使用すると思います。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を使用してファイルを暗号化する方法は何ですか?
解決
非対称暗号化のみ、そのキーのサイズよりも小さいデータを暗号化するために設計されている他の回答で述べたように。
2つのシステム間で暗号化された大量のデータを転送する必要がときに私が実装した1つのオプションは、その公開鍵データが必要になったとき、送信者と受信機の両方に知られている送信する受信機が生成するRSA鍵ペアを持つことです新しいRSA鍵ペアは、共通の公開鍵でその鍵ペアの公開鍵を暗号化して送信者に暗号化された公開鍵を送信します。送信者は、(受信機は、送信者が受信者が秘密鍵を生成知っている必要はありません同じように、知っている必要はない)、その秘密鍵を使用して受信者の公開鍵を復号化し、対称暗号化キーを生成し、対称鍵でデータを暗号化その後、受信機から受信した公開鍵を使用して対称鍵を暗号化します。暗号化された対称鍵と暗号化データの両方は、次に、対称鍵を復号化し、その生成された秘密鍵を使用してデータを復号化する受信機に送信されます。
あなたは、受信機アプリケーションでXMLリテラル文字列などの一般的な公開鍵を格納するRSACryptoServiceProvider.ToXMLString()
とRSACryptoServiceProvider.FromXMLString()
メソッドを使用することができます。
あなたはそれが(擬似)乱数を生成するはるかに安全な方法であるように、キーを生成するためにRNGCryptoServiceProvider()
を使用する対称暗号化キーを生成する際に、忘れてはいけません。
また、私は強くあなたの対称暗号化アルゴリズムとして3DESを使用しないことをお勧めします、それは古いとその年齢を示し始めています。使用AESのいずれかAesCryptoServiceProvicer
またはRijndaelManaged
クラスと対称暗号ます。
他のヒント
RSA はキーの長さよりも短いデータ ブロックのみを暗号化できるため、通常は次のようになります。
- AES (または同様のもの) に必要な正しい長さのランダム キーを生成します。
- そのキーを使用して AES などを使用してデータを暗号化します
- RSA キーを使用してランダム キーを暗号化する
次に、2 と 3 の両方の出力を公開します。
復号するには
- RSA キーを使用して AES キーを復号化します。
- その AES キーを使用してデータを復号化します
通常、RSAは、(例えば、ストリームの開始時に)対称キーを転送するために使用され、その後、大量のデータをその鍵で暗号化されています。
非対称暗号化では、大量のデータを転送するのに十分な効率的ではありません。
RSA悪い長の例外に関する将来の検索のために...
あなたは、次のと、特定のキーサイズを使用して暗号化することができるバイトの最大数を計算することができます
((キーサイズ - 384)/ 8)+ 37
しかし、最適非対称暗号化パディング(OAEP)パラメータは、次の最大バイト数を計算するために使用することができ、該当する場合:
((キーサイズ - 384)/ 8)+ 7
法的キーのサイズは8のスキップサイズで16384から384です。
RSA(およびすべての公開鍵/秘密鍵のアルゴリズム)の.NET実装は、データの大きなブロックをサポートしていません - 。それは、公開鍵/秘密鍵の目的ではありませんので、
は、代わりにあなたがどうなるのか、新たな対称鍵を生成し、データを暗号化するためにそれを使用します。そして、あなたは、対称鍵を暗号化して安全に相手とそれを交換する公開鍵/秘密鍵を使用します。そして、彼らは対称鍵を復号化し、データを復号化することを使用します。
私たちは持っています:
MaxBlockSize=((KeySize - 384) / 8) + 37
または
MaxBlockSize=((KeySize - 384) / 8) + 7
ので、我々はいくつかのブロックにデータを分割して、それぞれを暗号化し、
それらをマージすることができます