using System.Security.Cryptography;
private const string SALT_KEY = "@VietinbankNeverDie@2020";
private static readonly byte[] SALT_BYTES = Encoding.UTF8.GetBytes(SALT_KEY);
public const int KEY_BYTES = 16;
public const int NONCE_BYTES = 12;
public static void Main()
var text = "Hello world";
var encrypted = EncryptAesGcmText(text);
var decrypted = DecryptAesGcmText(encrypted);
var isEqual = decrypted == text;
Console.WriteLine("Is Equal {0}", isEqual);
public static string EncryptAesGcmText(string input)
var bytesToBeEncrypted = Encoding.UTF8.GetBytes(input);
var bytesEncrypted = AesGcmEncrypt(bytesToBeEncrypted);
var base64 = Convert.ToBase64String(bytesEncrypted);
var text = Encoding.Default.GetString(bytesEncrypted);
public static string DecryptAesGcmText(string input)
var bytesToBeDecrypted = Convert.FromBase64String(input);
var bytesDecrypted = AesGcmDecrypt(bytesToBeDecrypted);
return Encoding.UTF8.GetString(bytesDecrypted);
private static byte[] AesGcmEncrypt(byte[] bytesToBeEncrypted)
var tag = new byte[KEY_BYTES];
var nonce = new byte[NONCE_BYTES];
var cipherText = new byte[bytesToBeEncrypted.Length];
using var cipher = new AesGcm(SALT_BYTES);
cipher.Encrypt(nonce, bytesToBeEncrypted, cipherText, tag, null);
return ConcatArrays(tag, ConcatArrays(nonce, cipherText));
private static byte[] AesGcmDecrypt(byte[] bytesToBeDecrypted)
var tag = SubArray(0, KEY_BYTES, bytesToBeDecrypted);
var nonce = SubArray(KEY_BYTES, NONCE_BYTES, bytesToBeDecrypted);
var toDecrypt = SubArray(KEY_BYTES + NONCE_BYTES, bytesToBeDecrypted.Length - tag.Length - nonce.Length, bytesToBeDecrypted);
var decryptedData = new byte[toDecrypt.Length];
using var cipher = new AesGcm(SALT_BYTES);
cipher.Decrypt(nonce, toDecrypt, tag, decryptedData, null);
public static T[] ConcatArrays<T>(params T[][] arrays)
var outputArray = new T[arrays.Sum(array => array.Length)];
foreach (var array in arrays)
Array.Copy(array, 0, outputArray, position, array.Length);
position += array.Length;
public static T[] SubArray<T>(int start, int length, params T[] data)
start = start >= 0 ? start : 0;
length = length >= start || length <= data.Length ? length : data.Length;
var result = new T[length];
Array.Copy(data, start, result, 0, length);