using System.Security.Cryptography;
public class EncryptionValue
public int PassIterations { get; set; }
public int KeySize { get; set; }
public string InitVector { get; set; }
public string SaltValue { get; set; }
static HashAlgorithmName hash = HashAlgorithmName.SHA256;
public static string Decrypt(string data, EncryptionValue eV, string passPhrase)
byte[] bytes = Encoding.ASCII.GetBytes(eV.InitVector);
byte[] rgbSalt = Encoding.ASCII.GetBytes(eV.SaltValue);
byte[] buffer = Convert.FromBase64String(data);
byte[] rgbKey = new Rfc2898DeriveBytes(passPhrase, rgbSalt, eV.PassIterations, hash).GetBytes(eV.KeySize / 8);
var managed = Aes.Create("AesManaged");
managed.Padding = PaddingMode.PKCS7;
managed.Mode = CipherMode.CBC;
ICryptoTransform transform = managed.CreateDecryptor(rgbKey, bytes);
MemoryStream stream = new(buffer);
CryptoStream stream2 = new(stream, transform, CryptoStreamMode.Read);
byte[] buffer5 = new byte[buffer.Length];
Console.WriteLine($"buffer5.Length = {buffer5.Length} bytes");
int numberOfReadCalls = 0;
int numberOfBytesInBuffer = 0;
while (numberOfBytesInBuffer < buffer5.Length)
var n = stream2.Read(buffer5, numberOfBytesInBuffer, buffer5.Length - numberOfBytesInBuffer);
numberOfBytesInBuffer += n;
Console.WriteLine($"Number of bytes read at stream2.Read call #{numberOfReadCalls} = {n}");
Console.WriteLine($"Total amount of bytes read from CryptoStream = {numberOfBytesInBuffer}");
int count = numberOfBytesInBuffer;
return Encoding.UTF8.GetString(buffer5, 0, count);
public static string Encrypt(string data, EncryptionValue eV, string passPhrase)
byte[] bytes = Encoding.ASCII.GetBytes(eV.InitVector);
byte[] rgbSalt = Encoding.ASCII.GetBytes(eV.SaltValue);
byte[] buffer = Encoding.UTF8.GetBytes(data);
byte[] rgbKey = new Rfc2898DeriveBytes(passPhrase, rgbSalt, eV.PassIterations, hash).GetBytes(eV.KeySize / 8);
Console.WriteLine($"Length of plaintext buffer to be encrypted: {buffer.Length} bytes");
var managed = Aes.Create("AesManaged");
managed.Padding = PaddingMode.PKCS7;
managed.Mode = CipherMode.CBC;
ICryptoTransform transform = managed.CreateEncryptor(rgbKey, bytes);
MemoryStream stream = new();
CryptoStream stream2 = new(stream, transform, CryptoStreamMode.Write);
stream2.Write(buffer, 0, buffer.Length);
stream2.FlushFinalBlock();
byte[] inArray = stream.ToArray();
return Convert.ToBase64String(inArray);
public static void Main()
var ev = new EncryptionValue
InitVector = "~1B2c3D4e5F6g7H8",
SaltValue = "SnafuFoobar",
var plainText = "Hello world! Mouser trousers are cute. Singer songer singalong. What should i write, what can i write? About the weather? Boring. What i write is boring.";
Console.WriteLine($"Length of plaintext: {plainText.Length} characters");
var enc = Encrypt(plainText, ev, "foobar");
var decrypted = Decrypt(enc, ev, "foobar");
Console.WriteLine($"Length of decrpyted plain text: {decrypted.Length} characters");
Console.WriteLine($"Is decrypted text equal plainText: {decrypted == plainText}");