RSACryptoServiceProviderは一貫した出力を生成しません

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

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();

私は、クラスが出力に影響を与えるキーと同様に何か他のものを使用しているに違いないと思っていますが、私は何を見つけるのか苦労しています。

3
データを解読すると、毎回同じ結果が得られますか?
追加された 著者 robert,
まあ、私は思っていませんでした。暗号化されたテキストを見て、それが同じであることを確認することにすべてを戻した理由です。しかし、私は答えを更新する前に問題を再現することはできませんでした - 私はEncrypt()の2番目のパラメータでパディングタイプを混在させると思います。
追加された 著者 gordonmleigh,

2 答え

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

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

件名にブログエントリを書きました。これは、対称性速度制限なし)、非対称暗号化 - 両方の世界のベストを得る:-)

1
追加された

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

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

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

1
追加された