using System.Security.Cryptography; using System.Text; namespace Project.Persistence; public class Crypto { private static readonly string _key = "myKeyIsSecureAsFuck"; public static string EncryptPassword(string password) { using (Aes aes = Aes.Create()) { byte[] key = DeriveKey(_key); aes.Key = key; aes.GenerateIV(); // generate new IV ICryptoTransform encryptor = aes.CreateEncryptor(); using (MemoryStream msEncrypt = new MemoryStream()) { // save IV msEncrypt.Write(aes.IV, 0, aes.IV.Length); using (CryptoStream csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write)) using (StreamWriter swEncrypt = new StreamWriter(csEncrypt)) { swEncrypt.Write(password); } return Convert.ToBase64String(msEncrypt.ToArray()); } } } public static string DecryptPassword(string encryptedPassword) { byte[] fullCipher = Convert.FromBase64String(encryptedPassword); using (Aes aes = Aes.Create()) { byte[] key = DeriveKey(_key); aes.Key = key; // extract IV from encryption byte[] iv = new byte[aes.BlockSize / 8]; Array.Copy(fullCipher, 0, iv, 0, iv.Length); aes.IV = iv; ICryptoTransform decryptor = aes.CreateDecryptor(); using (MemoryStream msDecrypt = new MemoryStream(fullCipher, iv.Length, fullCipher.Length - iv.Length)) using (CryptoStream csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read)) using (StreamReader srDecrypt = new StreamReader(csDecrypt)) { return srDecrypt.ReadToEnd(); } } } private static byte[] DeriveKey(string key) { // 256 bits for AES-256 using (var deriveBytes = new Rfc2898DeriveBytes(key, new byte[] { 0x49, 0x76, 0x61, 0x6e, 0x20, 0x4d, 0x65, 0x64, 0x76, 0x65, 0x64, 0x65, 0x76 }, 1000)) { return deriveBytes.GetBytes(32); } } }