我有一个在OpenSSL中创建的pem文件。我需要使用私钥对一些十六进制数据进行签名。我认为我的所有功能都非常接近功能,但是我似乎无法从openssl返回的代码中获得类似的数据。
这是我尝试在C#中重现的功能
openssl dgst -sha256 -sign c:\openssl\privateKey.pem c:\openssl\msgtosign.bin > c:\openssl\msgsig.bin
privateKey.pem包含以下内容
-----BEGIN EC PARAMETERS-----
BggqhkjOPQMBAQ==
-----END EC PARAMETERS-----
-----BEGIN EC PRIVATE KEY-----
MF8CAQEEGETOBCEpn9vbZUN8k+LfLfo9zlLPovGL9KAKBggqhkjOPQMBAaE0AzIA
BB/Kr/mLSNrJnONbc5EADZHTVLTesmlyLmGgLUaliztkVrma88eE3Jsg3EiZMq7S
+A==
-----END EC PRIVATE KEY-----
msgtosign.bin包含以下十六进制数据
04 9E 00 32 F9 45 84 01 54 52 49 31 02 00 10 20 00 00 00 07 65 43 21 00 00 00 00 00 00 00 00 00 00 00 10
OpenSSL响应的信息与此类似:
30 36 02 19 00 AC 88 C8 D3 BC C9 C5 21 FE D1 A1 10 B7 4E F0 87 0A 1B 11 83 CA 8F 67 09 02 19 00 B5 62 E4 24 79 BB 42 CA AC 8D 94 4D F2 19 1A 2D 5F 8D BC D9 F7 7B CD 09
我当前使用的代码会产生此输出
B8 04 BB 27 5A 68 37 6D 9D BA 34 64 79 84 FE 4A 9C 86 2A 46 33 A1 26 56 B9 39 7E 07 2B F9 26 A6 A6 15 AE A5 96 2D 49 35 E0 8D 0D 92 8F FE 01 50
通过此代码
var pem = "MF8CAQEEGETOBCEpn9vbZUN8k+LfLfo9zlLPovGL9KAKBggqhkjOPQMBAaE0AzIABB/Kr/mLSNrJnONbc5EADZHTVLTesmlyLmGgLUaliztkVrma88eE3Jsg3EiZMq7S+A==";
var derArray = Convert.FromBase64String(pem);
var ecdsa = ECDsa.Create(ECCurve.CreateFromOid(new Oid("1.2.840.10045.3.1.1")));
ecdsa.ImportECPrivateKey(derArray, out _);
var signedData = ecdsa.SignData(File.ReadAllBytes(@"C:\OpenSSL\msgtosign.bin"), HashAlgorithmName.SHA256);