«System.Security.Cryptography.CryptographicException» в mscorlib.dll в расшифровке - PullRequest
0 голосов
/ 19 октября 2019

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

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

Код для генерации потока: (на стороне сервера)

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);

Мой вопрос: как я могу использовать эти функции для шифрования и отправки потока изображения и использовать его на стороне клиента?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...