56 lines
2.0 KiB
C#
56 lines
2.0 KiB
C#
using System.Security.Cryptography;
|
|
using System.Text;
|
|
|
|
namespace Knots.Services;
|
|
|
|
public class EncryptionService
|
|
{
|
|
private const int NonceSize = 12; // AesGcm.NonceByteSizes.MaxSize
|
|
private const int TagSize = 16; // AesGcm.TagByteSizes.MaxSize
|
|
|
|
// Génère une clé AES-256 (32 octets) encodée en Base64
|
|
public string GenerateKey()
|
|
=> Convert.ToBase64String(RandomNumberGenerator.GetBytes(32));
|
|
|
|
// Chiffre → renvoie Base64(nonce + tag + ciphertext)
|
|
public string Encrypt(string plainText, string base64Key)
|
|
{
|
|
byte[] key = Convert.FromBase64String(base64Key);
|
|
byte[] plain = Encoding.UTF8.GetBytes(plainText);
|
|
|
|
byte[] nonce = RandomNumberGenerator.GetBytes(NonceSize);
|
|
byte[] cipher = new byte[plain.Length];
|
|
byte[] tag = new byte[TagSize];
|
|
|
|
using AesGcm aes = new(key, TagSize);
|
|
aes.Encrypt(nonce, plain, cipher, tag);
|
|
|
|
byte[] result = new byte[NonceSize + TagSize + cipher.Length];
|
|
Buffer.BlockCopy(nonce, 0, result, 0, NonceSize);
|
|
Buffer.BlockCopy(tag, 0, result, NonceSize, TagSize);
|
|
Buffer.BlockCopy(cipher, 0, result, NonceSize + TagSize, cipher.Length);
|
|
|
|
return Convert.ToBase64String(result);
|
|
}
|
|
|
|
// Déchiffre Base64(nonce + tag + ciphertext)
|
|
public string Decrypt(string base64Cipher, string base64Key)
|
|
{
|
|
byte[] key = Convert.FromBase64String(base64Key);
|
|
byte[] data = Convert.FromBase64String(base64Cipher);
|
|
|
|
byte[] nonce = new byte[NonceSize];
|
|
byte[] tag = new byte[TagSize];
|
|
byte[] cipher = new byte[data.Length - NonceSize - TagSize];
|
|
|
|
Buffer.BlockCopy(data, 0, nonce, 0, NonceSize);
|
|
Buffer.BlockCopy(data, NonceSize, tag, 0, TagSize);
|
|
Buffer.BlockCopy(data, NonceSize + TagSize, cipher, 0, cipher.Length);
|
|
|
|
byte[] plain = new byte[cipher.Length];
|
|
using AesGcm aes = new(key, TagSize);
|
|
aes.Decrypt(nonce, cipher, tag, plain);
|
|
|
|
return Encoding.UTF8.GetString(plain);
|
|
}
|
|
} |