【问题标题】:RSASSA-PSS without parameters using SHA-256 .Net 4.5 support不带参数的 RSASSA-PSS 使用 SHA-256 .Net 4.5 支持
【发布时间】:2014-03-26 10:44:19
【问题描述】:

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

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

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

对于“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”,如果支持,如何设置其签名定义。

如果有人有类似的经历并能提供一些帮助,我将非常感激。

【问题讨论】:

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


    【解决方案1】:

    我终于明白了。诀窍是注册 XML 签名指定的算法,在我的例子中是“http://www.w3.org/2007/05/xmldsig-more#sha256-rsa-MGF1”。将其注册到自定义类,该类使用自定义签名格式化程序和去格式化程序,适用RSASignaturePadding.Pss

    这是一个实现,您只需调用一次RsaSsaPss.RegisterSha256RsaMgf1(),例如从客户端中的静态构造函数调用。然后,SignedXml.CheckSignature()SignedXml.ComputeSignature() 自动适用于任何指定此算法的 XML 签名。

    在 Core 2.1 和 Framework 4.7.1 上测试:

    /// <summary>
    /// Contains classes for using RSA-SSA-PSS, as well as methods for registering them.
    /// Registering such types adds support for them to SignedXml.
    /// </summary>
    public class RsaSsaPss
    {
        /// <summary>
        /// Registers an implementation for "http://www.w3.org/2007/05/xmldsig-more#sha256-rsa-MGF1".
        /// </summary>
        public static void RegisterSha256RsaMgf1()
        {
            CryptoConfig.AddAlgorithm(typeof(RsaPssSha256SignatureDescription), "http://www.w3.org/2007/05/xmldsig-more#sha256-rsa-MGF1");
        }
    
        // Can add further registrations here...
    
        public class RsaPssSha256SignatureDescription : SignatureDescription
        {
            public RsaPssSha256SignatureDescription()
            {
                using (var rsa = RSA.Create())
                {
                    this.KeyAlgorithm = rsa.GetType().AssemblyQualifiedName; // Does not like a simple algorithm name, but wants a type name (AssembyQualifiedName in Core)
                }
                this.DigestAlgorithm = "SHA256"; // Somehow wants a simple algorithm name
                this.FormatterAlgorithm = typeof(RsaPssSignatureFormatter).FullName;
                this.DeformatterAlgorithm = typeof(RsaPssSignatureDeformatter).FullName;
            }
    
            public override AsymmetricSignatureFormatter CreateFormatter(AsymmetricAlgorithm key)
            {
                var signatureFormatter = new RsaPssSignatureFormatter();
                signatureFormatter.SetKey(key);
                signatureFormatter.SetHashAlgorithm(this.DigestAlgorithm);
                return signatureFormatter;
            }
    
            public override AsymmetricSignatureDeformatter CreateDeformatter(AsymmetricAlgorithm key)
            {
                var signatureDeformatter = new RsaPssSignatureDeformatter();
                signatureDeformatter.SetKey(key);
                signatureDeformatter.SetHashAlgorithm(this.DigestAlgorithm);
                return signatureDeformatter;
            }
    
            public class RsaPssSignatureFormatter : AsymmetricSignatureFormatter
            {
                private RSA Key { get; set; }
                private string HashAlgorithmName { get; set; }
    
                public override void SetKey(AsymmetricAlgorithm key)
                {
                    this.Key = (RSA)key;
                }
    
                public override void SetHashAlgorithm(string strName)
                {
                    // Verify the name
                    Oid.FromFriendlyName(strName, OidGroup.HashAlgorithm);
    
                    this.HashAlgorithmName = strName;
                }
    
                public override byte[] CreateSignature(byte[] rgbHash)
                {
                    return this.Key.SignHash(rgbHash, new HashAlgorithmName(this.HashAlgorithmName), RSASignaturePadding.Pss);
                }
            }
    
            public class RsaPssSignatureDeformatter : AsymmetricSignatureDeformatter
            {
                private RSA Key { get; set; }
                private string HashAlgorithmName { get; set; }
    
                public override void SetKey(AsymmetricAlgorithm key)
                {
                    this.Key = (RSA)key;
                }
    
                public override void SetHashAlgorithm(string strName)
                {
                    // Verify the name
                    Oid.FromFriendlyName(strName, OidGroup.HashAlgorithm);
    
                    this.HashAlgorithmName = strName;
                }
    
                public override bool VerifySignature(byte[] rgbHash, byte[] rgbSignature)
                {
                    return this.Key.VerifyHash(rgbHash, rgbSignature, new HashAlgorithmName(this.HashAlgorithmName), RSASignaturePadding.Pss);
                }
            }
        }
    }
    

    【讨论】:

    • 我无法确认这一点,但感谢您的回答。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-08-07
    • 2021-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多