using System.Security.Cryptography;
public static void Main()
string encryptionKey = "EI8y2aJ76CqI5hMsLhWScBSnqwFB8lurheDJ1VYls2c=";
string hmacKey = "JeX0KT2gv9Mn5aONY0HeiYkMfI6nuC+PLbflH+FJCVo=";
String encodedString = "NJpfa8kCD6FDp+KeYFrnC+Cyf7vwNazOYg001m3k0Or7eeJh0HOeULOxVONMie7tNTo/61f+q8Z0aq784io1LLobHTOgOLU6L0KyekRqDms=";
var data = Convert.FromBase64String(encodedString);
var hmac = data.Take(32).ToArray();
var cipherAndIV = data.Skip(32).ToArray();
var iv = cipherAndIV.Take(16).ToArray();
var cipher = cipherAndIV.Skip(16).ToArray();
var mac = new HMACSHA256(Convert.FromBase64String(hmacKey));
var computedMac = mac.ComputeHash(cipherAndIV);
Console.WriteLine(Convert.ToBase64String(hmac));
Console.WriteLine(Convert.ToBase64String(computedMac));
for (int i = 0; i < hmac.Length; i++)
if (computedMac[i] != hmac[i])
Console.WriteLine("Hash values differ! Signed file has been tampered with!");
Console.WriteLine("Hash values agree -- no tampering occurred.");
var aesAlg = Aes.Create("aes-256-cbc");
aesAlg.Key = Convert.FromBase64String(encryptionKey);
aesAlg.Padding = PaddingMode.PKCS7;
aesAlg.Mode = CipherMode.CBC;
Console.WriteLine("KeySize=" + aesAlg.KeySize);
Console.WriteLine("Blocksize=" + aesAlg.BlockSize);
String decryptedData = null;
ICryptoTransform decryptor = aesAlg.CreateDecryptor(aesAlg.Key, aesAlg.IV);
using(MemoryStream ms = new MemoryStream(cipher))
using (CryptoStream csDecrypt = new CryptoStream(ms, decryptor, CryptoStreamMode.Read))
using (StreamReader sw = new StreamReader(csDecrypt))
decryptedData = Encoding.UTF8.GetString(ms.ToArray());
Console.WriteLine("IV=" + Convert.ToBase64String(aesAlg.IV) + " Length: " + aesAlg.IV.Length);
Console.WriteLine("MAC=" + Convert.ToBase64String(hmac) + " Length: " + hmac.Length);
Console.WriteLine("Cipher=" + Convert.ToBase64String(cipher) + " Length: " + cipher.Length);
Console.WriteLine("CipherAndIv=" + Convert.ToBase64String(cipherAndIV) + " Length: " + cipherAndIV.Length);
Console.WriteLine(decryptedData);