当前位置: 首页 > 知识库问答 >
问题:

使用SHA-256无参数的RSASSA-PSS。Net 4.5支持

范哲
2023-03-14

我正在尝试使用这个系统。安全为了创建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;
        }
    }

但是,我不知道是否支持“使用SHA-256的无参数RSASSA-PSS”。Net 4.5以及如何设置其签名定义。

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

共有1个答案

邴子实
2023-03-14

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

这里有一个实现,您所要做的就是调用RsaSsaPss。寄存器Sha256RsaMgf1()一次,例如从客户端中的静态构造函数。然后,SignedXml。CheckSignature()SignedXml。ComputeSignature()自动适用于指定此算法的任何XML签名。

在核心2.1和框架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);
            }
        }
    }
}
 类似资料:
  • 我想分两步使用RSA/PSS签名制作SHA256,首先散列一条消息,然后使用RSASSA-PSS签名摘要 但我使用SHA256时RSA/PSS无法验证 我需要一些帮助,谢谢你的帮助。

  • 我不确定我是应该在这里问这个问题,还是在安全交换中问这个问题。 无论如何,我最近正在使用TPM处理RSA签名,遇到了一个问题,我将填充方案从RSASSA-PKCS1-v1_5切换到RSASSA-PSS。我认为这应该不会有什么不同,但我注意到一个例子在TSS. MSR(。NET TPM库)不再起作用。我在https://github.com/microsoft/TSS.MSR/issues/109.

  • 有人知道RSACryptoServiceProvider使用哪种签名算法吗。签名杂凑?我相信它是RSAPKCS1,它还安全吗? 有没有人想过将RSASSA-PSS配置为RSACryptServiceProvider的签名算法,而不使用像BouncyCastle这样的第三方库? 提前谢谢。

  • 我已经把它归结为我能做的最简单的测试用例。我需要获取Python中生成的RSASSA-PSS签名,并在Go中验证它们。创建RSA密钥对并用其签名的Python代码如下: 那里引用的pycrypto_keys库可以在这里找到,用于参考函数和的具体实现。 我的Go测试由两个简单的文件组成,这些文件只依赖于核心包。首先是验证功能,verify.go: 第二,一个测试用例。密钥对和签名是使用顶部的Pyth

  • 首先,我对加密/签名还是新手,所以请容忍任何滥用术语的行为。 我需要在C#中创建一个签名,该签名将被Python库验证。在Python中,解码/验证签名只需一段简单的代码: 我当前的C#代码如下所示: 但是,签名在Python代码中未通过验证检查。它看起来像PSS填充。Net库默认使用MGF1。然而,我相信我有问题,因为掩码生成函数(MGF1)在Python代码中使用256位哈希,但在C#中默认为

  • 我试图在python2.7中找到RSASSA-PSS-2048-SHA256数字签名算法。 目前我的代码如下: 但是当我们尝试验证生成的签名时,出现了签名不匹配错误。 在Java中,代码如下所示: 我不知道上面的python签名代码有什么问题。或者如何在python2中使用算法。7. 非常感谢。