public void Dispose()
 {
     Engine.Dispose();
     HashProvider.Dispose();
     HashBytes = null;
     _Password = null;
 }
示例#2
0
        public string GetFileChecksum()
        {
            if (string.IsNullOrWhiteSpace(FilePath))
            {
                throw new ArgumentException("检验器校验目标文件路径为空");
            }
            FileStream file = new FileStream(FilePath, FileMode.Open);

            try
            {
                SHA256 sha256      = new SHA256CryptoServiceProvider(); //创建SHA1对象
                byte[] sha256Bytes = sha256.ComputeHash(file);          //Hash运算
                sha256.Dispose();                                       //释放当前实例使用的所有资源
                file.Dispose();
                string result = BitConverter.ToString(sha256Bytes);     //将运算结果转为string类型
                result = result.Replace("-", "");
                return(result);
            }
            catch
            {
                throw new ArgumentException("校验器初始化失败,请尝试根据下面的步骤:\n" +
                                            "1、单击“开始,运行”键入“gpedit.msc”,然后单击“确定”。\n" +
                                            "2、依次展开“计算机配置”,展开“Windows设置”,展开“安全设置”,展开“本地策略”,然后单击“安全选项”\n" +
                                            "3、在右窗格中, 双击“系统加密:”使用“FIPS 兼容的算法来加密,散列,和签名”,单击“禁用”,然后单击“确定”。");
            }
        }
示例#3
0
        public User Register(UserForRegistration userForRegistration)
        {
            if (userForRegistration == null)
            {
                return(null);
            }
            if (userForRegistration.Password == null || userAPI == null)
            {
                return(null);
            }
            var sha256 = new SHA256CryptoServiceProvider();

            var hashedPassword = ConvertByteArrayToString(
                sha256.ComputeHash(ConvertStringToByteArray(userForRegistration.Password)));

            sha256.Dispose();
            var user = userAPI.GetUserFromDatabase(userForRegistration.Name);

            if (user != null)
            {
                return(null);
            }
            user           = new User();
            user.Name      = userForRegistration.Name;
            user.Password  = hashedPassword;
            user.FirstName = userForRegistration.FirstName;
            user.LastName  = userForRegistration.LastName;

            userAPI.AddUser(user);

            user.Password = null;
            return(user);
        }
示例#4
0
        private string HashPasswordLegacy(string salt, string password)
        {
            HashAlgorithm hashAlg        = null;
            string        hashedPassword = null;

            try
            {
                hashAlg = new SHA256CryptoServiceProvider();
                var    saltAndPassword = salt + password;
                byte[] bytValue        = System.Text.Encoding.UTF8.GetBytes(saltAndPassword);
                byte[] bytHash         = hashAlg.ComputeHash(bytValue);
                hashedPassword = Convert.ToBase64String(bytHash);
            }
            catch (Exception e)
            {
                throw e;
            }
            finally
            {
                if (hashAlg != null)
                {
                    hashAlg.Clear();
                    hashAlg.Dispose();
                    hashAlg = null;
                }
            }

            return(hashedPassword);
        }
示例#5
0
        private NewPassword HashPassword(NewPassword np)
        {
            HashAlgorithm hashAlg = null;

            try
            {
                hashAlg = new SHA256CryptoServiceProvider();
                byte[] bytValue = System.Text.Encoding.UTF8.GetBytes(np.GetSaltPassword());
                byte[] bytHash  = hashAlg.ComputeHash(bytValue);
                np.SaltedHashedPassword = Convert.ToBase64String(bytHash);
            }
            catch (Exception e)
            {
                throw e;
            }
            finally
            {
                if (hashAlg != null)
                {
                    hashAlg.Clear();
                    hashAlg.Dispose();
                    hashAlg = null;
                }
            }

            return(np);
        }
 public void Dispose()
 {
     if (_cryptoProvider != null)
     {
         _cryptoProvider.Dispose();
     }
 }
        public static string Encrypt(string plainText, string password)
        {
            Contract.Requires(!string.IsNullOrWhiteSpace(plainText));
            Contract.Requires(!string.IsNullOrWhiteSpace(password));
            Contract.Ensures(!string.IsNullOrWhiteSpace(Contract.Result <string>()));

            var hashProvider = new SHA256CryptoServiceProvider();
            var algorithm    = new AesManaged
            {
                Key     = hashProvider.ComputeHash(_utf8.GetBytes(password)),
                Mode    = CipherMode.ECB,
                Padding = PaddingMode.PKCS7
            };

            try
            {
                using (var encryptor = algorithm.CreateEncryptor())
                {
                    var abData   = _utf8.GetBytes(plainText);
                    var abResult = encryptor.TransformFinalBlock(abData, 0, abData.Length);
                    var result   = System.Convert.ToBase64String(abResult);
                    return(result);
                }
            }
            finally
            {
                algorithm.Clear();
                algorithm.Dispose();

                hashProvider.Clear();
                hashProvider.Dispose();
            }
        }
        // Creates a new User
        // email: has to match email format
        // password: more than 2 caracters
        // Returns -1 if password or email formats are invalid number or number of rows updated 0 or 1
        public static void CreateUser(string email, string password)
        {
            string queryString = "INSERT INTO Users(Email, PasswordHash) VALUES (@email, @passwordHash)";

            using (SqlConnection connection = new SqlConnection(connectionString))
            {
                SqlCommand command = new SqlCommand(queryString, connection);
                SHA256CryptoServiceProvider sha256 = new SHA256CryptoServiceProvider();

                try
                {
                    if (!Regex.IsMatch(email, @"[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-][email protected]") || password.Trim().Length < 3)
                    {
                        throw new InvalidUserFieldsException("User credentials format is incorrect, email must be [email protected] and password must have more than 2 caracters");
                    }

                    byte[] byteHash     = sha256.ComputeHash(Encoding.UTF8.GetBytes(password));
                    string hashPassword = Convert.ToBase64String(byteHash);

                    command.Parameters.AddWithValue("email", email);
                    command.Parameters.AddWithValue("passwordHash", hashPassword);

                    connection.Open();
                    int rowsAffected = (int)command.ExecuteNonQuery();
                    connection.Close();

                    //return rowsAffected;
                }
                catch (InvalidUserFieldsException)
                {
                    throw;
                }
                catch (Exception e)
                {
                    throw new Exception(e.Message);
                }
                finally
                {
                    if (connection.State == System.Data.ConnectionState.Open)
                    {
                        connection.Close();
                    }

                    if (command != null)
                    {
                        command.Dispose();
                    }

                    if (sha256 != null)
                    {
                        sha256.Dispose();
                    }
                }
            }
        }
示例#9
0
        /// <summary>
        /// RSA签名,默认SHA256
        /// </summary>
        /// <param name="privateKey">私钥</param>
        /// <param name="HashbyteSignature"></param>
        /// <param name="EncryptedSignatureData"></param>
        /// <returns></returns>
        public static bool Sign(string privateKey, byte[] HashbyteSignature, out byte[] EncryptedSignatureData)
        {
            System.Security.Cryptography.RSACryptoServiceProvider RSA = new System.Security.Cryptography.RSACryptoServiceProvider();
            LoadPrivateKey(RSA, privateKey);

            SHA256 sh = new SHA256CryptoServiceProvider();

            EncryptedSignatureData = RSA.SignData(HashbyteSignature, sh);
            sh.Dispose();
            RSA.Dispose();
            return(true);
        }
