.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
相关产品推荐
相关产品推荐

