0

我看到CryptStringToBinary Cryptography API 的奇怪行为。

请参阅以下代码(配置:x64 调试):

#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错误代码0x0000000

我确实看到,传递给 API 的字符串长度存在一些问题。当我传递没有以空字符终止的字符(removed+1)的长度时,APItrue总是返回。但是在这种情况下,BYTE返回的长度是否正确?

有人可以帮我理解这种行为背后的原因吗?

另外,我对 API 中长度参数的使用是否正确?

4

1 回答 1

1

您需要输入一个由标志 CRYPT_STRING_BASE64 定义的 base64 字符串,并且 L"MyTest" 不是 base64 而第一个字符串是。

输入格式示例:http: //pkix2.sysadmins.lv/library/html/T_PKI_ManagedAPI_CryptEncoding.htm

于 2018-07-23T06:58:33.963 回答