C# UWP-ECDSP签名

C# UWP-ECDSP签名,c#,cryptography,uwp,ecdsa,C#,Cryptography,Uwp,Ecdsa,我想用以下代码制作ECDSA签名: AsymmetricKeyAlgorithmProvider objAsymmAlgProv = AsymmetricKeyAlgorithmProvider.OpenAlgorithm(AsymmetricAlgorithmNames.EcdsaSha256); CryptographicKey keypair = objAsymmAlgProv.CreateKeyPairWithCurveName(EccCurveNames.SecP256r1); Bin

我想用以下代码制作ECDSA签名:

AsymmetricKeyAlgorithmProvider objAsymmAlgProv = AsymmetricKeyAlgorithmProvider.OpenAlgorithm(AsymmetricAlgorithmNames.EcdsaSha256);
CryptographicKey keypair = objAsymmAlgProv.CreateKeyPairWithCurveName(EccCurveNames.SecP256r1);
BinaryStringEncoding encoding = BinaryStringEncoding.Utf8;
buffMsg = CryptographicBuffer.ConvertStringToBinary("Test Message", encoding);
IBuffer buffSIG = CryptographicEngine.Sign(keypair, buffMsg);
byte [] SignByteArray = buffSIG.ToArray();
bool res = CryptographicEngine.VerifySignature(keypair, buffMsg, buffSIG);
VerifySignature
始终返回true,这是正常的

但是我在签名方面有一些问题

为什么签名长度(
SignByteArray
)是固定的?(0x40字节)

为什么
SignByteArray[0]
SignByteArray[2]
的值不正确?(我认为应该是0x30和0x02)


我期待着类似于ECDSA规范的事情,ECDSA规范最终确定这对(
r
s
)是签名。它忽略的是指出应该如何写下它们

Windows和.NET使用IEEE(p)1363格式,即big-endian
r
concat big-endian
s
r
s
具有相同的大小(由密钥大小决定),因此签名的长度始终为偶数,r是前半部分

OpenSSL使用ASN.1/DER编码,即序列(整数(r),整数(s))。DER编码可以一直到6个字节(
30 04 02 00 02 00
,在退化的r=0,s=0中),并且平均比IEEE形式大6个字节。它编码为
30[length,一个或多个字节]02[length,一个或多个字节][可选填充00][big-endian r不带前导00s]02[length,一个或多个字节][可选填充00][big-endian s不带前导00s]

DER表单过于依赖于数据,无法具体描述,因此举个例子应该会有所帮助。假设我们在32位字段中使用曲线并生成(r=1016,s=2289644760)

IEEE 1363:

// r
00 00 03 F8
// s
88 79 34 D8
德:

因此Windows/.NET发出
00 00 03 F8 88 79 34 D8
,而OpenSSL发出
30 0B 02 03 F8 02 05 00 88 79 34 D8
。但他们都只是说
(r,s)=(10162289644760)


(旁白:你的意见是签名[2]DER编码中的==0x02对于您正在使用的大小键是正确的,但是在496位左右的键上,序列长度在统计上可能需要超过一个字节;因此对于P-521键,它最有可能以
03 81 88 02
开始,并且
88
字节中存在变化)

ECDSA规范最后确定该对(
r
s
)为签名。它忽略的是指出应该如何写下它们

Windows和.NET使用IEEE(p)1363格式,即big-endian
r
concat big-endian
s
r
s
具有相同的大小(由密钥大小决定),因此签名的长度始终为偶数,r是前半部分

OpenSSL使用ASN.1/DER编码,即序列(整数(r),整数(s))。DER编码可以一直到6个字节(
30 04 02 00 02 00
,在退化的r=0,s=0中),并且平均比IEEE形式大6个字节。它编码为
30[length,一个或多个字节]02[length,一个或多个字节][可选填充00][big-endian r不带前导00s]02[length,一个或多个字节][可选填充00][big-endian s不带前导00s]

DER表单过于依赖于数据,无法具体描述,因此举个例子应该会有所帮助。假设我们在32位字段中使用曲线并生成(r=1016,s=2289644760)

IEEE 1363:

// r
00 00 03 F8
// s
88 79 34 D8
德:

因此Windows/.NET发出
00 00 03 F8 88 79 34 D8
,而OpenSSL发出
30 0B 02 03 F8 02 05 00 88 79 34 D8
。但他们都只是说
(r,s)=(10162289644760)


(旁白:你的意见是签名[2]DER编码中的==0x02对于您正在使用的大小键是正确的,但是在496位左右的键上,序列长度在统计上可能需要超过一个字节;因此对于P-521键,它最有可能以
03 81 88 02
开始,并且
88
字节中存在变化)

这正是我想要的!谢谢!这正是我要找的!谢谢!