【问题标题】:Translate PEM to DER on Windows CE 3在 Windows CE 3 上将 PEM 转换为 DER
【发布时间】:2012-05-16 20:59:10
【问题描述】:

我有一个 RSA 公钥加密包装器,它在桌面 Windows 和 Windows Embedded/POSReady 中运行良好。我需要将此系统移植到 Windows CE 5 和 Windows CE 3。在此系统的一部分中,我允许开发人员以多种编码导入各种加密对象,例如证书和密钥。最常用的编码是 Base64 编码的 PEM。在大多数版本的 Windows 上,很容易将编码转换为 Windows 对CryptDecodeObjectEx 调用所需的二进制 (DER) 格式:

bool MyClass::externalToBinary( const DATA_BLOB &in, DATA_BLOB &outDER )
{
    DWORD flags;

    // This call determines the format and how much memory is needed in outDER
    if ( ::CryptStringToBinaryA( reinterpret_cast<char *>(in.pbData), in.cbData, CRYPT_STRING_ANY,     NULL, &outDER.cbData, NULL, &flags ) == false &&
         ::CryptStringToBinaryA( reinterpret_cast<char *>(in.pbData), in.cbData, CRYPT_STRING_HEX_ANY, NULL, &outDER.cbData, NULL, &flags ) == false )
    {
        // Log errors here using ::GetLastError();
        return false;
    }

    if ( ( outDER.pbData = new unsigned char[outDER.cbData] ) == NULL )
    {
        // Log errors here using ::GetLastError();
        return false;
    }
    return ( ::CryptStringToBinaryA( reinterpret_cast<char *>(in.pbData), in.cbData, flags, outDER.pbData, &outDER.cbData, NULL, NULL ) != FALSE );
} // end externalToBinary

不幸的是,CryptStringToBinary 在 Windows CE 3 的 CryptoAPI 版本中不存在。虽然我可以取消对不太流行的编码(例如十六进制)的支持,但我真的不想在 API 的 CE 3 版本中取消对 PEM 编码的支持。

是否有人有可以在 Windows CE 3 上运行的CryptStringToBinary 替代方案?使用此 API 的开发人员目前没有 OpenSSL 作为依赖项,因此我不希望仅为此添加它。

【问题讨论】:

    标签: c++ windows-ce cryptoapi pem der


    【解决方案1】:

    嗯 - PEM 只是 base64 编码的 DER。因此,如果这是您唯一需要转换的地方;我只是放弃了 API 的细节;去掉任何空行或以“-”开头的行;和 base64 解码介于两者之间的任何内容。结果就是您所追求的 DER。 WindowsCE3 有 Base64 的 Encode/Decodeter 类型;如果由于某种原因您不想/不想使用它 - How do I base64 encode (decode) in C?http://www.adp-gmbh.ch/cpp/common/base64.html 是相当微不足道的“原始”版本。

    【讨论】:

      猜你喜欢
      • 2017-07-01
      • 2018-07-30
      • 1970-01-01
      • 2023-03-04
      • 2016-07-15
      • 1970-01-01
      • 2019-08-26
      • 2022-01-10
      • 1970-01-01
      相关资源
      最近更新 更多