3

デスクトップWindowsおよびWindowsEmbedded/POSReadyで非常にうまく機能するRSA公開鍵暗号ラッパーがあります。このシステムをWindowsCE5とWindowsCE3の両方に移植する必要があります。このシステムの一部では、開発者が証明書やキーなどのさまざまな暗号オブジェクトをいくつかのエンコーディングでインポートできるようにします。最も一般的に使用されるエンコーディングは、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

残念ながら、CryptStringToBinaryWindowsCE3のバージョンのCryptoAPIには存在しません。あまり人気のないエンコーディング(16進数など)のサポートを廃止することはできますが、CE3バージョンのAPIでのPEMエンコーディングのサポートを削除したくありません。

誰かがCryptStringToBinaryWindowsCE3で動作する代替手段を持っていますか?このAPIを使用している開発者は、現在OpenSSLを依存関係として持っていないため、これだけのために追加したくありません。

4

1 に答える 1

0

まあ-PEMは単純にbase64でエンコードされたDERです。したがって、これが変換する必要がある唯一の場所である場合。私は API の細かな点を忘れてしまいます。空行または「-」で始まる行を取り除きます。そしてbase64はその間のものをデコードします。結果は、あなたが求めているDERです。WindowsCE3 には、Base64 用のエンコード/デコーダー タイプがあります。何らかの理由でそれを使用したくない/使用したくない場合-Cでbase64をエンコード(デコード)するにはどうすればよいですか? またはhttp://www.adp-gmbh.ch/cpp/common/base64.htmlは、かなり単純な「生の」バージョンです。

于 2013-12-08T11:04:54.570 に答える