示例#10
0
        private static bool VerifyChecksum(byte[] raw, XISFChecksumTypeEnum cksumType, string providedCksum)
        {
            string      computedCksum;
            SHA3Managed sha3;

            using (MyStopWatch.Measure($"XISF Checksum = {cksumType}")) {
                switch (cksumType)
                {
                case XISFChecksumTypeEnum.SHA1:
                    SHA1 sha1 = new SHA1CryptoServiceProvider();
                    computedCksum = GetStringFromHash(sha1.ComputeHash(raw));
                    sha1.Dispose();
                    break;

                case XISFChecksumTypeEnum.SHA256:
                    SHA256 sha256 = new SHA256CryptoServiceProvider();
                    computedCksum = GetStringFromHash(sha256.ComputeHash(raw));
                    sha256.Dispose();
                    break;

                case XISFChecksumTypeEnum.SHA512:
                    SHA512 sha512 = new SHA512CryptoServiceProvider();
                    computedCksum = GetStringFromHash(sha512.ComputeHash(raw));
                    sha512.Dispose();
                    break;

                case XISFChecksumTypeEnum.SHA3_256:
                    sha3          = new SHA3Managed(256);
                    computedCksum = GetStringFromHash(sha3.ComputeHash(raw));
                    sha3.Dispose();
                    break;

                case XISFChecksumTypeEnum.SHA3_512:
                    sha3          = new SHA3Managed(512);
                    computedCksum = GetStringFromHash(sha3.ComputeHash(raw));
                    sha3.Dispose();
                    break;

                default:
                    return(false);
                }
            }
            if (computedCksum.Equals(providedCksum))
            {
                return(true);
            }
            else
            {
                Logger.Error($"XISF: Invalid data block checksum! Expected: {providedCksum} Got: {computedCksum}");
                return(false);
            }
        }
        // ----------------------------------------------------<USERS>----------------------------------------------

        // Verifys if user exists
        // Returns true if user existes
        // Returns false if user does not exist
        public static bool UserExistsAndValid(string email, string password)
        {
            string queryString = "SELECT * FROM Users where Email = @email AND PasswordHash = @passwordHash";

            using (SqlConnection connection = new SqlConnection(connectionString))
            {
                SqlCommand command = new SqlCommand(queryString, connection);
                SHA256CryptoServiceProvider sha256 = new SHA256CryptoServiceProvider();

                try
                {
                    byte[] byteHash     = sha256.ComputeHash(Encoding.UTF8.GetBytes(password));
                    string hashPassword = Convert.ToBase64String(byteHash);

                    command.Parameters.AddWithValue("email", email);
                    command.Parameters.AddWithValue("passwordHash", hashPassword);

                    connection.Open();

                    SqlDataReader reader = command.ExecuteReader();

                    if (reader.Read())
                    {
                        return((int)reader["Valid"] == 1 ? true : false);
                    }
                    reader.Close();

                    return(false);
                }
                catch (Exception)
                {
                    return(false);
                }
                finally
                {
                    if (connection.State == System.Data.ConnectionState.Open)
                    {
                        connection.Close();
                    }

                    if (command != null)
                    {
                        command.Dispose();
                    }

                    if (sha256 != null)
                    {
                        sha256.Dispose();
                    }
                }
            }
        }
示例#12
0
        /// <summary>
        /// Hash 值检查
        /// </summary>
        /// <param name="resFile">文件路径</param>
        /// <param name="type">Hash 值的类型</param>
        public CheckHash(string resFile, HashType type)
        {
            hashValue = string.Empty;
            byte[]     retVal = null;
            FileStream file   = new FileStream(resFile, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);

            switch (type)
            {
            case HashType.MD5:
                MD5CryptoServiceProvider MD5Hash = new MD5CryptoServiceProvider();
                retVal = MD5Hash.ComputeHash(file);
                MD5Hash.Dispose();
                break;

            case HashType.SHA1:
                SHA1CryptoServiceProvider SHA1Hash = new SHA1CryptoServiceProvider();
                retVal = SHA1Hash.ComputeHash(file);
                SHA1Hash.Dispose();
                break;

            case HashType.SHA256:
                SHA256CryptoServiceProvider SHA256Hash = new SHA256CryptoServiceProvider();
                retVal = SHA256Hash.ComputeHash(file);
                SHA256Hash.Dispose();
                break;

            case HashType.SHA384:
                SHA384CryptoServiceProvider SHA384Hash = new SHA384CryptoServiceProvider();
                retVal = SHA384Hash.ComputeHash(file);
                SHA384Hash.Dispose();
                break;

            case HashType.SHA512:
                SHA512CryptoServiceProvider SHA512Hash = new SHA512CryptoServiceProvider();
                retVal = SHA512Hash.ComputeHash(file);
                SHA512Hash.Dispose();
                break;
            }
            file.Close();

            StringBuilder sb = new StringBuilder();

            for (int i = 0; i < retVal.Length; i++)
            {
                sb.Append(retVal[i].ToString("x2"));
            }
            hashValue = sb.ToString();
        }
