single.php

VC++ WinCrypt.h を使ったBase64変換(CryptStringToBinary, CryptBinaryToString)

C#などでは、簡単に変換できるクラスが用意されていますが、VC++のライブラリである”WinCrypt.h”を利用したBase64の文字列変換のやり方について紹介します。

WinCrypt

暗号化を取り扱うクラスとして、古くから提供されているクラスです。今でも現役としてVCでは活躍していてくれています。

#include <wincrypt.h>
#progma comment (lib, "crypt32.lib")

こんな感じで、ヘッダーとライブラリをソースに読み込ませます。

Base64変換(エンコードとデコード)

後は、CryptStringToBinaryとCryptBinaryToStringの関数を使って、文字列とバイト配列を使ってエンコードとデコードを行っていきます。

それぞれ関数化をしていますが、具体的にはこんな感じのコードです。

Base64エンコード(バイト配列から文字列)

bool CrypttoBase64Encode(BYTE* pbSource, DWORD dwSourceLength, CString sBase64)
{
	bool bResult = false;
	DWORD dwDestLength = 0;
	LPTSTR psDest = NULL;
	if (CryptBinaryToString(pbSource, dwSourceLength, CRYPT_STRING_BASE64, NULL, &dwDestLength) == TRUE)
	{
		psDest = new TCHAR[dwDestLength + 1];
		if (CryptBinaryToString(pbSource, dwSourceLength, CRYPT_STRING_BASE64, psDest, &dwDestLength) == TRUE)
		{
			sBase64 = CString(psDest);
			bResult = true;
		}
		delete psDest;
	}
	return bResult;
}

Base64デコード(文字列からバイト配列)

bool CrypttoBase64Decode(CString sBase64, BYTE* pbDest, DWORD& dwDestLength)
{
	if (CryptStringToBinary(sBase64, sBase64.GetLength(), CRYPT_STRING_BASE64, NULL, &dwDestLength, NULL, NULL) == TRUE)
	{
		if (pbDest == NULL)
		{
			return true;
		}
		
		if (CryptStringToBinary(sBase64, sBase64.GetLength(), CRYPT_STRING_BASE64, pbDest, &dwDestLength, NULL, NULL) == TRUE)
		{
			return true;
		}
	}
	return false;
}

まとめ

VC++でアプリやサービスを書くことは少なくなっていますが、Web関連のプロジェクトを進めていく中で、HTTPにデータを通す過程で暗号化などでBASE64技術は必要不可欠になってきています。

汎用クラスとして、作っておけば簡単にVC++でもBase64を簡単に実装することができます。

スポンサーリンク

最後までご覧いただき、ありがとうございます。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です