C#怎么实现RSA非对称加密 C#如何用RSA算法进行公钥加密私钥解密和数字签名【安全】

张开发
2026/4/11 7:44:04 15 分钟阅读

分享文章

C#怎么实现RSA非对称加密 C#如何用RSA算法进行公钥加密私钥解密和数字签名【安全】
应使用 RSA.Create() 创建 RSA 实例避免过时的 RSACryptoServiceProvider密钥导出用 ExportPkcs8PrivateKey/ExportSubjectPublicKeyInfo加密须用 OAEP-SHA256 且校验明文长度签名用 SignData/VerifyData 并指定 SHA256 和 PKCS1私钥严禁明文存储。用 RSA.Create() 创建实例别碰过时的 RSACryptoServiceProvider新版 .NET.NET Core 2.0 / .NET 5里 RSACryptoServiceProvider 已标记为过时它依赖 Windows CryptoAPI跨平台不兼容且默认密钥大小受限比如老版本只支持最多 16384 位但实际常卡在 4096。直接用 RSA.Create() 是唯一推荐路径——它自动适配当前运行时的最优实现Windows 上走 CNGLinux/macOS 走 OpenSSL。常见错误硬编码 new RSACryptoServiceProvider(2048)跑在 Linux 容器里直接抛 PlatformNotSupportedException。RSA.Create(2048) 创建新密钥对需要持久化时调用 ExportPkcs8PrivateKey()私钥或 ExportSubjectPublicKeyInfo()公钥二进制字节流不是 PEM 字符串如果必须读 PEM 格式如 OpenSSL 生成的 id_rsa.pub得先用第三方库如 BouncyCastle转.NET 原生不解析 PEM 封装密钥长度选 2048 足够多数场景3072 更稳妥4096 增加开销加密/解密耗时明显上升尤其服务端高频解密时公钥加密必须用 Encrypt() OAEP SHA256别用 PKCS1PKCS1 填充模式已被证明存在 Bleichenbacher 攻击风险.NET 默认仍保留但它不该出现在新代码里。OAEP 是唯一安全选择且必须显式指定哈希算法——new RSAEncryptionPadding.OaepSHA256()不能只写 RSAEncryptionPadding.Oaep会默认用 SHA1而 SHA1 已不安全。典型翻车现场传入 Encoding.UTF8.GetBytes(hello) 直接加密结果解密失败——RSA 对明文长度敏感2048 位密钥下 OAEP-SHA256 最多只能加密 190 字节左右数据。超长内容得先用 AES 加密再用 RSA 加密 AES 密钥即混合加密。加密前务必检查明文长度rsa.KeySize / 8 - 42OAEP-SHA256或 rsa.KeySize / 8 - 11PKCS1不推荐公钥加密仅适合小数据如会话密钥、token ID绝不要拿来加密用户上传的 PDF 或 JSON解密方必须用同一私钥 同样填充方式否则抛 CryptographicException“The parameter is incorrect.”签名用 SignData()验签用 VerifyData()别混淆加密和签名接口RSA 签名不是“用私钥加密”而是基于摘要的数学运算。SignData() 内部自动做哈希如 SHA256再签名VerifyData() 自动复现同样哈希过程。手动先哈希再调 SignHash() 容易出错且失去 .NET 对哈希算法绑定的保护。 Tellers AI Tellers是一款自动视频编辑工具可以将文本、文章或故事转换为视频。

更多文章