Размер зашифрованных данных с использованием RSA-шифрования (RSACryptoServiceProvider) - PullRequest
3 голосов
/ 26 марта 2009

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

Я понимаю, что размер блока шифрования RSA составляет 16 байтов. Поэтому я дал строку «12345678» в качестве входных данных для функции ниже:

public static string Encrypt (string input) {
    var byteConverter = new UnicodeEncoding ();

    RSACryptoServiceProvider cruptoEngine = new RSACryptoServiceProvider();
    byte[] output = cruptoEngine.Encrypt (byteConverter.GetBytes (input), false);
    return BytesToString (output); //BytesToString () converts the bytes to hex string
}

Теперь зашифрованная строка, которую я получаю, имеет 128 байт (256 шестнадцатеричных символов). Эта строка слишком велика для меня. Я надеялся, что получу 16 байт зашифрованных данных, если дам 16 байт простых данных. Я делаю что-то неправильно? Это то, что должно произойти? Можно ли как-нибудь сократить зашифрованные данные?

1 Ответ

12 голосов
/ 27 марта 2009

Вы ошибаетесь. RSA не является блочным шифром, поэтому вы не можете говорить о его размере.

Вывод шифрования RSA будет иметь ту же длину, что и модуль RSA. Вы не указали ни одного ключа RSA в своем коде, поэтому среда выполнения (насколько я помню) будет использовать ключ по умолчанию. Этот ключ, очевидно, имеет модуль 1024 бит, который объясняет длину вывода.

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

AES - это блочный шифр с размером блока 16 байтов, поэтому он (в зависимости от того, какое заполнение вы используете и как переносите вектор инициализации) зашифрует 16 байтов простых данных в 16 байтов зашифрованных данных.

...