在 Windows CE 3 上将 PEM 转换为 DER

Translate PEM to DER on Windows CE 3

本文关键字:转换 DER PEM 上将 Windows CE      更新时间:2023-10-16

我有一个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版本中不存在。虽然我可以取消对不太流行的编码(例如十六进制(的支持,但我真的不想在 CE 3 版本的 API 中删除对 PEM 编码的支持。

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

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