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

Autenticación y autorización en ASP.NET CORE mediante cookies

Autenticación y autorización en ASP.NET CORE mediante cookies

Hay tantas formas de configurar la autenticación y autorización cunado desarrollamos una aplicación web. Aquí implementamos la Autenticación y autorización en ASP.NET CORE mediante cookies

Ver artículo completo
Cómo descargar e instalar .Net Core

Cómo descargar e instalar .Net Core

En este tutorial, aprenderás cómo descargar e instalar .Net Core o Dot Net Core. Las descargas constan de tres partes

Ver artículo completo
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

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