0

CryptStringToBinary暗号化 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が返されます。false0x0000000

API に渡される文字列の長さに問題があります。null で終了する char ( removed+1) なしで長さを渡すと、API はtrue常に戻ります。しかし、この場合、BYTE返された長さは正しいですか?

この動作の背後にある理由を理解するのを手伝ってくれる人はいますか?

また、API での長さパラメーターの使用法は正しいですか?

4

1 に答える 1

1

フラグ CRYPT_STRING_BASE64 で定義されている base64 文字列を入力として持つ必要があり、最初の文字列は base64 ですが、L"MyTest" は base64 ではありません。

入力フォーマットの例: http://pkix2.sysadmins.lv/library/html/T_PKI_ManagedAPI_CryptEncoding.htm

于 2018-07-23T06:58:33.963 に答える