Всем доброго времени суток.
Есть задача — шифровать файлы открытым ключом и отправлять их на сервер, где они будут расшифровываться закрытым. При этом рзмер файлов неизвестен, они могут быть от 100 килобайт до 10 мегабайт. Как это можно реализовать? После поиска в инете я обнаружил, что RSACryptoServiceProvider не может шифровать больше 117 байт. С ним так удобно
Здравствуйте, vityanya, Вы писали:
V>Всем доброго времени суток.
V>Есть задача — шифровать файлы открытым ключом и отправлять их на сервер, где они будут расшифровываться закрытым. При этом рзмер файлов неизвестен, они могут быть от 100 килобайт до 10 мегабайт. Как это можно реализовать? После поиска в инете я обнаружил, что RSACryptoServiceProvider не может шифровать больше 117 байт. С ним так удобно
Прекрасно им шифрую большие объемы блоками. Шифрую до нескольких сот мегабайт. Больше не требовалось.
Здравствуйте, Spiceman, Вы писали:
S>Здравствуйте, vityanya, Вы писали:
V>>Всем доброго времени суток.
V>>Есть задача — шифровать файлы открытым ключом и отправлять их на сервер, где они будут расшифровываться закрытым. При этом рзмер файлов неизвестен, они могут быть от 100 килобайт до 10 мегабайт. Как это можно реализовать? После поиска в инете я обнаружил, что RSACryptoServiceProvider не может шифровать больше 117 байт. С ним так удобно
S>Прекрасно им шифрую большие объемы блоками. Шифрую до нескольких сот мегабайт. Больше не требовалось
А как? примерчик не покажете?
Здравствуйте, vityanya, Вы писали:
S>>Прекрасно им шифрую большие объемы блоками. Шифрую до нескольких сот мегабайт. Больше не требовалось
V>А как? примерчик не покажете?
public static byte[] Encrypt(byte[] mess, string publicKey)
{
CspParameters CspParams = new CspParameters();
CspParams.Flags = CspProviderFlags.UseMachineKeyStore;
RSA key = new RSACryptoServiceProvider(CspParams);
try
{
key.FromXmlString(publicKey);
}
catch (Exception ex)
{
// Логирование ошибки
...
// Освобождение всех ресурсов, используемых объектом AsymmetricAlgorithm.
key.Clear();
throw;
}
int blockSize = (key.KeySize >> 3) - 11;
AsymmetricKeyExchangeFormatter format =
new RSAPKCS1KeyExchangeFormatter(key);
int modulusSize = blockSize + 11;
using( MemoryStream msin = new MemoryStream(mess) )
using( MemoryStream msout = new MemoryStream(blockSize) )
{
byte[] buffer = new byte[blockSize];
int bytesRead;
try
{
do
{
buffer.Initialize();
bytesRead = msin.Read(buffer, 0, blockSize);
if(bytesRead == blockSize)
{
msout.Write( format.CreateKeyExchange(buffer), 0, modulusSize );
}
else
{
byte[] final = new byte[bytesRead];
Array.Copy(buffer, final, bytesRead);
msout.Write( format.CreateKeyExchange(final), 0, modulusSize);
}
} while (bytesRead == blockSize);
}
catch (Exception ex)
{
// Логирование ошибки
throw;
}
finally
{
// Освобождение всех ресурсов, используемых объектом AsymmetricAlgorithm.
key.Clear();
}
return msout.ToArray();
}
}
public static byte[] Decrypt(byte[] mess, string secretKey)
{
CspParameters CspParams = new CspParameters();
CspParams.Flags = CspProviderFlags.UseMachineKeyStore;
RSA key = new RSACryptoServiceProvider(CspParams);
try
{
key.FromXmlString(secretKey);
}
catch (Exception ex)
{
// Логирование ошибки
...
// Освобождение всех ресурсов, используемых объектом AsymmetricAlgorithm.
key.Clear();
throw;
}
AsymmetricKeyExchangeDeformatter format =
new RSAPKCS1KeyExchangeDeformatter(key);
int modulusSize = key.KeySize >> 3;
using (MemoryStream msin = new MemoryStream(mess))
using (MemoryStream msout = new MemoryStream(modulusSize))
{
byte[] buffer = new byte[modulusSize];
int bytesRead;
try
{
do
{
//buffer.Initialize();
bytesRead = msin.Read(buffer, 0, modulusSize);
if (bytesRead > 0)
{
byte[] plain = new byte[] { };
Array.Clear(plain, 0, plain.Length);
plain = format.DecryptKeyExchange(buffer);
msout.Write(plain, 0, plain.Length);
Array.Clear(plain, 0, plain.Length);
}
} while (bytesRead > 0);
}
catch (Exception ex)
{
throw;
}
finally
{
// Освобождение всех ресурсов, используемых объектом AsymmetricAlgorithm.
key.Clear();
}
return msout.ToArray();
}
}
Здравствуйте, Spiceman, Вы писали:
S>Здравствуйте, vityanya, Вы писали:
V>>Всем доброго времени суток.
V>>Есть задача — шифровать файлы открытым ключом и отправлять их на сервер, где они будут расшифровываться закрытым. При этом рзмер файлов неизвестен, они могут быть от 100 килобайт до 10 мегабайт. Как это можно реализовать? После поиска в инете я обнаружил, что RSACryptoServiceProvider не может шифровать больше 117 байт. С ним так удобно
S>Прекрасно им шифрую большие объемы блоками. Шифрую до нескольких сот мегабайт. Больше не требовалось.
Это не совсем хорошо в плане производительности, хотя работать тоже будет. Лучше делать как рекомендовали ранее. Для передачи данных используйте симметричный криптоалгоритм, а для передачи секретного ключа от него — ассиметричный. Так по фен-шую
Здравствуйте, Аноним, Вы писали:
S>>Прекрасно им шифрую большие объемы блоками. Шифрую до нескольких сот мегабайт. Больше не требовалось.
А> Это не совсем хорошо в плане производительности, хотя работать тоже будет. Лучше делать как рекомендовали ранее. Для передачи данных используйте симметричный криптоалгоритм, а для передачи секретного ключа от него — ассиметричный. Так по фен-шую
Про несколько сот мегабайт я пожалуй погорячился. Оно конечно работает, но меееедленно.
Провел тесты. Результаты неутешительны.
RSA на несколько порядков проседает по сравнению с DES, если шифровать большие объемы. Скажем, до 100КБ еще терпимо. Но большие объемы нужно DES, а ключ как и советовали — RSA.