using System.Security.Cryptography;
public static void Main()
{Name = "Johny", Age = 30};
var json = Newtonsoft.Json.JsonConvert.SerializeObject(o);
Console.WriteLine("Original object = {0}", json);
var en = Sec.Encrypt(json);
Console.WriteLine("Encrypted object = {0}", en);
var de = Sec.Decrypt(en);
Console.WriteLine("Decrypted object = {0}", de);
var deserialized_json = Newtonsoft.Json.JsonConvert.DeserializeObject<Test>(de);
Console.WriteLine("Compare types of original object with hashed, deserialized object = {0}", deserialized_json.GetType().Equals(o.GetType()));
string[] tempered_hash = new string[en.Length];
tempered_hash[i++] = s.ToString();
tempered_hash[9] = en[7].ToString();
tempered_hash[15] = en[en.Length - 1].ToString();
var tempered_str = string.Join("",tempered_hash);
Console.WriteLine("Tempered en hash = {0}", tempered_str);
var _de = Sec.Decrypt(tempered_str);
Console.WriteLine("Decrypted tempered object = {0}", _de);
var _deserialized_json = Newtonsoft.Json.JsonConvert.DeserializeObject<Test>(_de);
catch(System.Exception e){
Console.WriteLine("Failed to decrypt/deserealize: {0}", e.Message);
public override string ToString()
return Name + " - " + Age;
public static string Encrypt(string plainText)
var buffer = Encoding.UTF8.GetBytes(plainText);
var hash = new SHA512CryptoServiceProvider();
var aesKey = new byte[24];
Buffer.BlockCopy(hash.ComputeHash(Encoding.UTF8.GetBytes("DUMMYKEY")), 0, aesKey, 0, 24);
using (var aes = Aes.Create())
using (var encryptor = aes.CreateEncryptor(aes.Key, aes.IV))
using (var resultStream = new MemoryStream())
using (var aesStream = new CryptoStream(resultStream, encryptor, CryptoStreamMode.Write))
using (var plainStream = new MemoryStream(buffer))
plainStream.CopyTo(aesStream);
var result = resultStream.ToArray();
var combined = new byte[aes.IV.Length + result.Length];
Array.ConstrainedCopy(aes.IV, 0, combined, 0, aes.IV.Length);
Array.ConstrainedCopy(result, 0, combined, aes.IV.Length, result.Length);
return Convert.ToBase64String(combined);
public static string Decrypt(string encryptedText)
var combined = Convert.FromBase64String(encryptedText);
var buffer = new byte[combined.Length];
var hash = new SHA512CryptoServiceProvider();
var aesKey = new byte[24];
Buffer.BlockCopy(hash.ComputeHash(Encoding.UTF8.GetBytes("DUMMYKEY")), 0, aesKey, 0, 24);
using (var aes = Aes.Create())
var iv = new byte[aes.IV.Length];
var ciphertext = new byte[buffer.Length - iv.Length];
Array.ConstrainedCopy(combined, 0, iv, 0, iv.Length);
Array.ConstrainedCopy(combined, iv.Length, ciphertext, 0, ciphertext.Length);
using (var decryptor = aes.CreateDecryptor(aes.Key, aes.IV))
using (var resultStream = new MemoryStream())
using (var aesStream = new CryptoStream(resultStream, decryptor, CryptoStreamMode.Write))
using (var plainStream = new MemoryStream(ciphertext))
plainStream.CopyTo(aesStream);
return Encoding.UTF8.GetString(resultStream.ToArray());