3

一部のテキストを 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();

クラスは出力に影響を与えるためにキーだけでなく何か他のものを使用しているに違いないと推測していますが、何を見つけるのに苦労しています。

4

2 に答える 2

1

同じ平文が暗号化されるたびに暗号文が異なるという事実は、一貫して復号化できないという意味ではありません。
これは確かに、優れた暗号化アルゴリズムがこの動作を行うことができ、さまざまな攻撃に対する回復力を高めていることを示しています。

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

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

于 2011-10-28T12:06:05.287 に答える
1

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

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

私は、対称暗号化 (速度の向上、サイズ制限なし) と非対称暗号化をどのように組み合わせることができるかを説明するブログエントリを書きました - 両方の世界を最大限に活用します :-)

于 2011-10-28T12:22:02.170 に答える