【MQL4定数】暗号化定数(ENUM_CRYPT_METHOD)

【辞書】MQLリファレンス

暗号化定数(ENUM_CRYPT_METHOD)

暗号化定数(ENUM_CRYPT_METHOD)は、テキストなどを暗号化し、セキュリティを高めるために使用されます。

プログラムでパスワードを使用するときに、パスワードを暗号化をすると良いでしょう。

暗号化することで、セキュリティが高くなり、より信頼できる自動売買を作成することができます。

暗号化、復号化するには、以下の関数を使用してください。

暗号化するには、CryptEncode関数を使います。

暗号化を復号するには、CryptDecode関数を使います。

暗号化定数(ENUM_CRYPT_METHOD)

定数説明(暗号化の計算方法)
CRYPT_BASE64BASE64変換
CRYPT_AES128128ビット(16バイト)キ―AES暗号化
CRYPT_AES256256ビット(32バイト)キ―AES暗号化
CRYPT_DES56ビット(7バイト)キ―DES暗号化
CRYPT_HASH_SHA1SHA-1ハッシュ計算
CRYPT_HASH_SHA256SHA-256ハッシュ計算
CRYPT_HASH_MD5MD5ハッシュ計算
CRYPT_ARCH_ZIPZIPアーカイブ

暗号化定数の使い方

主に、CryptEncode関数、CryptDecode関数で使用されます。

それぞれの関数の引数として使用されます。

例えば、以下のように使用します。

void OnStart()
 {
  //暗号化するテキスト
  string text="Hello World";

  //暗号化するための鍵
  string keystr="ABCDEFG";

  //暗号化に使用する配列
  uchar src[],dst[],key[];

  //鍵をchar型の配列に変換
  StringToCharArray(keystr,key);

  //テキストをchar型の配列に変換
  StringToCharArray(text,src);

  //暗号化前のテキストを表示
  PrintFormat("Initial data: size=%d, string='%s'",ArraySize(src),CharArrayToString(src));

  //src[] を key[] を使って、56ビット(7バイト)キ―DESで暗号化
  //暗号化した結果を dst[] に格納
  int res=CryptEncode(CRYPT_DES,src,key,dst);

  //エラーをチェック
  if(res>0)
    {
    //dst[] を key[] を使って、56ビット(7バイト)キ―DESで復号化
    //復号化した結果を src[] に格納
    res=CryptDecode(CRYPT_DES,dst,key,src);

    //エラーをチェック 
    if(res>0)
       {
        //復号化されたテキストを表示
        PrintFormat("Decoded data: size=%d, string='%s'",ArraySize(src),CharArrayToString(src));
       }
    }
 }

プログラム例

以下は、暗号化定数を使って文字列をAES256で暗号化し、復号化するサンプルプログラムです。

//+------------------------------------------------------------------+
//| 暗号化定数サンプルプログラム                                        |
//+------------------------------------------------------------------+
void OnStart()
 {
  //--- 暗号化するテキスト
  string text = "MQL4プログラミングで暗号化テスト";

  //--- 32バイトの鍵(AES256用)
  string keystr = "12345678901234567890123456789012";

  //--- 配列の宣言
  uchar src[], dst[], dec[], key[];

  //--- 文字列を配列に変換
  StringToCharArray(keystr, key);
  StringToCharArray(text, src);

  //--- 暗号化前のテキストを表示
  PrintFormat("【暗号化前】size=%d, text='%s'", ArraySize(src), CharArrayToString(src));

  //--- AES256で暗号化
  int encResult = CryptEncode(CRYPT_AES256, src, key, dst);

  if(encResult > 0)
    {
     PrintFormat("【暗号化成功】暗号化後のデータサイズ=%d", ArraySize(dst));

     //--- 暗号化データを16進数文字列で表示
     string hexStr = "";
     for(int i = 0; i < ArraySize(dst); i++)
       {
        hexStr += StringFormat("%02X", dst[i]);
       }
     PrintFormat("【暗号化データ(HEX)】%s", hexStr);

     //--- AES256で復号化
     int decResult = CryptDecode(CRYPT_AES256, dst, key, dec);

     if(decResult > 0)
       {
        PrintFormat("【復号化成功】size=%d, text='%s'", ArraySize(dec), CharArrayToString(dec));
       }
     else
       {
        PrintFormat("【復号化失敗】エラーコード=%d", GetLastError());
       }
    }
  else
    {
     PrintFormat("【暗号化失敗】エラーコード=%d", GetLastError());
    }

  //--- ハッシュ計算の例(SHA256)
  uchar hash[];
  uchar dummy[];
  int hashResult = CryptEncode(CRYPT_HASH_SHA256, src, dummy, hash);

  if(hashResult > 0)
    {
     string hashStr = "";
     for(int i = 0; i < ArraySize(hash); i++)
       {
        hashStr += StringFormat("%02X", hash[i]);
       }
     PrintFormat("【SHA-256ハッシュ】%s", hashStr);
    }
 }

【補足】暗号化定数の列挙型(ENUM_CRYPT_METHOD)

暗号化定数は、ENUM_CRYPT_METHOD​という列挙型に含まれています。

列挙型は、定数群をひとまとめにしたものです。

以下のように使います。

ENUM_CRYPT_METHOD cryptMethod = CRYPT_DES;

上記のようにプログラムすると、cryptMethod変数に CRYPT_DESの値が代入されます。