- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在尝试使用 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
显示的错误很明确“无法为提供的签名算法创建 SignatureDescription。”
对于“RSA PKCS#1 v1.5 和 SHA-256”,我添加了以下公共(public)类作为其签名:
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 是否支持“不带参数的 RSASSA-PSS 使用 SHA-256”,如果支持,如何设置其签名定义。
如果哪位有类似经验的可以提供帮助,我将不胜感激。
最佳答案
我终于明白了。诀窍是注册 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);
}
}
}
}
关于c# - 不带参数的 RSASSA-PSS 使用 SHA-256 .Net 4.5 支持,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22658526/
谁能告诉我如何在 Java 中为 RSASSA-PKCS1-v1.5 生成签名? 实际上,我想知道如何使用 java.security.Signature 类。 我必须使用任何第三方库吗? 最佳答案
有谁知道RSACryptoServiceProvider.SignHash用的是什么签名算法? ?我相信它是 RSAPKCS1,它仍然安全吗? 有没有人想过在不使用 BouncyCaSTLe 等第三方
我正在尝试插入并实现以下语句。 Digitally sign the payload with Private Key using RSASSA-PKCS1-V1_5 signature scheme
我正在尝试使用 PKCS#11 使用 JarSigner 对 JAR 文件进行 RSA-PSS 签名。 JarSigner 使用 sigalg 标志来指定签名算法。 JDK 14 Docs of th
我正在研究 PKSC1V2.2 RSASSA-PSS 签名方案。我得到了一些用于最终结果测试的标准测试 vector ,但我的结果不匹配。要检查我的代码哪里出了问题,我需要一些具有中间结果的测试 ve
我需要使用带有 EMSA-PSS 编码的 RSASSA-PSS 对数据进行签名。openssl 不支持此算法。可以告诉我是否有任何其他开源库可用于执行此操作......? 最佳答案 Crypto++提
我已将其归结为最简单的测试用例。我需要采用在 Python 中生成的 RSASSA-PSS 签名并在 Go 中验证它们。创建 RSA key 对并用它签名的 Python 代码如下: >>> from
我需要使用 SHA256 HASH 函数和带有 RSA EMSA-PSS 编码的 RSASSA-PSS 创建数据字符串的签名。openssl 支持这个吗? 我正在使用 API 创建签名 int RSA
我正在开发一个移动应用程序,它必须验证它收到的一些签名。我拥有我需要的一切——输入数据、公钥和签名。但有一个问题。我使用方法 SHA256withRSA 进行签名验证,其中包含以下几行代码来验证签名:
我正在尝试使用 System.Security.Cryptography(目标框架 .NET 4.5)创建 xml 数字签名,到目前为止,我设法使用以下方案创建和验证签名:RSA PKCS#1 v1.
我想分 2 个步骤使用 SHA256withRSA/PSS 签名,首先我散列一条消息,然后用 RSASSA-PSS 签署摘要 byte[] document = {0, 1, 2, 3,
在这个库上花费了无数个小时之后,我仍然无法让它工作。 我想用 bouncy caSTLe 库发送 smime 消息,用 RSASSA-PSS 签名,用 AES 加密,其中 key 传输应该是 RSAE
我是一名优秀的程序员,十分优秀!