public static string Encrypt(string clearText, ICSPRNGServer csprng) { byte[] salt = new byte[16]; csprng.getRandomValues(salt); byte[] encBytes = null; byte[] clearBytes = Encoding.Unicode.GetBytes(clearText); using (Aes encryptor = Aes.Create()) { encryptor.KeySize = 256; encryptor.BlockSize = 128; encryptor.Mode = CipherMode.CBC; encryptor.Padding = PaddingMode.PKCS7; Rfc2898DeriveBytes pdb = new Rfc2898DeriveBytes(csprng.Key(), salt, 1); encryptor.Key = pdb.GetBytes(32); encryptor.IV = pdb.GetBytes(16); using (MemoryStream ms = new MemoryStream()) { using (CryptoStream cs = new CryptoStream(ms, encryptor.CreateEncryptor(), CryptoStreamMode.Write)) { cs.Write(clearBytes, 0, clearBytes.Length); } encBytes = ms.ToArray(); } } byte[] saltAndCipher = salt.Concat(encBytes).ToArray(); string saltAndCipherText = Convert.ToBase64String(saltAndCipher); return(saltAndCipherText); }
public static string Decrypt(string clearText, ICSPRNGServer csprng) { byte[] baseclear = Convert.FromBase64String(clearText); byte[] clearBytes = new byte[baseclear.Length - 16]; for (int i = 0; i < clearBytes.Length; i++) { clearBytes[i] = baseclear[i + 16]; } byte[] salt = baseclear.Take(16).ToArray(); using (Aes encryptor = Aes.Create()) { encryptor.KeySize = 256; encryptor.BlockSize = 128; encryptor.Mode = CipherMode.CBC; encryptor.Padding = PaddingMode.PKCS7; Rfc2898DeriveBytes pdb = new Rfc2898DeriveBytes(csprng.Key(), salt, 1); encryptor.Key = pdb.GetBytes(32); encryptor.IV = pdb.GetBytes(16); using (MemoryStream ms = new MemoryStream(clearBytes)) { using (CryptoStream cs = new CryptoStream(ms, encryptor.CreateDecryptor(), CryptoStreamMode.Read)) { using (StreamReader srDecrypt = new StreamReader(cs)) { clearText = srDecrypt.ReadToEnd(); } } } } clearText = clearText.Replace("\0", ""); return(clearText); }