using System; using System.IO; using System.Security.Cryptography; using System.Text; using System.Threading.Tasks;
private static readonly string pbLocal = "QY95kGY+IHN1fv/YZgGzZvR1Q5z8DoE2odZ8s+OepNITau2UfvkWo1nsMXBNTkrL9EVjkXYOZvczDdTAxsVIUmoHkdYzqNaiPjuDNphxzdOd/Az20ur/mz9wmUqZzzwZo2aeJtoZ3Nee6ut9Qi/RZF8FkesPtFZPcuL9v9QQ4ag=";
private static readonly string pvLocal = "ZECixRpS1P4LICup7XAlq52pjvt8hpLgO25Q4TkRhFiXsOqKfv2HPKpuG6sKoNavaYu8wp+Xvvj3FkPOBw1VewILkfANr+28gOxV+omZUg4bsY+49Hl+BVlC/9Ls+8yQ4FRO9Lc0TdF9747bXl7Ug/WWKRjO4xhkittq8RraJNXXj+xM2AaTsxtSW6UBYSEFNQlkG9EEuyz3al/QyCAmS3aRyxlraYiv9p44lN3lPj4=";
private static Task<string> GetVaultSecretValue(string appCode, string key)
return Task.FromResult(pbLocal);
return Task.FromResult(pvLocal);
throw new Exception("Invalid key");
private static byte[] AesGcmEncrypt(byte[] key, byte[] plainText)
using var aes = new AesGcm(key);
var nonce = new byte[12];
RandomNumberGenerator.Fill(nonce);
var cipherText = new byte[plainText.Length];
aes.Encrypt(nonce, plainText, cipherText, tag);
using var ms = new MemoryStream();
ms.Write(nonce, 0, nonce.Length);
ms.Write(tag, 0, tag.Length);
ms.Write(cipherText, 0, cipherText.Length);
private static byte[] AesGcmDecrypt(byte[] key, byte[] cipherData)
using var aes = new AesGcm(key);
var nonce = cipherData[..12];
var tag = cipherData[12..28];
var cipherText = cipherData[28..];
var plainText = new byte[cipherText.Length];
aes.Decrypt(nonce, cipherText, tag, plainText);
public static async Task<string> EncryptStringToStoring(string plainText)
var receiverPublicKey = Convert.FromBase64String("QY95kGY+IHN1fv/YZgGzZvR1Q5z8DoE2odZ8s+OepNITau2UfvkWo1nsMXBNTkrL9EVjkXYOZvczDdTAxsVIUmoHkdYzqNaiPjuDNphxzdOd/Az20ur/mz9wmUqZzzwZo2aeJtoZ3Nee6ut9Qi/RZF8FkesPtFZPcuL9v9QQ4ag=");
using var senderEcdh = ECDiffieHellman.Create(ECCurve.NamedCurves.nistP256);
byte[] ephemeralPublicKey = senderEcdh.ExportSubjectPublicKeyInfo();
using var receiverPublic = ECDiffieHellman.Create(ECCurve.NamedCurves.nistP256);
receiverPublic.ImportSubjectPublicKeyInfo(receiverPublicKey, out _);
byte[] aesKey = senderEcdh.DeriveKeyMaterial(receiverPublic.PublicKey);
byte[] encryptedData = AesGcmEncrypt(aesKey, Encoding.UTF8.GetBytes(plainText));
using var ms = new MemoryStream();
await ms.WriteAsync(BitConverter.GetBytes(ephemeralPublicKey.Length), 0, 4);
await ms.WriteAsync(ephemeralPublicKey, 0, ephemeralPublicKey.Length);
await ms.WriteAsync(encryptedData, 0, encryptedData.Length);
return Convert.ToBase64String(ms.ToArray());
throw new Exception("Sai khóa mã hóa hoặc dữ liệu trống: " + ex.Message);
public static async Task<string> DecryptStringToStoring(string encryptedText)
var receiverPrivateKey = Convert.FromBase64String("ZECixRpS1P4LICup7XAlq52pjvt8hpLgO25Q4TkRhFiXsOqKfv2HPKpuG6sKoNavaYu8wp+Xvvj3FkPOBw1VewILkfANr+28gOxV+omZUg4bsY+49Hl+BVlC/9Ls+8yQ4FRO9Lc0TdF9747bXl7Ug/WWKRjO4xhkittq8RraJNXXj+xM2AaTsxtSW6UBYSEFNQlkG9EEuyz3al/QyCAmS3aRyxlraYiv9p44lN3lPj4=");
using var receiverEcdh = ECDiffieHellman.Create(ECCurve.NamedCurves.nistP256);
receiverEcdh.ImportECPrivateKey(receiverPrivateKey, out _);
var encryptedData = Convert.FromBase64String(encryptedText);
int ephemeralPublicKeyLength = BitConverter.ToInt32(encryptedData, 0);
byte[] ephemeralPublicKey = new byte[ephemeralPublicKeyLength];
Buffer.BlockCopy(encryptedData, 4, ephemeralPublicKey, 0, ephemeralPublicKeyLength);
byte[] cipherText = new byte[encryptedData.Length - 4 - ephemeralPublicKeyLength];
Buffer.BlockCopy(encryptedData, 4 + ephemeralPublicKeyLength, cipherText, 0, cipherText.Length);
using var senderPublic = ECDiffieHellman.Create();
senderPublic.ImportSubjectPublicKeyInfo(ephemeralPublicKey, out _);
byte[] aesKey = receiverEcdh.DeriveKeyMaterial(senderPublic.PublicKey);
byte[] decryptedData = AesGcmDecrypt(aesKey, cipherText);
return Encoding.UTF8.GetString(decryptedData);
throw new Exception("Dữ liệu giải mã lỗi hoặc sai khóa giải mã hoặc dữ liệu trống: " + ex.Message);
static async Task Main(string[] args)
string plainText = "Hello, this is a test string!";
Console.WriteLine("Chuỗi gốc: " + plainText);
string encryptedText = await EncryptStringToStoring(plainText);
Console.WriteLine("Chuỗi mã hóa: " + encryptedText);
string decryptedText = await DecryptStringToStoring(encryptedText);
Console.WriteLine("Chuỗi giải mã: " + decryptedText);
if (plainText == decryptedText)
Console.WriteLine("Mã hóa và giải mã thành công!");
Console.WriteLine("Mã hóa và giải mã thất bại!");
Console.WriteLine("Lỗi: " + ex.Message);