C# UWP-ECDSP签名
我想用以下代码制作ECDSA签名: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
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-endianr
concat big-endians
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-endianr
concat big-endians
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
字节中存在变化)这正是我想要的!谢谢!这正是我要找的!谢谢!