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を簡単に実装することができます。

スポンサーリンク

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

コメントを残す

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