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
以便我可以使用方法CCD_ 1在OpenSSL中验证我的C#生成的ECDSA签名。
我知道它的SHA1,我知道如何加载摘要,我只是不知道ECDsaCng.SignData
方法的字节编码是什么,也不知道如何将其转换为DER格式,如果我需要的话。
ECDSA签名是值对(r, s)
。
Windows CNG将其作为两个值的串联发出,由于.NET不会重新解释数据,因此这是事实上的.NET格式。(r
是阵列的前半部分,s
是后半部分)
OpenSSL需要一个DER编码的SEQUENCE结构(整数(r),整数(s))。这大致意味着{ 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的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);
- Openssl 1.1.1d无效使用不完整的类型"struct dsa_st"
- 如何在openssl-ecc中获取十六进制格式的私钥
- LINK 尝试使用 OpenSSL evp aes 256 c++ 时出错
- 如何在OpenSSL中从configuration.h.in获取configuration.h
- OpenSSL TLS服务器-使用客户端证书白名单
- 通过 Openssl 命令行加密,通过 c++ 解密
- 使用已使用 java 编码的 openssl 解码数据
- OpenSSL没有共享密码
- OpenSSL 解密功能无法正常工作
- OpenSSL BIO and SSL_read
- 如何在OpenSSL库的名称中添加后缀'd'?
- 避免碎片化的ClientHellos with OpenSSL (DTLS)
- Boost.Asio/OpenSSL HTTPS GET certificate trouble
- 使用 OpenSSL 从内存中读取原始 SSL/TLS 证书
- 验证openssl c++中的签名,这是由JAVA DSA签名的?
- OpenSSL: EC_POINT_set_compressed_coordinates_GFp segfault
- 在 C/C++ 中加载 OpenSSL 自定义引擎
- 我的应用程序无法在安卓上使用OpenSSL进行链接
- OpenSSL fips in C++ wrapper Library 如何?错误:指纹不匹配
- C#ECDsaCng.SignData在OpenSSL中使用签名