2

RSAでテキストを暗号化し、後で秘密鍵を使用して回復する必要があります。私の問題は、RSACryptoServiceProvider.Encrypt()が同じキーを使用しているときでも毎回異なる値を出力することです。ここで私はテストにLINQpadに入れ私のコードは次のとおりです。RSACryptoServiceProviderは一貫した出力を生成しません

CspParameters cp = new CspParameters(); 
cp.KeyContainerName = "MyKey"; 
cp.Flags = CspProviderFlags.UseMachineKeyStore | CspProviderFlags.UseExistingKey; 

RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(cp); 

// using LINQpad to verify the key is loaded properly -- same every time 
rsa.ToXmlString(true).Dump(); 

byte[] rgb = new ASCIIEncoding().GetBytes("Hello world"); 
byte[] xx = rsa.Encrypt(rgb, false); 
string b64 = Convert.ToBase64String(xx); 

// this changes every time: 
b64.Dump(); 

私はクラスが出力に影響を与えるために何か他のものと同様にキーを使用しなければならないことを推測しているが、私は何を見つけるのに苦労しています。

+0

:-)両方の世界のベストを尽くす取得毎回同じ結果が得られますか? – robert

+0

私はそうは思わなかった。暗号化されたテキストを見て、それが同じであることを確認することにすべてを戻した理由です。しかし、私は答えを更新する前に問題を再現することはできませんでした - 私はEncrypt()の2番目のパラメータでパディングタイプを混在させると思います。 – gordonmleigh

答えて

1

同じクリアテキストが暗号化されるたびに暗号テキストが異なるということは、一貫して復号化できないということを意味するものではありません。
これは確かに、この動作を持つことができる優れた暗号アルゴリズムの兆候であり、さまざまな攻撃に対してより弾力性があります。

これは、暗号化ロジックがプロセス内でランダム性を導入するためです。たとえば、クリアテキスト自体の前にいくつかのランダムなバイトを系統的に追加することがあります。暗号文全体が復号化された後、解読ロジックがこれらのバイトを無視することを知っている限り、元のクリアテキストを再現することができます。

このb64テキストのインスタンスを逆のプロセスに送信して、生成された "rgb"がすべてのケースで "Hello World"であることを確認することをお勧めします。

1

異なる出力は完全に正常です。これは、データがPKCS#1またはOAEPによってパディングされており、どちらもランダムなデータを使用/追加しているためです。

これはRSAを使用する方法ではありません。多くの理由がありますが、最も直接的なのは、パディング/ブロックサイズが暗号化できるバイト数を制限しているからです(RSAが暗号化ブロックのループを考えるには遅すぎます)。

私はあなたが非対称暗号化と対称(より良いスピード、サイズ制限なし)を混在させることができる方法について説明し、被写体に blog entryを書いた

- あなたはデータの暗号化を解除するときは、

関連する問題