2012-05-16 5 views
3

데스크톱 Windows 및 Windows Embedded/POSReady에서 잘 작동하는 RSA 공개 키 암호화 래퍼가 있습니다. 이 시스템을 Windows CE 5와 Windows CE 3 모두에 포팅해야합니다.이 시스템의 일부에서는 개발자가 여러 인코딩으로 인증서 및 키와 같은 다양한 암호화 개체를 가져올 수 있습니다. 가장 일반적으로 사용되는 인코딩은 Base64로 인코딩 된 PEM입니다. 대부분의 Windows 버전, Windows가 CryptDecodeObjectEx 호출에 필요한 바이너리 (DER) 형식으로 인코딩을 변환하기 쉽습니다 :Windows CE 3에서 PEM을 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이의 CryptoAPI의 윈도우 CE 3의 버전에 존재하지 않습니다. 덜 인기있는 인코딩 (예 : 16 진수)에 대한 지원을 취소 할 수는 있지만 CE3 버전의 API에서 PEM 인코딩에 대한 지원을 제거하고 싶지는 않습니다.

누구나 Windows CE 3에서 작동 할 수있는 CryptStringToBinary 대체품이 있습니까? 이 API를 사용하는 개발자는 현재 OpenSSL을 종속성으로 갖고 있지 않으므로이를 위해 추가하지 않는 것이 좋습니다.

답변

0

음 - PEM은 단순히 base64로 인코딩 된 DER입니다. 그래서 이것이 유일한 장소라면 당신은 개종해야합니다. 나는 API를 잘 모르겠다. 빈 줄이나 '-'로 시작하는 줄을 제거하십시오. base64는 그 사이의 모든 것을 디코딩합니다. 결과는 당신이 쫓고있는 DER입니다. WindowsCE3에는 Base64 용 인코더/디코더 유형이 있습니다. 어떤 이유로 든 사용하지 않으려는 경우 - How do I base64 encode (decode) in C? 또는 http://www.adp-gmbh.ch/cpp/common/base64.html은 매우 간단한 '원시'버전입니다.