感谢在.NET中加载ECC私钥,我能够将ECC私钥加载到.NET Core 3中并使用它们执行签名任务。
然而,我遇到了一个密钥,无法被
导入失败的私钥代码(这是实际失败的密钥):
使用这种PEM文件格式,.NET Core 3可以导入私钥。
我的问题是:发生了什么事情?为什么openssl会将私钥更改为另一种格式(我如何知道哪种格式是哪种格式?),为什么.NET Core 3可以理解一种格式而不理解另一种格式?
然而,我遇到了一个密钥,无法被
ECDSA.ImportPrivateKey
加载。奇怪的是,用openssl
查看它会改变密钥字节,让.NET Core 3能够理解。导入失败的私钥代码(这是实际失败的密钥):
ecdsa = ECDsa.Create();
var pem = "MHYCAQEEH5t2Xlmsw5uqw3W9+/3nosFi6i3V901uW6ZzUpvVM0qgCgYIKoZIzj0DAQehRANCAASck2UuMxfyDYBdJC0mHNeToqMBhJuMZYSgkUNbK/xzD7e3cwr5okPx0pZdSMfDmyi1dBujtIIxFK9va1bdVAR9";
var derArray = Convert.FromBase64String(pem);
ecdsa.ImportECPrivateKey(derArray, out _);
使用ImportECPrivateKey
调用时,在System.Security.Cryptography.EccKeyFormatHelper.FromECPrivateKey(ReadOnlyMemory`1 keyData, AlgorithmIdentifierAsn& algId, ECParameters& ret)
内出现System.Security.Cryptography.CryptographicException : ASN1 corrupted data
错误。
原始PEM文件如下:
$ cat private_key_cert_265.pem
-----BEGIN EC PRIVATE KEY-----
MHYCAQEEH5t2Xlmsw5uqw3W9+/3nosFi6i3V901uW6ZzUpvVM0qgCgYIKoZIzj0D
AQehRANCAASck2UuMxfyDYBdJC0mHNeToqMBhJuMZYSgkUNbK/xzD7e3cwr5okPx
0pZdSMfDmyi1dBujtIIxFK9va1bdVAR9
-----END EC PRIVATE KEY-----
OpenSSL将私钥转换为其他格式:
$ openssl ec -in private_key_cert_265.pem
read EC key
writing EC key
-----BEGIN EC PRIVATE KEY-----
MHcCAQEEIACbdl5ZrMObqsN1vfv956LBYuot1fdNblumc1Kb1TNKoAoGCCqGSM49
AwEHoUQDQgAEnJNlLjMX8g2AXSQtJhzXk6KjAYSbjGWEoJFDWyv8cw+3t3MK+aJD
8dKWXUjHw5sotXQbo7SCMRSvb2tW3VQEfQ==
-----END EC PRIVATE KEY-----
使用这种PEM文件格式,.NET Core 3可以导入私钥。
我的问题是:发生了什么事情?为什么openssl会将私钥更改为另一种格式(我如何知道哪种格式是哪种格式?),为什么.NET Core 3可以理解一种格式而不理解另一种格式?
var derArray = Convert.FromBase64String(pem);
将密钥转换为DER字节数组。 - RasmusW