示例#13
0
        public User Authenticate(UserForLogin userForLogin)
        {
            if (userForLogin == null)
            {
                return(null);
            }
            if (userForLogin.Password == null || userAPI == null)
            {
                return(null);
            }
            var sha256 = new SHA256CryptoServiceProvider();

            var hashedPassword = ConvertByteArrayToString(
                sha256.ComputeHash(ConvertStringToByteArray(userForLogin.Password)));

            sha256.Dispose();
            var user = userAPI.GetUserFromDatabase(userForLogin.Name);

            if (user == null)
            {
                return(null);
            }
            if (user.Password != hashedPassword)
            {
                return(null);
            }

            var tokenHandler = new JwtSecurityTokenHandler();
            var key          = Encoding.ASCII.GetBytes(appSettings.Secret);

            var tokenDescriptor = new SecurityTokenDescriptor
            {
                Subject = new ClaimsIdentity(new Claim[]
                {
                    new Claim(ClaimTypes.Name, user.Id.ToString())
                }),
                Expires            = DateTime.UtcNow.AddDays(7),
                SigningCredentials =
                    new SigningCredentials(new SymmetricSecurityKey(key), SecurityAlgorithms.HmacSha256Signature)
            };

            var token = tokenHandler.CreateToken(tokenDescriptor);

            user.Token    = tokenHandler.WriteToken(token);
            user.Password = null;
            return(user);
        }
示例#14
0
        public string GetFileChecksum()
        {
            if (string.IsNullOrWhiteSpace(FilePath))
            {
                throw new ArgumentException("检验器校验目标文件路径为空");
            }
            FileStream file   = new FileStream(FilePath, FileMode.Open);
            SHA256     sha256 = new SHA256CryptoServiceProvider(); //创建SHA1对象

            byte[] sha256Bytes = sha256.ComputeHash(file);         //Hash运算
            sha256.Dispose();                                      //释放当前实例使用的所有资源
            file.Dispose();
            string result = BitConverter.ToString(sha256Bytes);    //将运算结果转为string类型

            result = result.Replace("-", "");
            return(result);
        }
示例#15
0
        private void ButtonTransformFinalBlock_Click(object sender, EventArgs e)
        {
            byte[] data = Encoding.UTF8.GetBytes(textBoxLastInputData.Text);

            sha256.TransformFinalBlock(data, 0, data.Length);

            textBoxHashBytes.Text = BitConverter.ToString(sha256.Hash);

            if (textBoxHashBytes.Text != BitConverter.ToString(ComputeHashTest()))
            {
                MessageBox.Show("Error!");
            }
            else
            {
                MessageBox.Show("Hash identicos");
            }

            sha256.Dispose();
        }
示例#16
0
        /// <summary>
        /// Calculates an integer hash value based on the consistent identity hash of a string.
        /// </summary>
        /// <param name="text">The string to hash.</param>
        /// <returns>An integer hash for the string.</returns>
        public static int CalculateIdHash(string text)
        {
            SHA256 sha  = new SHA256CryptoServiceProvider(); // This is one implementation of the abstract class SHA1.
            int    hash = 0;

            try
            {
                byte[] data   = Encoding.Unicode.GetBytes(text);
                byte[] result = sha.ComputeHash(data);
                for (int i = 0; i < result.Length; i += 4)
                {
                    int tmp = (result[i] << 24) | (result[i + 1] << 16) | (result[i + 2] << 8) | (result[i + 3]);
                    hash = hash ^ tmp;
                }
            }
            finally
            {
                sha.Dispose();
            }
            return(hash);
        }
