首页 > 解决方案 > CX509PublicKeyClass 初始化因 WIN32 失败:13 ERROR_INVALID_DATA

问题描述

我正在尝试使用InitializeFromEncodedPublicKeyInfo(data); 填充 CX509PublicKeyClass() 对象;其中数据来自我在 Windows 中使用 ss-keygen 客户端创建的文件 id_rsa.pub ( KeyFilePath )。

我绑定的示例代码 在此处输入图像描述

该图像还显示了正在引发的异常。我怀疑问题可能与预期的编码有关

public virtual void InitializeFromEncodedPublicKeyInfo(string strEncodedPublicKeyInfo, EncodingType Encoding = EncodingType.XCN_CRYPT_STRING_BASE64);

我已经尝试了多种组合, Hex 和 base64 ,默认字符串等,但我仍然看到同样的错误。

标签: sdkpkcs#11ca

解决方案


答案在于理解 RSA 密钥格式

  1. 私钥包含:模数、私有指数、公共指数、素数1、素数2、指数1、指数2和系数
  2. 公钥包含:只有模数和公共指数。

OpenSSL 产生的 PEM 格式实际上是以称为 DER 的二进制格式进行 base64 编码和包装的密钥数据。因此,要使用 PEM 格式,您必须实际使用 DER。

DER 格式基于抽象语法符号一 (ASN.1) 标准。该标准规定了树状数据结构的编码。两个预定义的数据结构用于私有和公共 RSA 密钥。虽然我没有找到一个很好的格式解析器,但我手头有一些标准的注释,我编写了一个用于编码和解码 ASN.1 值的类。

PEM 格式包含 base64 编码的 DER 数据。它还为其添加了页眉和页脚。以下是私钥的 PEM 文件示例。

在此处输入图像描述


推荐阅读