从ECDSA签名signedxml c#中提取r和s



我使用。net 5中的Signedxml类使用ECDSA生成签名我需要r和s的值但是我不能提取它,另一个问题是签名长度。我的签名总是64字节,但ECDSA签名长度是71我不知道为什么这个长度会改变。请帮我提取r和s

在将ECDSA签名从ASN.1/DER转换为P1363 (r|s)格式时,必须考虑以下事项:

  • 在ASN.1/DER格式中,r和s包含为带符号的大端字节数组,在P1363格式中包含为无符号的大端字节数组。
  • 在ASN.1/DER格式中,r和s被包含为最小大小的数组,在P1363中,它们都被填充到它们的最大大小(生成器点的顺序长度),前导值为0x00。示例:对于NIST P-256, r和s的最大大小为32字节。

可能在。net 5+中使用AsnReader类实现:

using System.Formats.Asn1;
...
public static byte[] DERtoP1363(byte[] derSignature, int maxSize)
{
AsnReader sequence = new AsnReader(derSignature, AsnEncodingRules.DER).ReadSequence();
byte[] rBytes = sequence.ReadInteger().ToByteArray(true, true); // convert to unsigned, big endian
byte[] sBytes = sequence.ReadInteger().ToByteArray(true, true); // convert to unsigned, big endian
byte[] rsBytes = new byte[2 * maxSize];
Buffer.BlockCopy(rBytes, 0, rsBytes, maxSize - rBytes.Length, rBytes.Length);     // resize to maximum size
Buffer.BlockCopy(sBytes, 0, rsBytes, 2 * maxSize - sBytes.Length, sBytes.Length); // resize to maximum size
return rsBytes;
}

AsnReader从。net 5开始可用。

为了完整性:在其他。net版本中可以应用BouncyCastle(使用Org.BouncyCastle.Asn1命名空间中的类)。为此,DERtoP1363()中的前三行必须替换为:

Asn1Sequence sequence = Asn1Sequence.GetInstance(derSignature);
byte[] rBytes = DerInteger.GetInstance(sequence[0]).PositiveValue.ToByteArrayUnsigned();
byte[] sBytes = DerInteger.GetInstance(sequence[1]).PositiveValue.ToByteArrayUnsigned();

最新更新