示例#17
0
        public static string Decrypt(string encryptedData, string password = null)
        {
            if (string.IsNullOrEmpty(password))
            {
                password = GetPassword();
                Contract.Assert(!string.IsNullOrEmpty(password), "No password in AppSettings found or no password specified");
            }

            var hashProvider = new SHA256CryptoServiceProvider();
            var algorithm    = new AesCryptoServiceProvider
            {
                Key     = hashProvider.ComputeHash(_utf8.GetBytes(password)),
                Mode    = CipherMode.ECB,
                Padding = PaddingMode.PKCS7
            };

            string result;

            try
            {
                var abEncryptedData = System.Convert.FromBase64String(encryptedData);
                using (var decryptor = algorithm.CreateDecryptor())
                {
                    var abResult = decryptor.TransformFinalBlock(abEncryptedData, 0, abEncryptedData.Length);
                    result = _utf8.GetString(abResult);
                }
            }
            catch (Exception)
            {
                result = encryptedData;
            }
            finally
            {
                algorithm.Clear();
                algorithm.Dispose();
                hashProvider.Clear();
                hashProvider.Dispose();
            }
            return(result);
        }
        public static string Decrypt(string encryptedData, string password)
        {
            Contract.Requires(!string.IsNullOrWhiteSpace(encryptedData));
            Contract.Requires(!string.IsNullOrWhiteSpace(password));
            Contract.Ensures(!string.IsNullOrWhiteSpace(Contract.Result <string>()));

            var hashProvider = new SHA256CryptoServiceProvider();
            var algorithm    = new AesCryptoServiceProvider
            {
                Key     = hashProvider.ComputeHash(_utf8.GetBytes(password)),
                Mode    = CipherMode.ECB,
                Padding = PaddingMode.PKCS7
            };

            string result;

            try
            {
                var abEncryptedData = System.Convert.FromBase64String(encryptedData);
                using (var decryptor = algorithm.CreateDecryptor())
                {
                    var abResult = decryptor.TransformFinalBlock(abEncryptedData, 0, abEncryptedData.Length);
                    result = _utf8.GetString(abResult);
                }
            }
            catch (Exception)
            {
                result = encryptedData;
            }
            finally
            {
                algorithm.Clear();
                algorithm.Dispose();
                hashProvider.Clear();
                hashProvider.Dispose();
            }

            return(result);
        }
示例#19
0
 public void Dispose()
 {
     _sha1.Dispose();
 }
