2009-03-26 3 views
3

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

Я понимаю, что размер блока 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 байтов простых данных. Я делаю что-то неправильно? Это то, что должно произойти? Могу ли я как-то сократить зашифрованные данные?

ответ

12

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

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

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

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