CryptStringToBinary API поведение

0

Я вижу странное поведение с CryptStringToBinary Cryptography API. См. Ниже код (config: x64 Debug):

#include "stdafx.h"
#include <windows.h>
#include <strsafe.h>
#include <iostream>
#include <exception>
void main()
{
    DWORD dwSkip;
    DWORD dwFlags;
    DWORD dwDataLen;
    //LPCWSTR pszInput = L"jAAAAAECAAADZgAAAKQAAGdnNL1l56BWGFjDGR3RpxTQqqn6DAw3USv2eMkJYm4t";  //this works fine

    LPCWSTR pszInput = L"MyTest"; //doesnt work, API returns false,error code 0x0000000d


    // Determine the size of the BYTE array and allocate memory.
    if(! CryptStringToBinary(
        pszInput, 
        _tcslen( pszInput ) + 1, 
        CRYPT_STRING_BASE64,
        NULL, 
        &dwDataLen,
        &dwSkip, 
        &dwFlags ) )
    {
        DWORD dw = GetLastError(); //0x0000000d: The data is invalid

        throw std::exception( "Error computing Byte length." );
    }

    BYTE *pbyteByte = NULL;
    try
    {
        pbyteByte = new BYTE[ dwDataLen ];
        if( !pbyteByte ) 
        {
            DWORD m_dwError = ERROR_INVALID_DATA;

            throw std::exception( "Wrong array size." );
        }
    }
    catch( std::exception &ex )
    {
        throw ex;
    }
    catch(...)
    {

        throw std::exception( "Out of memory." );
    }

    return ;
}

С первой строкой pszInput (прокомментированная строка выше) CryptStringToBinary возвращает true, но если я использую L "MyTest" в качестве строки pszInput, она возвращает false с кодом ошибки 0x0000000d. Я вижу, есть некоторая проблема с длиной строки, переданной API. Когда я передаю длину без символа с нулевым завершающим символом (удаляется +1), API всегда возвращает true. Но в этом случае верна ли длина BYTE?

Может ли кто-нибудь помочь мне понять причину такого поведения? Кроме того, правильно ли используется параметр длины в API?

Заранее спасибо!

Теги:
string
cryptography

1 ответ

0

Вы должны иметь в качестве входных данных строку base64, как определено флагом CRYPT_STRING_BASE64, а L "MyTest" не является базовым64, а первая строка.

Примеры входных форматов: http://pkix2.sysadmins.lv/library/html/T_PKI_ManagedAPI_CryptEncoding.htm

  • 0
    Не могли бы вы более подробно изложить свой ответ?
  • 0
    CryptStringToBinary (pszInput, / * вход должен быть в формате, определенном флагом CRYPT_STRING_BASE64 / _tcslen (pszInput), / это длина строки, которую не нужно добавлять + 1 * / CRYPT_STRING_BASE64, NULL, & dwDataLen & dwS & dwS)
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню