using System.Security.Cryptography;
public static void Main()
Console.WriteLine("Enter key:");
var key = Console.ReadLine();
var keyAsBytes = Encoding.UTF8.GetBytes(key);
if (keyAsBytes.Length * 8 != PayloadCrypto.KeySize)
Console.Error.WriteLine("Not a valid key");
Console.WriteLine("Enter json on one line:");
var json = Console.ReadLine();
Console.WriteLine(PayloadCrypto.Encrypt(keyAsBytes, json));
internal class PayloadCrypto
public static string Decrypt(byte[] key, byte[] bytesToDecrypt)
var text = new byte[bytesToDecrypt.Length - 16];
Array.Copy(bytesToDecrypt, iv, 16);
Array.Copy(bytesToDecrypt, 16, text, 0, text.Length);
using var aes = Aes.Create();
aes.Padding = PaddingMode.PKCS7;
aes.Mode = CipherMode.CBC;
var decryptor = aes.CreateDecryptor(aes.Key, aes.IV);
using var msDecrypt = new MemoryStream(text);
using var csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read);
using var srDecrypt = new StreamReader(csDecrypt);
var plaintext = srDecrypt.ReadToEnd();
public static string Encrypt(byte[] key, string stringToEncrypt)
using var aes = Aes.Create();
aes.Padding = PaddingMode.PKCS7;
aes.Mode = CipherMode.CBC;
var encryptor = aes.CreateEncryptor();
using var msEncrypt = new MemoryStream();
using var csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write);
using (var swEncrypt = new StreamWriter(csEncrypt))
swEncrypt.Write(stringToEncrypt);
var encrypted = msEncrypt.ToArray();
var final = new byte[iv.Length + encrypted.Length];
encrypted.CopyTo(final, iv.Length);
return Convert.ToBase64String(final);
public static string GetKeyFromUserSuppliedString(string userKey)
var rfcKey = new Rfc2898DeriveBytes(userKey, Encoding.UTF8.GetBytes("Some salt here"));
var key = rfcKey.GetBytes(256 / 8);
return Convert.ToBase64String(key);
public static int KeySize => Aes.Create().KeySize;