如何将PEM格式公钥转换为CNG密钥Blob?
可用原生API实现,无需自行实现ASN.1解析
你当前手动构造BCRYPT_ECCKEY_BLOB的方案仅适用于prime256v1(P-256)曲线的公钥,如果后续需要支持P-384、P-521等其他曲线,就需要修改硬编码的Magic值和密钥长度。Windows 8 及更高版本已经提供了完整的接口链路,可以直接从PEM格式公钥得到通用的BCRYPT_KEY_HANDLE,具体步骤如下:
- 解码PEM公钥得到DER二进制数据
你当前使用的CryptStringToBinaryA可以继续使用,优化点是可以传入CRYPT_STRING_BASE64HEADER作为解码类型,API会自动识别并跳过-----BEGIN PUBLIC KEY-----/-----END PUBLIC KEY-----头尾标识,不需要手动处理字符串,兼容性更强。 - 解码DER数据得到公钥信息结构
调用CryptDecodeObjectEx,指定结构类型为X509_PUBLIC_KEY_INFO,即可将第一步得到的DER数据解码为CERT_PUBLIC_KEY_INFO结构体,不需要手动解析ASN.1的字段偏移。 - 直接导入得到CNG密钥句柄
调用CryptImportPublicKeyInfoEx2,传入上一步得到的CERT_PUBLIC_KEY_INFO指针,即可直接输出BCRYPT_KEY_HANDLE,完全不需要手动构造BCRYPT_ECCKEY_BLOB结构,也不需要硬编码曲线对应的dwMagic值,支持所有标准ECC曲线和RSA公钥的通用场景。
如果需要兼容Windows 7系统,可使用替代方案:
- 先调用
CryptImportPublicKeyInfo将CERT_PUBLIC_KEY_INFO导入为旧版CryptoAPI的密钥句柄 - 再调用
NCryptExportKey导出为CNG标准密钥Blob - 最后调用
BCryptImportKeyPair导入得到BCRYPT_KEY_HANDLE
内容的提问来源于stack exchange,提问作者IInspectable
相关产品推荐
相关产品推荐

