You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在C#中实现128-bit块、256-bit密钥的AES-GCM加密?

嘿,我来帮你理清楚这个问题!

关于C#中实现AES-GCM(128-bit块、256-bit密钥)的方案解析

一、.NET框架的原生实现(优先推荐)

其实.NET早就原生支持AES-GCM了,完全不需要额外依赖第三方库,这肯定是最省心、最安全的方案。从.NET Core 3.0、.NET 5+以及.NET Framework 4.8开始,System.Security.Cryptography命名空间里就提供了AesGcm类,专门用于这种带认证的对称加密场景。

给你贴个简单可运行的代码示例,直接就能用:

using System;
using System.Security.Cryptography;
using System.Text;

public class AesGcmDemo
{
    public static void Main()
    {
        // 生成256-bit密钥(对应32字节),一定要用安全的随机数生成器
        byte[] key = new byte[32];
        RandomNumberGenerator.Fill(key);

        // 要加密的明文
        string plaintext = "这是需要加密的敏感内容";
        byte[] plaintextBytes = Encoding.UTF8.GetBytes(plaintext);

        // 生成随机非向量(IV),AES-GCM推荐用12字节(96位)长度的IV,每次加密都要新生成
        byte[] iv = new byte[12];
        RandomNumberGenerator.Fill(iv);

        // 认证标签(解密时用来验证数据完整性,推荐16字节长度)
        byte[] authTag = new byte[16];

        // 可选的附加认证数据(AAD),比如可以放一些不需要加密但需要认证的元信息,不需要就传null
        byte[] aad = Encoding.UTF8.GetBytes("用户ID:12345");

        // 加密流程
        using (var aesGcm = new AesGcm(key))
        {
            byte[] ciphertext = new byte[plaintextBytes.Length];
            aesGcm.Encrypt(iv, plaintextBytes, ciphertext, authTag, aad);

            // 解密验证流程
            byte[] decryptedBytes = new byte[ciphertext.Length];
            aesGcm.Decrypt(iv, ciphertext, authTag, decryptedBytes, aad);
            string decryptedText = Encoding.UTF8.GetString(decryptedBytes);

            Console.WriteLine($"解密结果:{decryptedText}");
        }
    }
}

这里要提醒几个关键细节:

  • 密钥必须是32字节(对应256-bit),绝对不能用普通字符串转字节的方式生成,一定要用RandomNumberGenerator这种安全的随机数生成器
  • IV是随机生成的,不需要保密,但必须和密文、认证标签一起传给解密方,且每次加密都要生成新的IV
  • 认证标签是解密时验证数据是否被篡改的核心,必须和密文一起存储/传输

二、你提到的两个第三方方案是否可行?

1. BouncyCastle的实现

如果你的项目还在使用较老的.NET版本(比如.NET Framework 4.8之前),原生不支持AesGcm,那BouncyCastle是个靠谱的替代方案。它是一个成熟的加密类库,确实能稳定实现AES-GCM。缺点是需要引入第三方NuGet包,不如原生方案轻便。

2. MSDN博客中的方案

那篇2009年的博客是用AesManaged结合HMAC手动模拟认证加密,本质上不是原生的AES-GCM实现,而是自己组合的“类认证加密”方案。这种方式不仅代码繁琐,还很容易因为细节处理不当(比如IV的选择、HMAC的拼接顺序)引入安全漏洞,非常不推荐——现在有原生实现或成熟第三方库的情况下,完全没必要用这种老旧且风险高的方法。

总结

如果你的项目能支持.NET Core 3.0+、.NET 5+或者.NET Framework 4.8,直接用原生的AesGcm类就好,这是最简单、最安全的选择;如果是更老的框架,再考虑BouncyCastle,别碰那篇MSDN博客里的手动组合方案。

内容的提问来源于stack exchange,提问作者Emanuele

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 03:47:22