У меня есть поток, содержащий изображение, которое я хочу безопасно (с помощью шифрования) отправить клиенту (или некоторому другому компьютеру).
Я делаю это путем преобразования потока в строку, шифрования строкии отправив его клиенту, который расшифрует и использует его. Этот процесс вызывает исключение, для которого я не смог найти причину.
Код для генерации потока: (на стороне сервера)
public string GetCaptcha()
{
int width = 260;
int height = 90;
var captchaCode = Captcha.GenerateCaptchaCode();
var result = Captcha.GenerateCaptchaImage(width, height, captchaCode);
Stream s = new MemoryStream(result.CaptchaByteData);
StreamReader reader = new StreamReader(s);
string text = reader.ReadToEnd();
var message = "Captcha" + rsa.Encrypt(text, clientPublicKey);
SendMessage(message);
return captchaCode;
}
Код для расшифровки потока: (на стороне клиента)
else if (str.StartsWith("Captcha"))
{
var message = str.Remove(0, 7);
message = rsa.Decrypt(message, rsa.GetPrivateKey());
byte[] byteArray = Encoding.ASCII.GetBytes(message);
MemoryStream s = new MemoryStream(byteArray);
using (var stream = s)
{
Cap_Image = BitmapFrame.Create(stream,
BitmapCreateOptions.None,
BitmapCacheOption.OnLoad);
}
}
Функции шифрования и дешифрования:(Сервер и клиент)
private UnicodeEncoding _encoder;
private RSACryptoServiceProvider _rsa;
_encoder = new UnicodeEncoding();
_rsa = new RSACryptoServiceProvider();
public string Decrypt(string data,string privateKey)
{
var dataArray = data.Split(new char[] { ',' });
byte[] dataByte = new byte[dataArray.Length];
for (int i = 0; i < dataArray.Length; i++)
{
dataByte[i] = Convert.ToByte(dataArray[i]);
}
//_rsa.FromXmlString(privateKey);
var decryptedByte = _rsa.Decrypt(dataByte, false);
return _encoder.GetString(decryptedByte);
}
/// <summary>
/// Encrypt the data by public key
/// </summary>
/// <param name="data">data to encrypt</param>
/// <param name="publicKey"></param>
/// <returns>encripted data</returns>
public string Encrypt(string data,string publicKey)
{
var rsa = new RSACryptoServiceProvider();
rsa.FromXmlString(publicKey);
//var encryptedByteArray;
var dataToEncrypt = _encoder.GetBytes(data);
if (dataToEncrypt.Length < 128)
{
var encryptedByteArray = rsa.Encrypt(dataToEncrypt, false);
var length = encryptedByteArray.Length;
var item = 0;
var sb = new StringBuilder();
foreach (var x in encryptedByteArray)
{
item++;
sb.Append(x);
if (item < length)
sb.Append(",");
}
return sb.ToString();
}
else
{
var encryptedByteArray = EncryptMoreThan128(dataToEncrypt, publicKey);
var length = encryptedByteArray.Length;
var item = 0;
var sb = new StringBuilder();
foreach (var x in encryptedByteArray)
{
item++;
sb.Append(x);
if (item < length)
sb.Append(",");
}
return sb.ToString();
}
}
Эти же функции прекрасно работают для обычных строк (т. Е. Строк, таких как пароли или имена пользователей, которые не преобразуются или не преобразуются в процессе).
После отладки Iобнаружил, что следующая строка вызывает ошибку:
var decryptedByte = _rsa.Decrypt(dataByte, false);
Мой вопрос: как я могу использовать эти функции для шифрования и отправки потока изображения и использовать его на стороне клиента?