using System.Security.Cryptography;
var key = GetRandomData(256 / 8);
var data = new byte[]{1, 2, 3};
Console.WriteLine(Convert.ToBase64String(data));
byte[] associatedData = null;
var encryptedAesGcmData = EncryptAesGcm(data, key, associatedData, out var tag, out var nonce);
Console.WriteLine(Convert.ToBase64String(encryptedAesGcmData));
var decryptedAesGcmData = DecryptAesGcm(encryptedAesGcmData, key, associatedData, tag, nonce);
Console.WriteLine(Convert.ToBase64String(decryptedAesGcmData));
private static byte[] GetRandomData(int length)
return RandomNumberGenerator.GetBytes(length);
private static byte[] EncryptAesGcm(byte[] data, byte[] key, byte[] associatedData, out byte[] tag, out byte[] nonce)
tag = new byte[AesGcm.TagByteSizes.MaxSize];
nonce = new byte[AesGcm.NonceByteSizes.MaxSize];
RandomNumberGenerator.Fill(nonce);
byte[] cipherText = new byte[data.Length];
using var cipher = new AesGcm(key);
cipher.Encrypt(nonce, data, cipherText, tag, associatedData);
private static byte[] DecryptAesGcm(byte[] data, byte[] key, byte[] associatedData, byte[] tag, byte[] nonce)
byte[] decryptedData = new byte[data.Length];
using var cipher = new AesGcm(key);
cipher.Decrypt(nonce, data, tag, decryptedData, associatedData);