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

.NET Framework 4.5下OpenSSL smime加密命令的等效C#实现

不依赖OpenSSL实现SMIME AES-256-CBC加密(.NET Framework 4.5及以下或Bouncy Castle)

可以实现,以下分别用.NET Framework原生类库和Bouncy Castle两种方案完成和你指定的OpenSSL命令完全一致的加密功能。先明确你用到的两个OpenSSL命令:

加密命令

openssl smime -encrypt -aes-256-cbc -in input.txt -out output.txt -outform DER yourSslCertificate.pem

证书/私钥生成命令

openssl req -x509 -nodes -days 100000 -newkey rsa:8912 -keyout private_key.pem -out certificate.pem

方案一:使用.NET Framework原生类库实现

.NET Framework 4.5及以下的System.Security.Cryptography.Pkcs命名空间支持SMIME加密操作,只需处理PEM证书的加载即可。

using System;
using System.IO;
using System.Security.Cryptography;
using System.Security.Cryptography.Pkcs;
using System.Security.Cryptography.X509Certificates;

public static void SmimeEncryptWithDotNet(string inputFilePath, string outputFilePath, string certPemPath)
{
    // 读取并处理PEM证书内容
    string certPem = File.ReadAllText(certPemPath)
        .Replace("-----BEGIN CERTIFICATE-----", "")
        .Replace("-----END CERTIFICATE-----", "")
        .Replace(Environment.NewLine, "");
    
    byte[] certBytes = Convert.FromBase64String(certPem);
    X509Certificate2 certificate = new X509Certificate2(certBytes);

    // 读取待加密文件
    byte[] inputData = File.ReadAllBytes(inputFilePath);

    // 初始化SMIME加密对象
    EnvelopedCms envelopedCms = new EnvelopedCms(new ContentInfo(inputData));
    CmsRecipient recipient = new CmsRecipient(SubjectIdentifierType.IssuerAndSerialNumber, certificate);
    
    // 执行加密(默认使用AES-256-CBC,和OpenSSL命令一致)
    envelopedCms.Encrypt(recipient);

    // 输出DER格式的加密结果
    File.WriteAllBytes(outputFilePath, envelopedCms.Encode());
}

注意:原生类库本身不直接支持PEM格式读取,所以需要手动去除证书的PEM头尾并转Base64为字节数组。该方案生成的加密文件可以直接用你的OpenSSL私钥解密命令解密。


方案二:使用Bouncy Castle组件实现

Bouncy Castle对PEM格式的支持更原生,无需手动处理证书内容,代码更简洁。首先需要在项目中引用适配.NET Framework 4.5的Bouncy Castle NuGet包(如BouncyCastle)。

using System;
using System.IO;
using Org.BouncyCastle.Cms;
using Org.BouncyCastle.X509;
using Org.BouncyCastle.Security;

public static void SmimeEncryptWithBouncyCastle(string inputFilePath, string outputFilePath, string certPemPath)
{
    // 直接加载PEM格式证书
    X509CertificateParser certParser = new X509CertificateParser();
    X509Certificate certificate = certParser.ReadCertificate(File.ReadAllBytes(certPemPath));

    // 读取待加密数据
    byte[] inputData = File.ReadAllBytes(inputFilePath);

    // 初始化SMIME加密生成器
    CmsEnvelopedDataGenerator encryptGenerator = new CmsEnvelopedDataGenerator();
    encryptGenerator.AddKeyTransRecipient(certificate);

    // 指定AES-256-CBC算法并执行加密
    CmsProcessableByteArray dataToEncrypt = new CmsProcessableByteArray(inputData);
    CmsEnvelopedData encryptedData = encryptGenerator.Generate(dataToEncrypt, CmsEnvelopedDataGenerator.Aes256Cbc);

    // 输出DER格式结果
    File.WriteAllBytes(outputFilePath, encryptedData.GetEncoded());
}

注意:Bouncy Castle生成的加密结果和OpenSSL命令的输出完全兼容,解密流程也可以用同样的组件或者OpenSSL完成。

内容的提问来源于stack exchange,提问作者Mike T. Angelo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 18:16:08