.NET 5+ 跨平台生成RSA密钥对 实现openssl genrsa等价功能
C# 跨平台实现OpenSSL genrsa 生成RSA密钥功能
你不需要手动实现GetBytes方法解析RSA参数,.NET 5及以上版本已经提供了跨平台的内置RSA密钥PEM导出API,完全兼容OpenSSL生成的格式,支持Windows/Linux/macOS全平台运行。
你提到的openssl genrsa -out keypair.pem 2048命令默认生成的是PKCS#1格式的未加密RSA私钥PEM文件,对应实现方案如下:
最优实现方案(推荐)
直接使用.NET内置的导出方法,无需手动处理密钥参数,兼容性和可靠性更高。
.NET 7 及以上版本(最简化写法)
using System.Security.Cryptography; string outputPath = "keypair.pem"; // 生成2048位RSA密钥 using var rsa = RSA.Create(2048); // 直接导出OpenSSL兼容的PKCS#1格式私钥PEM文本 string pemContent = rsa.ExportPkcs1PrivateKeyPem(); // 写入文件即可 await File.WriteAllTextAsync(outputPath, pemContent);
如果需要生成加密的私钥(对应openssl genrsa加加密参数的场景),使用以下代码:
using System.Security.Cryptography; string outputPath = "keypair.pem"; string encryptionPassword = "你的自定义密码"; using var rsa = RSA.Create(2048); // 导出AES256加密的私钥PEM string encryptedPem = rsa.ExportEncryptedPkcs8PrivateKeyPem( encryptionPassword, new PbeParameters(PbeEncryptionAlgorithm.Aes256Cbc, HashAlgorithmName.SHA256, 100000) ); await File.WriteAllTextAsync(outputPath, encryptedPem);
.NET 5/6 兼容版本
如果项目目标框架为.NET 5或6,没有直接导出PEM字符串的API,可以先导出DER编码的字节流,再手动封装为PEM格式:
using System.Security.Cryptography; using System.Text; string outputPath = "keypair.pem"; using var rsa = RSA.Create(2048); // 导出PKCS#1格式DER编码字节 byte[] derBytes = rsa.ExportPkcs1PrivateKey(); // 转换为PEM格式 string base64Str = Convert.ToBase64String(derBytes, Base64FormattingOptions.InsertLineBreaks); string pemContent = $"-----BEGIN RSA PRIVATE KEY-----\n{base64Str}\n-----END RSA PRIVATE KEY-----\n"; await File.WriteAllTextAsync(outputPath, pemContent);
注意:以上实现完全依赖.NET运行时内置加密能力,无需安装额外依赖,生成的PEM文件和
openssl genrsa -out keypair.pem 2048命令的输出完全一致,可直接通用。
你原代码中通过导出RSAParameters手动转字节流的思路需要自行实现ASN.1格式序列化,逻辑复杂易出错,不推荐使用。
内容的提问来源于stack exchange,提问作者innopal
相关产品推荐
相关产品推荐

