Попытка понять ключ RSACryptoServiceProvider и отношение длины сообщения - PullRequest
0 голосов
/ 15 февраля 2020

Я пытаюсь лучше понять классы криптографии в. Net и у меня есть ситуация, которую я не понимаю ясно. Я следую за урезанной версией этого RSACryptoServiceProvider .

моей сокращенной версии:

string plainText = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse dapibus.";
var byteConverter = new UnicodeEncoding();

//Works with longer string length
using var rsa = RSA.Create();
byte[] encrypted2 = rsa.Encrypt(byteConverter.GetBytes(plainText), RSAEncryptionPadding.OaepSHA1);

//fails if string's length is too long
using var rsa2 = new RSACryptoServiceProvider();
byte[] encrypted = rsa2.Encrypt(byteConverter.GetBytes(plainText), false);

Если вы обрезаете строку в "elit" вот так:

string plainText = "Lorem ipsum dolor sit amet, consectetur adipiscing elit.";

, тогда оба сработают.

Когда я использую конструктор перегрузки провайдера и задаю ему достаточный размер ключа, вот так:

using var rsa2 = new RSACryptoServiceProvider(2048); 

тогда может зашифровать всю длину строки.

Какая связь между размером ключа и длиной сообщения? Какой лучший способ определить, какой размер ключа мне нужен и зачем нужен RSA. Создать метод не имеет проблем с длиной строки?

1 Ответ

1 голос
/ 15 февраля 2020

RSACryptoServiceProvider просто реализует схемы, как указано в PKCS # 1 v2.0 и более поздних версиях (PKCS # 1 2.2 является текущей версией). Я указал накладные расходы и оставил полезные данные здесь . Это зависит от языка / времени выполнения c.

Хотя заполнение PKCS # 1 v1.5 требует меньше накладных расходов, OAEP более безопасен (имеет доказательство безопасности для RSA) и должен обычно использоваться. PKCS # 1 v1.5 имеет только 11 служебных байтов для случайного компонента общим объемом 61 бит. Тем не менее, хорошая практика действительно требует двойного случайного компонента - для служебной информации 11 + 8 = 19 байт.

...