【问题标题】:How to initialize ECDiffieHellmanCngPublicKey from an X509 Certificate如何从 X509 证书初始化 ECDiffieHellmanCngPublicKey
【发布时间】:2016-03-09 01:31:27
【问题描述】:

我想从 X509 证书的公钥初始化 ECDiffieHellmanCngPublicKey(证书是使用 ECDH_P384 模板颁发的)。 这是我尝试过的:

var store = new X509Store(StoreName.My, StoreLocation.LocalMachine);
store.Open(OpenFlags.OpenExistingOnly);
var cert = store.Certificates.Find(X509FindType.FindByTemplateName, "ComputerECC", true)[0];
var keyType = new byte[] { 0x45, 0x43, 0x53, 0x33 };
var keyLength = new byte[] { 0x30, 0x00, 0x00, 0x00 };
var key = cert.PublicKey.EncodedKeyValue.RawData.Skip(1);
var keyImport = keyType.Concat(keyLength).Concat(key).ToArray();
var pubKey = ECDiffieHellmanCngPublicKey.FromByteArray(keyImport, CngKeyBlobFormat.EccPublicBlob);

最后一行抛出 System.Security.Cryptography.CryptographicException: "与 ECDiffieHellmanCng 算法一起使用的密钥必须有一个 ECDiffieHellman 算法组。

使用魔法值来解析密钥的想法来自这个question 我怀疑我的证书模板中缺少某些内容。

【问题讨论】:

  • 试过这个:私有静态 ECDiffieHellmanPublicKey ImportEccPublicKeyFromCertificate(X509Certificate2 cert) { var keyType = new byte[] { 0x45, 0x43, 0x53, 0x33 }; var keyLength = 新字节 [] { 0x30, 0x00, 0x00, 0x00 }; var key = cert.PublicKey.EncodedKeyValue.RawData.Skip(1); var keyImport = keyType.Concat(keyLength).Concat(key).ToArray();返回 ECDiffieHellmanCngPublicKey.FromByteArray(keyImport, CngKeyBlobFormat.EccPublicBlob); }

标签: c# cryptography


【解决方案1】:

模板没有问题。问题实际上在于密钥类型。

var keyType = new byte[] { 0x45, 0x43, 0x53, 0x33 };

应该是

var keyType = new byte[] { 0x45, 0x43, <strong>0x4B</strong>, 0x33 };

您提供的密钥类型是 ECDSA 公钥 (BCRYPT_ECDSA_PUBLIC_P384_MAGIC),而不是 ECDH 公钥 (BCRYPT_ECDH_PUBLIC_P384_MAGIC),如引用的 answer 所示。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多