Является ли результат шифрования RSA гарантированно случайным
Я использую RSACryptoServiceProvider для шифрования небольших блоков данных. Для решения, над которым я работаю, важно, чтобы, если один и тот же фрагмент исходных данных дважды шифровался одним и тем же открытым ключом, результат (зашифрованный блок данных) не совпадал.
Я проверил это на примере, и это сработало так, как я надеялся. Теперь я задаюсь вопросом, является ли это поведение разработанным и гарантированным, или мне нужно добавить некоторую случайную часть к исходным данным, чтобы гарантировать, что блоки данных с одинаковыми данными больше не могут быть сопоставлены после шифрования.
Вот пример:
byte[] data=new byte[]{1,7,8,3,4,5};
RSACryptoServiceProvider encrypter = cert.PublicKey.Key as RSACryptoServiceProvider;
byte[] encryptedData = encrypter.Encrypt(data,true);
// encryptedData has always other values in, although the source data is always
// 1,7,8,3,4,5 and the certificate is always the same (loaded from disk)
Конкретный вопрос касается.net, но, может быть, ответ можно дать в целом для всех реализаций RSA, если он задуман?
1 ответ
Алгоритм шифрования учебника RSA является детерминированным:
ciphertext = plaintext ^ encryption-exponent mod modulus
(Вот ^
целочисленное возведение в степень, mod
остальная операция.)
Но, как вы заметили, это не дает хорошей гарантии безопасности, поскольку злоумышленник, который может угадать открытый текст, может просто проверить это предположение, зашифровав его сам и сравнив результаты.
По этой причине официальные спецификации RSA (а также все реализации, используемые на практике) включают некоторые (частично случайные) дополнения, поэтому мы на самом деле не шифруем plaintext
, но pad(plaintext)
:
ciphertext = pad(plaintext) ^ encryption-exponent mod modulus
Дешифрирование:
plaintext = unpad( ciphertext ^ decryption-exponent mod modulus )
Только с этим дополнением RSA фактически является безопасной схемой шифрования.
Подобное дополнение также используется для подписей RSA, чтобы избежать легкого подделывания подписей.