using System.Security.Cryptography;
public static void Main()
var guid = new Guid("").ToString();
var plainText = StringCipher.Decrypt(cipherText, guid);
Console.WriteLine(plainText);
public static class StringCipher
private const int DerivationIterations = 1000;
private const int saltBytes = 32;
private const int ivBytes = 16;
#endregion Private Fields
public static string Decrypt(string cipherText, string passPhrase)
var cipherTextBytesWithSaltAndIv = Convert.FromBase64String(cipherText);
var saltStringBytes = cipherTextBytesWithSaltAndIv.Take(saltBytes).ToArray();
var ivStringBytes = cipherTextBytesWithSaltAndIv.Skip(saltBytes).Take(ivBytes).ToArray();
var cipherTextBytes = cipherTextBytesWithSaltAndIv.Skip(saltBytes + ivBytes).Take(cipherTextBytesWithSaltAndIv.Length - (saltBytes + ivBytes)).ToArray();
using var password = new Rfc2898DeriveBytes(passPhrase, saltStringBytes, DerivationIterations);
var keyBytes = password.GetBytes(saltBytes);
using var symmetricKey = Aes.Create();
symmetricKey.BlockSize = 128;
symmetricKey.Mode = CipherMode.CBC;
symmetricKey.Padding = PaddingMode.PKCS7;
using var decryptor = symmetricKey.CreateDecryptor(keyBytes, ivStringBytes);
using var memoryStream = new MemoryStream(cipherTextBytes);
using var cryptoStream = new CryptoStream(memoryStream, decryptor, CryptoStreamMode.Read);
var plainTextBytes = new byte[cipherTextBytes.Length];
var decryptedByteCount = 0;
while (decryptedByteCount < plainTextBytes.Length)
var bytesRead = cryptoStream.Read(plainTextBytes, decryptedByteCount, plainTextBytes.Length - decryptedByteCount);
if (bytesRead == 0) break;
decryptedByteCount += bytesRead;
return Encoding.UTF8.GetString(plainTextBytes, 0, decryptedByteCount);
public static string Encrypt(string plainText, string passPhrase)
var saltStringBytes = GenerateBitsOfRandomEntropy(saltBytes);
var ivStringBytes = GenerateBitsOfRandomEntropy(ivBytes);
var plainTextBytes = Encoding.UTF8.GetBytes(plainText);
using var password = new Rfc2898DeriveBytes(passPhrase, saltStringBytes, DerivationIterations);
var keyBytes = password.GetBytes(saltBytes);
using var symmetricKey = Aes.Create();
symmetricKey.BlockSize = 128;
symmetricKey.Mode = CipherMode.CBC;
symmetricKey.Padding = PaddingMode.PKCS7;
using var encryptor = symmetricKey.CreateEncryptor(keyBytes, ivStringBytes);
using var memoryStream = new MemoryStream();
using var cryptoStream = new CryptoStream(memoryStream, encryptor, CryptoStreamMode.Write);
cryptoStream.Write(plainTextBytes, 0, plainTextBytes.Length);
cryptoStream.FlushFinalBlock();
var cipherTextBytes = saltStringBytes;
cipherTextBytes = cipherTextBytes.Concat(ivStringBytes).ToArray();
cipherTextBytes = cipherTextBytes.Concat(memoryStream.ToArray()).ToArray();
return Convert.ToBase64String(cipherTextBytes);
#endregion Public Methods
private static byte[] GenerateBitsOfRandomEntropy(int num)
var randomBytes = new byte[num];
using var rngCsp = RandomNumberGenerator.Create();
rngCsp.GetBytes(randomBytes);
#endregion Private Methods