示例#20
0
        /// <summary>
        /// Convert the ushort array to a byte arraay, compressing with the requested algorithm if required
        /// </summary>
        /// <param name="data"></param>
        /// <returns>Uncompressed or compressed byte array</returns>
        private byte[] PrepareArray(ushort[] data)
        {
            byte[] outArray;

            /*
             * Convert the ushort[] into a byte[]
             * From here onwards we deal in byte arrays only
             */
            byte[] byteArray = new byte[data.Length * ShuffleItemSize];
            Buffer.BlockCopy(data, 0, byteArray, 0, data.Length * ShuffleItemSize);

            /*
             * Compress the data block as configured.
             */
            using (MyStopWatch.Measure($"XISF Compression = {CompressionType}")) {
                if (CompressionType == XISFCompressionTypeEnum.LZ4)
                {
                    if (ByteShuffling)
                    {
                        CompressionName = "lz4+sh";
                        byteArray       = Shuffle(byteArray, ShuffleItemSize);
                    }
                    else
                    {
                        CompressionName = "lz4";
                    }

                    byte[] tmpArray       = new byte[LZ4Codec.MaximumOutputSize(byteArray.Length)];
                    int    compressedSize = LZ4Codec.Encode(byteArray, 0, byteArray.Length, tmpArray, 0, tmpArray.Length, LZ4Level.L00_FAST);

                    outArray = new byte[compressedSize];
                    Array.Copy(tmpArray, outArray, outArray.Length);
                    tmpArray = null;
                }
                else if (CompressionType == XISFCompressionTypeEnum.LZ4HC)
                {
                    if (ByteShuffling)
                    {
                        CompressionName = "lz4hc+sh";
                        byteArray       = Shuffle(byteArray, ShuffleItemSize);
                    }
                    else
                    {
                        CompressionName = "lz4hc";
                    }

                    byte[] tmpArray       = new byte[LZ4Codec.MaximumOutputSize(byteArray.Length)];
                    int    compressedSize = LZ4Codec.Encode(byteArray, 0, byteArray.Length, tmpArray, 0, tmpArray.Length, LZ4Level.L06_HC);

                    outArray = new byte[compressedSize];
                    Array.Copy(tmpArray, outArray, outArray.Length);
                    tmpArray = null;
                }
                else if (CompressionType == XISFCompressionTypeEnum.ZLIB)
                {
                    if (ByteShuffling)
                    {
                        CompressionName = "zlib+sh";
                        byteArray       = Shuffle(byteArray, ShuffleItemSize);
                    }
                    else
                    {
                        CompressionName = "zlib";
                    }

                    outArray = ZlibStream.CompressBuffer(byteArray);
                }
                else
                {
                    outArray = new byte[byteArray.Length];
                    Array.Copy(byteArray, outArray, outArray.Length);
                    CompressionName = null;
                }
            }

            // Revert to the original data array in case the compression is bigger than uncompressed
            if (outArray.Length > byteArray.Length)
            {
                if (ByteShuffling)
                {
                    //As the original array is shuffled it needs to be unshuffled again - this scenario should be highly unlikely anyways
                    outArray = Unshuffle(byteArray, ShuffleItemSize);
                }
                else
                {
                    outArray = byteArray;
                }
                CompressionType = XISFCompressionTypeEnum.NONE;

                Logger.Debug("XISF output array is larger after compression. Image will be prepared uncompressed instead.");
            }

            if (CompressionType != XISFCompressionTypeEnum.NONE)
            {
                double percentChanged = (1 - ((double)outArray.Length / (double)byteArray.Length)) * 100;
                Logger.Debug($"XISF: {CompressionType} compressed {byteArray.Length} bytes to {outArray.Length} bytes ({percentChanged.ToString("#.##")}%)");
            }

            /*
             * Checksum the data block as configured.
             * If the data block is compressed, we always checksum the compressed form, not the uncompressed form.
             */
            using (MyStopWatch.Measure($"XISF Checksum = {ChecksumType}")) {
                SHA3Managed sha3;

                switch (ChecksumType)
                {
                case XISFChecksumTypeEnum.SHA1:
                    SHA1 sha1 = new SHA1CryptoServiceProvider();
                    Checksum     = GetStringFromHash(sha1.ComputeHash(outArray));
                    ChecksumName = "sha-1";
                    sha1.Dispose();
                    break;

                case XISFChecksumTypeEnum.SHA256:
                    SHA256 sha256 = new SHA256CryptoServiceProvider();
                    Checksum     = GetStringFromHash(sha256.ComputeHash(outArray));
                    ChecksumName = "sha-256";
                    sha256.Dispose();
                    break;

                case XISFChecksumTypeEnum.SHA512:
                    SHA512 sha512 = new SHA512CryptoServiceProvider();
                    Checksum     = GetStringFromHash(sha512.ComputeHash(outArray));
                    ChecksumName = "sha-512";
                    sha512.Dispose();
                    break;

                case XISFChecksumTypeEnum.SHA3_256:
                    sha3         = new SHA3Managed(256);
                    Checksum     = GetStringFromHash(sha3.ComputeHash(outArray));
                    ChecksumName = "sha3-256";
                    sha3.Dispose();
                    break;

                case XISFChecksumTypeEnum.SHA3_512:
                    sha3         = new SHA3Managed(512);
                    Checksum     = GetStringFromHash(sha3.ComputeHash(outArray));
                    ChecksumName = "sha3-512";
                    sha3.Dispose();
                    break;

                case XISFChecksumTypeEnum.NONE:
                default:
                    Checksum     = null;
                    ChecksumName = null;
                    break;
                }
            }

            return(outArray);
        }
示例#21
0
        static void Main(string[] args)
        {
            IPEndPoint                  listenEndPoint;
            TcpListener                 listener      = null;
            TcpClient                   client        = null;
            NetworkStream               networkStream = null;
            ProtocolSI                  protocol      = null;
            RSACryptoServiceProvider    rsaClient     = null;
            RSACryptoServiceProvider    rsaServer     = null;
            AesCryptoServiceProvider    aes           = null;
            SymmetricsSI                symmetricsSI  = null;
            SHA256CryptoServiceProvider sha256        = null;

            try
            {
                Console.WriteLine($"** SERVER: Practical Exam on {DateTime.Today.ToLongDateString()} **");

                listenEndPoint = new IPEndPoint(IPAddress.Any, 10000);
                listener       = new TcpListener(listenEndPoint);

                Console.Write("Waiting for client... ");
                listener.Start();
                client        = listener.AcceptTcpClient();
                networkStream = client.GetStream();
                Console.WriteLine("OK.");

                protocol = new ProtocolSI();
                byte[] ack = protocol.Make(ProtocolSICmdType.ACK);

                rsaServer = new RSACryptoServiceProvider();
                rsaClient = new RSACryptoServiceProvider();
                aes       = new AesCryptoServiceProvider();

                Console.Write("Reading Public Key... ");
                networkStream.Read(protocol.Buffer, 0, protocol.Buffer.Length);
                Console.WriteLine("OK.");
                String clientPublicKey = protocol.GetStringFromData();
                byte[] packet          = protocol.Make(ProtocolSICmdType.PUBLIC_KEY, rsaServer.ToXmlString(false));
                Console.WriteLine("Sending Public Key... OK.");
                networkStream.Write(packet, 0, packet.Length);


                Console.Write("Reading Secret Key... ");
                networkStream.Read(protocol.Buffer, 0, protocol.Buffer.Length);
                byte[] encryptedSymKey = protocol.GetData();
                aes.Key = rsaServer.Decrypt(encryptedSymKey, true);
                Console.WriteLine("OK.");
                networkStream.Write(ack, 0, ack.Length);

                Console.Write("Reading IV...");
                networkStream.Read(protocol.Buffer, 0, protocol.Buffer.Length);
                aes.IV = protocol.GetData();
                Console.WriteLine("OK.");
                networkStream.Write(ack, 0, ack.Length);


                symmetricsSI = new SymmetricsSI(aes);
                Console.Write("Reading File Data... ");
                networkStream.Read(protocol.Buffer, 0, protocol.Buffer.Length);
                Console.WriteLine("OK.");
                byte[] data = symmetricsSI.Decrypt(protocol.GetData());
                sha256 = new SHA256CryptoServiceProvider();
                byte[] signature = rsaServer.SignData(data, sha256);
                Console.WriteLine("Sending Signature... OK.");
                packet = protocol.Make(ProtocolSICmdType.DATA, symmetricsSI.Encrypt(signature));
                networkStream.Write(packet, 0, packet.Length);
            }
            catch (Exception ex)
            {
                Console.WriteLine($"Error: {ex.ToString()}");
            }
            finally
            {
                if (sha256 != null)
                {
                    sha256.Dispose();
                }
                if (aes != null)
                {
                    aes.Dispose();
                }
                if (rsaClient != null)
                {
                    rsaClient.Dispose();
                }
                if (rsaServer != null)
                {
                    rsaServer.Dispose();
                }
                if (networkStream != null)
                {
                    networkStream.Dispose();
                }
                if (client != null)
                {
                    client.Close();
                }
                if (listener != null)
                {
                    listener.Stop();
                }
                Console.WriteLine("CLIENT should verify the digital signature.");
            }

            Console.Write("End: Press a key...");
            Console.ReadKey();
        } // main