Благодаря Загружая закрытый ключ ECC в .NET , я могу загрузить закрытые ключи ECC в .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.CryptographicException : ASN1 corrupted data
внутри System.Security.Cryptography.EccKeyFormatHelper.FromECPrivateKey(ReadOnlyMemory`1 keyData, AlgorithmIdentifierAsn& algId, ECParameters& ret)
Исходный файл 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 может понимать один формат, а не другой?