没有参数的RSASSA-PSS使用SHA-256 .Net 4.5支持

时间:2014-03-26 10:44:20

标签: c# .net digital-signature xml-signature signedxml

我正在尝试使用System.Security.Cryptography(目标框架.NET 4.5)来创建xml数字签名,到目前为止,我设法使用以下方案创建和验证签名: RSA PKCS#1 v1.5和SHA-256:http://www.w3.org/2001/04/xmldsig-more#rsa-sha256

但是,我无法使用以下方案:  '不带参数的RSASSA-PSS使用SHA-256'[RFC6931]:http://www.w3.org/2007/05/xmldsig-more#sha256-rsa-MGF1

显示的错误很明显“无法为提供的签名算法创建SignatureDescription。”

对于'RSA PKCS#1 v1.5和SHA-256',我添加了以下公共类作为其签名:

   public class RSAPKCS1SHA256SignatureDescription : SignatureDescription
   {
        public RSAPKCS1SHA256SignatureDescription()
        {
            base.KeyAlgorithm = "System.Security.Cryptography.RSACryptoServiceProvider";
            base.DigestAlgorithm = "System.Security.Cryptography.SHA256Managed";
            base.FormatterAlgorithm = "System.Security.Cryptography.RSAPKCS1SignatureFormatter";
            base.DeformatterAlgorithm = "System.Security.Cryptography.RSAPKCS1SignatureDeformatter";
        }

        public override AsymmetricSignatureDeformatter CreateDeformatter(AsymmetricAlgorithm key)
        {
            AsymmetricSignatureDeformatter asymmetricSignatureDeformatter = (AsymmetricSignatureDeformatter)
            CryptoConfig.CreateFromName(base.DeformatterAlgorithm);
            asymmetricSignatureDeformatter.SetKey(key);
            asymmetricSignatureDeformatter.SetHashAlgorithm("SHA256");
            return asymmetricSignatureDeformatter;
        }
    }

但是,我不知道.Net 4.5是否支持'使用SHA-256没有参数的RSASSA-PSS',如果是的话,如何设置其签名定义。

如果有人有相似的经验并能提供一些帮助,我会非常感激。

1 个答案:

答案 0 :(得分:1)

我终于明白了。诀窍是注册XML签名指定的算法,在我的情况下为“ http://www.w3.org/2007/05/xmldsig-more#sha256-rsa-MGF1”。将其注册到一个自定义类,该类使用适用于<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/css/bootstrap.min.css"> <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.0/jquery.min.js"></script> <div class="container"> <div class="views-exposed-widget"> <div tabindex="1" contenteditable id="editable-text-name" onfocusin="document.getElementById('save-button').style.visibility = 'visible'" onfocusout="setTimeout(function(){document.getElementById('save-button').style.visibility = 'hidden'}, 100)"> Editable text here. </div> </div> <div class="views-submit-button"> <button id="save-button" type="button" onclick="alert('button clicked.');this.style.visibility = 'hidden';" class="btn btn-outline-dark">Save</button> </div> </div>的自定义签名格式器和变形器。

这里是一个实现,您所要做的就是一次调用RSASignaturePadding.Pss,例如从客户端的静态构造函数中调用。然后,RsaSsaPss.RegisterSha256RsaMgf1()SignedXml.CheckSignature()自动为指定此算法的任何XML签名工作。

在Core 2.1和Framework 4.7.1上进行了测试:

SignedXml.ComputeSignature()