C# ECDsaCng.SignData 在 OpenSSL 中使用签名?
C# ECDsaCng.SignData use signature in OpenSSL?
我需要知道什么编码
https://msdn.microsoft.com/en-us/library/bb347054(v=vs.110).aspx
ECDsaCng.SignData Method (Byte[])
默认使用它的字节数组以及如何将其转换为
接受的 DER 格式
https://www.openssl.org/docs/manmaster/crypto/i2d_ECDSA_SIG.html
这样我就可以使用方法 ECDSA_do_verify
.
在 OpenSSL 中验证我的 C# 生成的 ECDSA 签名
我知道它的 SHA1 并且我知道如何加载该摘要,我只是不知道 ECDsaCng.SignData
方法的字节编码是什么,也不知道如何将它转换为 DER 格式,如果我什至需要这样做。
ECDSA 签名是值对 (r, s)
。
Windows CNG 将此作为两个值的串联发出,并且由于 .NET 不会重新解释数据,因此这是事实上的 .NET 格式。 (r
是数组的前半部分,s
是后半部分)
OpenSSL 需要 SEQUENCE(INTEGER(r), INTEGER(s)) 的 DER 编码结构。这大致意味着 { 0x30, payload_length, 0x02, r_length, r_bytes[0]...r_bytes[r_length-1], 0x02, s_length, s_bytes[0]...s_bytes[s_length-1] }
;尽管它比这稍微复杂一些,因为当 r_bytes[0] 或 s_bytes[0] >= 0x80 时需要填充字节(因为这会使它显示为负数)。
不幸的是,默认情况下框架中没有公开通用 DER 编码器。
如果您尝试在 Linux 上 运行,使用 .NET Core 可能会更好,因为 Linux already does 的 ECDSA 实现数据翻译。
这里是TLSSigAPI.cs用.Net生成符号并用OpenSSL验证的代码。
也许能帮到你。
byte[] rawDataHash = SHA256(rawData);
byte[] rawSig = ecdsa.SignHash(rawDataHash);
int halfLength = rawSig.Length / 2;
byte[][] rEncoded = SegmentedEncodeUnsignedInteger(rawSig, 0, halfLength);
byte[][] sEncoded = SegmentedEncodeUnsignedInteger(rawSig, halfLength, halfLength);
List<byte[][]> items = new List<byte[][]>() { rEncoded, sEncoded };
byte[] opensslSig = ConstructSequence(items);
我需要知道什么编码
https://msdn.microsoft.com/en-us/library/bb347054(v=vs.110).aspx
ECDsaCng.SignData Method (Byte[])
默认使用它的字节数组以及如何将其转换为
接受的 DER 格式https://www.openssl.org/docs/manmaster/crypto/i2d_ECDSA_SIG.html
这样我就可以使用方法 ECDSA_do_verify
.
我知道它的 SHA1 并且我知道如何加载该摘要,我只是不知道 ECDsaCng.SignData
方法的字节编码是什么,也不知道如何将它转换为 DER 格式,如果我什至需要这样做。
ECDSA 签名是值对 (r, s)
。
Windows CNG 将此作为两个值的串联发出,并且由于 .NET 不会重新解释数据,因此这是事实上的 .NET 格式。 (r
是数组的前半部分,s
是后半部分)
OpenSSL 需要 SEQUENCE(INTEGER(r), INTEGER(s)) 的 DER 编码结构。这大致意味着 { 0x30, payload_length, 0x02, r_length, r_bytes[0]...r_bytes[r_length-1], 0x02, s_length, s_bytes[0]...s_bytes[s_length-1] }
;尽管它比这稍微复杂一些,因为当 r_bytes[0] 或 s_bytes[0] >= 0x80 时需要填充字节(因为这会使它显示为负数)。
不幸的是,默认情况下框架中没有公开通用 DER 编码器。
如果您尝试在 Linux 上 运行,使用 .NET Core 可能会更好,因为 Linux already does 的 ECDSA 实现数据翻译。
这里是TLSSigAPI.cs用.Net生成符号并用OpenSSL验证的代码。
也许能帮到你。
byte[] rawDataHash = SHA256(rawData);
byte[] rawSig = ecdsa.SignHash(rawDataHash);
int halfLength = rawSig.Length / 2;
byte[][] rEncoded = SegmentedEncodeUnsignedInteger(rawSig, 0, halfLength);
byte[][] sEncoded = SegmentedEncodeUnsignedInteger(rawSig, halfLength, halfLength);
List<byte[][]> items = new List<byte[][]>() { rEncoded, sEncoded };
byte[] opensslSig = ConstructSequence(items);