Подтвердить что ты не робот

Как использовать RSA для шифрования файлов (огромные данные) в С#

Я новичок в шифровании. Мне нужно реализовать асимметричный алгоритм шифрования, который, я думаю, использует частный/открытый ключ. Я начал использовать образец RSACryptoServiceProvider. это было нормально с небольшими данными для шифрования. Но при использовании его на относительно больших данных "2 строки", я получаю исключение CryptographicException "Bad Length"!

//Create a new instance of RSACryptoServiceProvider.
using (RSACryptoServiceProvider RSA = new RSACryptoServiceProvider())
{

    //Import the RSA Key information. This only needs
    //toinclude the public key information.
    //RSA.ImportParameters(RSAKeyInfo);
    byte[] keyValue = Convert.FromBase64String(publicKey);
    RSA.ImportCspBlob(keyValue);

    //Encrypt the passed byte array and specify OAEP padding.  
    //OAEP padding is only available on Microsoft Windows XP or
    //later.  
    encryptedData = RSA.Encrypt(DataToEncrypt, DoOAEPPadding);
}

Затем я нашел несколько примеров шифрования больших данных (или файлов) с помощью CryptoStream и использовал только симметричные алгоритмы, такие как DES или 3DES, которые имеют функцию CreateEncryptor, чтобы возвращать ICryptoTransform как один из входных данных для конструктора CryptoStream!!

CryptoStream cStream = new CryptoStream(fStream,
                new TripleDESCryptoServiceProvider().CreateEncryptor(Key, IV),
                CryptoStreamMode.Write);

Каким образом можно шифровать файлы с помощью RSA?

4b9b3361

Ответ 1

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

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

Вы можете использовать методы RSACryptoServiceProvider.ToXMLString() и RSACryptoServiceProvider.FromXMLString() для хранения общего открытого ключа в виде литерала строки XML в приложении-получателе.

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

Кроме того, я настоятельно рекомендую не использовать 3DES в качестве симметричного алгоритма шифрования, он старый и начинает показывать возраст. Используйте симметричное шифрование AES с помощью классов AesCryptoServiceProvicer или RijndaelManaged.

Ответ 2

RSA может шифровать только блоки данных, которые короче длины ключа, так что вы обычно делаете

  • Создайте случайный ключ правильной длины, необходимой для AES (или аналогичного).
  • Шифруйте ваши данные с помощью AES или аналогичных с помощью этого ключа
  • Зашифруйте случайный ключ с помощью ключа RSA

Затем вы публикуете оба выхода из 2 и 3

Чтобы дешифровать

  • Расшифруйте ключ AES с помощью ключа RSA.
  • Расшифруйте данные с помощью этого ключа AES

Ответ 3

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

Асимметричное шифрование недостаточно эффективно для передачи большого количества данных.

Ответ 4

Для будущих поисков, касающихся исключений длины RSA...

Вы можете вычислить максимальное количество байтов, которое может быть зашифровано с определенным размером ключа, со следующим:

((KeySize - 384)/8) + 37

Однако, если параметр оптимального асимметричного заполнения прошивки (OAEP) истинен, для вычисления максимальных байтов можно использовать следующее:

((KeySize - 384)/8) + 7

Размеры юридических ключей составляют от 384 до 16384 с размером пропуска 8.

Ответ 5

.NET-реализации RSA (и всех алгоритмов общедоступного/частного ключа) не поддерживают большие блоки данных - поскольку это не цель открытого/закрытого ключа.

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

Ответ 6

имеем:

MaxBlockSize=((KeySize - 384) / 8) + 37

ИЛИ

MaxBlockSize=((KeySize - 384) / 8) + 7

поэтому мы можем разделить данные на некоторые блоки, а затем зашифровать каждый из них, а затем объединить их