【解決方法】CryptStringToBinary API の動作

プログラミングQA

[ad_1]

やあ、
CryptStringToBinary 暗号化 API で奇妙な動作が見られます。
以下のコードを参照してください (config: x64 Debug):

C++
#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 文字列が 1 つある場合、CryptStringToBinary は true を返し、L”MyTest” を pszInput 文字列として使用すると、エラー コード 0x0000000d で false を返します。 API に渡される文字列の長さに問題があります。 null で終了する文字なしで長さを渡すと、API は常に true を返します。 しかし、この場合、返された BYTE の長さは正しいですか?

この動作の背後にある理由を理解するのを手伝ってくれる人はいますか?
また、API が正しいバイト長を返すのはどのような場合ですか?

前もって感謝します!

解決策 1

入力をbase-64として渡すことをAPIに伝えています

>> CRYPT_STRING_BASE64

まだ「MyTest」はbase-64でコード化された「文字列」ではありません

私は個人的に精神をチャッキングしたことでAPIを非難しません-その動作は私には正常に思えます

解決策 2

この API は、PEM ファイルの内容をバイナリに変換するために使用されます。 バイナリへのランダムな文字列ではありません。

[ad_2]

コメント

タイトルとURLをコピーしました