Как рассчитать размер зашифрованного текста RSA, используя размер ключа и длину открытого текста?
У меня есть какой-то чистый текст, который я хочу зашифровать, используя RSA_PKCS_V21 (используя библиотеку PolarSSL). Проблема в том, что мне нужно знать размер зашифрованного текста перед выполнением алгоритма (для динамического распределения памяти). Я знаю размер ключа RSA и длину открытого текста.
Я также хочу знать ограничение на длину вводимого текста.
Любая идея?
1 ответ
Просто проверьте стандарт RSA PKCS#1 v2.1, глава 7.2:
RSAES-PKCS1-V1_5-ENCRYPT ((n, e), M)
Входные данные:
- (n, e) открытый ключ RSA получателя (k обозначает длину в октетах модуля n)
- M сообщение, которое должно быть зашифровано, строка октетов длины mLen, где mLen <= k - 11
Таким образом, ввод зависит от размера ключа. k
это размер ключа, но в октетах. Таким образом, для 1024-битного ключа у вас есть 1024 / 8 - 11 = 117 байт в качестве максимально простого текста.
Обратите внимание, что выше указан максимальный размер для RSA с отступом PKCS#1 v1.5. Для более нового заполнения OAEP в главе 7.1 можно найти следующее:
RSAES-OAEP-ENCRYPT ((n, e), M, L)
...
Входные данные:
- (n, e) открытый ключ RSA получателя (k обозначает длину в октетах модуля RSA n)
- M сообщение, которое должно быть зашифровано, строка октетов длины mLen, где mLen <= k - 2hLen - 2
- L необязательный ярлык, который будет связан с сообщением; значением по умолчанию для L, если L не указан, является пустая строка
Где hLen - выходной размер хеш-функции, используемой для функции генерации маски. Если используется хэш-функция SHA-1 по умолчанию, то максимальный размер сообщения составляет k - 42 (поскольку выходной размер SHA-1 составляет 20 байтов, а 2 * 20 + 2 = 42).
Обычно случайно сгенерированный секретный ключ шифруется вместо сообщения. Затем сообщение шифруется этим секретным ключом. Это позволяет почти бесконечно длинные сообщения, а симметричное шифрование - такое как AES в режиме CBC - намного быстрее, чем асимметричное шифрование. Эта комбинация называется гибридным шифрованием.
Выходной размер для шифрования RSA или генерации подписи с любым заполнением идентичен размеру модуля в байтах (конечно, с округлением в большую сторону), поэтому для 1024-битного ключа вы ожидаете 1024 / 8 = 128 октетов / байтов.
Обратите внимание, что выходной массив вычисленного размера может содержать начальные байты, установленные на ноль; это должно считаться нормальным.