RSACryptoServiceProvider не выдает согласованный вывод - PullRequest
3 голосов
/ 28 октября 2011

Мне нужно зашифровать некоторый текст с помощью 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();

Я предполагаю, что класс должен использовать что-то еще, а также ключ для воздействия на вывод, но я изо всех сил пытаюсь найтичто.

Ответы [ 2 ]

1 голос
/ 28 октября 2011

Различный вывод совершенно нормально. Это связано с тем, что ваши данные дополняются PKCS # 1 или OAEP - и оба используют / добавляют некоторые случайные данные.

Теперь вы не должны использовать RSA. Многие причины, но самая прямая для вас, заключается в том, что размер заполнения / блока ограничивает число байтов, которые вы можете зашифровать (а RSA слишком медленный, чтобы рассматривать циклы шифрования).

Я написал в блоге запись на тему, которая описывает, как вы можете смешивать симметричное (лучшая скорость, без ограничения размера) с асимметричным шифрованием - получая лучшее из обоих миров: -)

1 голос
/ 28 октября 2011

Тот факт, что зашифрованный текст отличается каждый раз при шифровании одного и того же открытого текста, не означает, что он не может быть последовательно расшифрован.
Это действительно признак хорошего криптографического алгоритма, позволяющего иметь такое поведение, делая его более устойчивым к различным атакам.

Это потому, что логика шифрования вносит случайность в процесс, например, путем систематического добавления некоторых случайных байтов перед самим открытым текстом. Пока логика дешифрования знает, что игнорирует эти байты после дешифрования всего зашифрованного текста, она может воспроизводить исходный открытый текст.

Я предлагаю вам взять любой экземпляр этого текста b64, передать его в обратный процесс и увидеть, что созданный "rgb" во всех случаях - "Hello world".

...