使用RSACryptoServiceProvider进行RSA3072_RSASSA-PSS签名报错
解决RSA RSASSA-PSS签名报错问题
问题原因
RSACryptoServiceProvider是基于传统Windows CryptoAPI的实现,不支持RSASSA-PSS签名填充模式,仅兼容PKCS#1 v1.5填充,这就是调用SignData传入RSASignaturePadding.Pss时抛出异常的核心原因。
解决方案
改用.NET官方推荐的RSA基类(.NET Framework 4.6+、.NET Core/.NET 5+均支持),它原生支持RSASSA-PSS签名方案。
1. 修改密钥生成代码
替换RSACryptoServiceProvider为RSA.Create,生成的密钥XML格式与原代码完全兼容,无需调整存储逻辑:
void GenerateKeys() { using (var rsa = RSA.Create(3072)) { // 获取私钥和公钥 var publicKey = rsa.ToXmlString(false); var privateKey = rsa.ToXmlString(true); // 保存到磁盘(路径按需调整) string savePath = @"C:\Users\pkean\source\repos\ConsoleApp1\ConsoleApp1"; File.WriteAllText(Path.Combine(savePath, "publickey.xml"), publicKey); File.WriteAllText(Path.Combine(savePath, "privateKey.xml"), privateKey); } }
2. 修改签名代码
同样使用RSA类加载密钥,调用支持PSS填充的SignData重载完成签名:
byte[] content = new byte[2] { 0x12, 0x34 }; string readoutprivateXmlKey; string keyPath = @"C:\Users\pkean\source\repos\ConsoleApp1\ConsoleApp1"; readoutprivateXmlKey = File.ReadAllText(Path.Combine(keyPath, "privateKey.xml")); var signature = SignData(readoutprivateXmlKey, content); byte[] SignData(string privatekey, byte[] data) { using (var rsa = RSA.Create()) { rsa.FromXmlString(privatekey); // 使用RSASSA-PSS(SHA256哈希 + PSS填充)签名 return rsa.SignData( data, HashAlgorithmName.SHA256, RSASignaturePadding.Pss ); } }
补充说明
- 若需验证PSS签名,验证代码同样要使用
RSA类,调用VerifyData并传入RSASignaturePadding.Pss参数。 - 原代码中
byteSignusehash对应的sha256hash变量未定义,若需直接对哈希值签名,需先计算数据的SHA256哈希:byte[] sha256hash = SHA256.HashData(data); byte[] byteSignusehash = rsa.SignHash( sha256hash, HashAlgorithmName.SHA256, RSASignaturePadding.Pss );
内容的提问来源于stack exchange,提问作者i'm pk
相关产品推荐
相关产品推荐

