C#怎么实现RSA公钥加密私钥解密_C#如何配置密钥参数【安全】

张开发
2026/4/7 11:30:46 15 分钟阅读

分享文章

C#怎么实现RSA公钥加密私钥解密_C#如何配置密钥参数【安全】
RSA.Create()生成的密钥跨平台解密失败因.NET默认用Windows CNG格式需导出公钥用ExportSubjectPublicKeyInfo()、私钥用ExportPkcs8PrivateKey()并确保Java/Python端填充方式一致。为什么 RSA.Create() 生成的密钥不能直接用于跨平台解密因为 .NET 默认用的是 Windows CNGCryptography Next Generation密钥格式私钥导出为 RSACryptoServiceProvider 兼容的 XML 或 PKCS#8 都得手动处理——否则 Java/Python 拿到私钥也解不开你用 RSA.Encrypt() 加的密。实操建议加密端统一用 RSA.Create(2048) 实例调用 Encrypt(data, RSAEncryptionPadding.Pkcs1)导出公钥必须用 ExportSubjectPublicKeyInfo()X.509 SPKI 格式不是 ExportParameters(false)导出私钥要用 ExportPkcs8PrivateKey()带密码保护可选别用已废弃的 ToXmlString(false)如果对方是 Java注意 .NET 导出的 PKCS#8 私钥默认含 OID 1.2.840.113549.1.1.1Java PKCS8EncodedKeySpec 能认但某些老版本 BouncyCastle 可能要求去掉 ASN.1 封装头得用 AsnEncodedData 手动剥离RSA.ImportFromPem() 在 .NET 6 怎么安全加载 PEM 密钥这个方法只在 .NET 6 及以上可用且不支持密码保护的 PEM即 -----BEGIN ENCRYPTED PRIVATE KEY-----。一旦你传入带密码的 PEM会直接抛 CryptographicException错误信息是 The specified password is incorrect. 或更模糊的 Invalid key blob.。实操建议公钥 PEM确认以 -----BEGIN PUBLIC KEY----- 开头直接用 RSA.ImportFromPem(pemBytes)私钥 PEM必须是无密码的 -----BEGIN PRIVATE KEY-----PKCS#8不能是 -----BEGIN RSA PRIVATE KEY-----PKCS#1后者需先转格式例如用 OpenSSLopenssl pkcs8 -topk8 -inform PEM -outform PEM -in key.pem -out key-pkcs8.pem -nocrypt导入后务必校验调用 rsa.KeySize 看是否匹配预期如 2048再用 rsa.ExportParameters(false).Exponent 确认公钥指数是 65537用 RSASignaturePadding.Pkcs1 做签名时为什么解密端验签失败这不是“解密”是验签VerifyData但很多人误以为和加解密流程对称。问题常出在填充方式不一致C# 默认签名用 PKCS#1 v1.5但 Java 的 Signature.getInstance(SHA256withRSA) 对应相同填充而 Python 的 cryptography.hazmat.primitives.asymmetric.padding.PKCS1v15() 必须显式指定——漏写就默认用 PSS导致验签必错。 HIX.AI HIX.AI是一个多功能的一体化AI写作助手集成了120多种AI写作工具支持50多种语言能够满足各种写作需求。

更多文章