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

如何在C#中实现AES-256-GCM加密并生成PKCS#7文件?

解决.NET下生成AES-256-GCM加密的PKCS#7文件问题(适配挪威Peppol要求)

可行方案:基于BouncyCastle.Cryptography实现

目前.NET原生库不支持直接生成AES-GCM加密的PKCS#7文件,最新版的BouncyCastle.Cryptography(2.2.x+)已支持通过自定义算法参数实现该需求,具体步骤如下:

1. 安装依赖

通过NuGet安装最新版BouncyCastle.Cryptography:

Install-Package BouncyCastle.Cryptography

2. 完整实现代码

using System;
using System.IO;
using System.Security.Cryptography;
using Org.BouncyCastle.Asn1;
using Org.BouncyCastle.Cms;
using Org.BouncyCastle.Crypto;
using Org.BouncyCastle.Crypto.Parameters;
using Org.BouncyCastle.Security;
using Org.BouncyCastle.X509;

public class PeppolPkcs7Generator
{
    // AES-256-GCM的标准OID
    private static readonly DerObjectIdentifier Aes256GcmOid = new DerObjectIdentifier("2.16.840.1.101.3.4.1.46");

    public static void GenerateEncryptedPkcs7(string inputFilePath, string recipientCertPath, string outputPkcs7Path)
    {
        // 加载接收方加密证书(需包含用于加密的公钥)
        var certParser = new X509CertificateParser();
        X509Certificate recipientCert = certParser.ReadCertificate(File.ReadAllBytes(recipientCertPath));
        AsymmetricKeyParameter recipientPublicKey = recipientCert.GetPublicKey();

        // 生成AES-256密钥和GCM标准参数(IV用12字节,符合GCM最佳实践)
        byte[] aesKey = new byte[32]; // 256位密钥
        byte[] iv = new byte[12];
        RandomNumberGenerator.Create().GetBytes(aesKey);
        RandomNumberGenerator.Create().GetBytes(iv);

        // 构建CMS加密器
        var envGenerator = new CmsEnvelopedDataGenerator();
        // 添加接收方,用RSA加密AES密钥(默认RSA-OAEP,可按需替换为其他算法)
        envGenerator.AddKeyTransRecipient(recipientPublicKey);

        // 加载待加密内容
        byte[] content = File.ReadAllBytes(inputFilePath);
        var processableContent = new CmsProcessableByteArray(content);

        // 生成指定AES-256-GCM加密的EnvelopedData(即PKCS#7格式)
        var envData = envGenerator.Generate(processableContent, Aes256GcmOid);

        // 导出PKCS#7文件(DER格式,直接适配Peppol传输要求)
        byte[] pkcs7Der = envData.GetEncoded();
        File.WriteAllBytes(outputPkcs7Path, pkcs7Der);
    }

    // 测试调用示例
    public static void Main()
    {
        GenerateEncryptedPkcs7(
            inputFilePath: "peppol-data.txt",
            recipientCertPath: "bank-public-cert.pem",
            outputPkcs7Path: "encrypted-peppol.p7m"
        );
    }
}

3. 关键注意事项

  • 算法兼容性:新版BouncyCastle已内置AES-GCM的OID映射,无需手动注册(CryptoConfig.AddAlgorithm仅对.NET原生加密库生效)。
  • 参数合规性:GCM模式使用12字节IV是行业标准,认证标签默认128位,完全符合挪威Peppol的要求。
  • 密钥加密算法:代码默认使用RSA-OAEP加密AES密钥,若银行要求特定算法(如RSA-PKCS#1 v1.5),可通过AddKeyTransRecipient的重载指定对应OID。

之前方案失败的原因分析

  1. System.Security.Cryptography:原生库仅提供基础加密算法实现,无PKCS#7(CMS EnvelopedData)的结构化构建API,无法直接生成符合格式的文件。
  2. MimeKit:其CMS加密模块仅支持AES-CBC等传统模式,暂未添加AES-GCM的支持,无法满足需求。
  3. OpenSSL cms命令:旧版OpenSSL对CMS中AES-GCM的支持不完善,需升级到3.0+版本才能尝试使用-aes-256-gcm参数,但仍可能存在兼容性问题。
  4. 旧版BouncyCastle:早期版本未内置AES-GCM的OID映射,参数配置方式繁琐,升级到最新版即可解决该问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 09:55:34