3

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

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

4

1 回答 1

0

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

于 2013-12-08T11:04:54.570 回答