Cifrar y descifrar contraseñas o cadenas de texto en C#

Estrada Web Group
Administrador
Cifrar y descifrar contraseñas o cadenas de texto en C#

El Advanced Encryption Standard (AES), también conocido como Rijndael Encryption, fue desarrollado por dos criptógrafos belgas, Vincent Rijmen y Joan Daemen. AES ofrece una función para compartir o almacenar sus archivos de manera altamente segura. En este blog no hablamos de criptografía o AES, solo explica cómo cifrar y descifrar una cadena usando AES.

En el sistema de cifrado .Net Rijndael (Clase RijndaelManaged) es parte de la criptografía (System.Security.Cryptography). Esta clase nos permite cifrar y descifrar contraseñas o cualquier cadena de texto que quieran cifrar en c#.

public class SecurityManager
    {
        static readonly string password = "P455W0rd";
        public static string Encrypt(string plainText)
        {
            if (plainText == null)
            {
                return null;
            }
            // Get the bytes of the string
            var bytesToBeEncrypted = Encoding.UTF8.GetBytes(plainText);
            var passwordBytes = Encoding.UTF8.GetBytes(password);

            // Hash the password with SHA256
            passwordBytes = SHA512.Create().ComputeHash(passwordBytes);

            var bytesEncrypted = Encrypt(bytesToBeEncrypted, passwordBytes);

            return Convert.ToBase64String(bytesEncrypted);
        }

        /// <summary>
        /// Decrypt a string.
        /// </summary>
        /// <param name="encryptedText">String to be decrypted</param>
        /// <exception cref="FormatException"></exception>
        public static string Decrypt(string encryptedText)
        {
            if (encryptedText == null)
            {
                return null;
            }
            // Get the bytes of the string
            var bytesToBeDecrypted = Convert.FromBase64String(encryptedText);
            var passwordBytes = Encoding.UTF8.GetBytes(password);

            passwordBytes = SHA512.Create().ComputeHash(passwordBytes);

            var bytesDecrypted = Decrypt(bytesToBeDecrypted, passwordBytes);

            return Encoding.UTF8.GetString(bytesDecrypted);
        }

        private static byte[] Encrypt(byte[] bytesToBeEncrypted, byte[] passwordBytes)
        {
            byte[] encryptedBytes = null;
            var saltBytes = new byte[] { 1, 2, 3, 4, 5, 6, 7, 8 };

            using (MemoryStream ms = new MemoryStream())
            {
                using (RijndaelManaged AES = new RijndaelManaged())
                {
                    var key = new Rfc2898DeriveBytes(passwordBytes, saltBytes, 1000);

                    AES.KeySize = 256;
                    AES.BlockSize = 128;
                    AES.Key = key.GetBytes(AES.KeySize / 8);
                    AES.IV = key.GetBytes(AES.BlockSize / 8);

                    AES.Mode = CipherMode.CBC;

                    using (var cs = new CryptoStream(ms, AES.CreateEncryptor(), CryptoStreamMode.Write))
                    {
                        cs.Write(bytesToBeEncrypted, 0, bytesToBeEncrypted.Length);
                        cs.Close();
                    }

                    encryptedBytes = ms.ToArray();
                }
            }

            return encryptedBytes;
        }

        private static byte[] Decrypt(byte[] bytesToBeDecrypted, byte[] passwordBytes)
        {
            byte[] decryptedBytes = null;
            var saltBytes = new byte[] { 1, 2, 3, 4, 5, 6, 7, 8 };

            using (MemoryStream ms = new MemoryStream())
            {
                using (RijndaelManaged AES = new RijndaelManaged())
                {
                    var key = new Rfc2898DeriveBytes(passwordBytes, saltBytes, 1000);

                    AES.KeySize = 256;
                    AES.BlockSize = 128;
                    AES.Key = key.GetBytes(AES.KeySize / 8);
                    AES.IV = key.GetBytes(AES.BlockSize / 8);
                    AES.Mode = CipherMode.CBC;

                    using (var cs = new CryptoStream(ms, AES.CreateDecryptor(), CryptoStreamMode.Write))
                    {
                        cs.Write(bytesToBeDecrypted, 0, bytesToBeDecrypted.Length);
                        cs.Close();
                    }

                    decryptedBytes = ms.ToArray();
                }
            }

            return decryptedBytes;
        }
    }

 

Compartir artículo:

Más artículos geniales

Aprender a programar un sistema para administrar archivos en línea con ASP.NET Core

Aprender a programar un sistema para administrar archivos en línea con ASP.NET Core

Si quieres aprender a programar con ASP.NET Core, puedes consultar tres videos que publique en YouTube, sobre un sistema para administrar archivos en línea que desarrolle.

Ver artículo completo
Avances del desarrollo del proyecto de sistema de inventarios

Avances del desarrollo del proyecto de sistema de inventarios

Si quieres aprender a programar un sistema de inventarios desde cero este es el lugar correcto. Aquí puedes descargar los avances del proyecto y te describo las funcionalidades desarrolladas

Ver artículo completo
Instalación y configuración del entorno de desarrollo de ASP.NET Core

Instalación y configuración del entorno de desarrollo de ASP.NET Core

En este tutorial, aprenderás cómo configurar un entorno de desarrollo ASP.NET Core. Para comenzar con el desarrollo de ASP.NET Core, necesitas un IDE y un SDK de .NET Core.

Ver artículo completo

Manténgase actualizado

Obtenga excelente contenido en su bandeja de entrada todas las semanas.
Solo contenido excelente, no compartimos su correo electrónico con terceros.
Subir al inicio de la pantalla