ホーム > カテゴリ > ゲーム開発・Unity・C# >

データをゲームからサーバーへ「AES暗号化」して送信する [Unity]

ゲーム側の「C#」でAES128ビット(CBCモード)によるデータの暗号化を行い、サーバ側では「PHP」で復号化の処理を行います。

「共有キー」(Key)、「初期化ベクトル」(IV)の2つのキーがありますが、共有キーは非公開にする必要があります。※初期化ベクトルは公開してもOK。

次の例だと「逆アセンブル」されたら共有キーが判明する可能性があるので、企業などが使用する際は、逆アセンブル対策を行ってください。

ゲーム側(C#)

using UnityEngine.Networking;

// AES128ビット(CBCモード)による暗号化
// ※このメソッドでは最大16byteの文字列(src)に対応
string AES128_Encode(string src, string key, string iv)
{
    // 文字列をバイト型配列へ
    byte[] input = System.Text.Encoding.UTF8.GetBytes(src);

    // AES暗号化
    System.Security.Cryptography.AesManaged AES = new System.Security.Cryptography.AesManaged();
    AES.KeySize = 128;   // 鍵の長さ  
    AES.BlockSize = 128; // ブロックサイズ(srcは16byteまで) 
    AES.Mode = System.Security.Cryptography.CipherMode.CBC; // CBCモード
    AES.IV = System.Text.Encoding.UTF8.GetBytes(iv);        // 初期化ベクトル(公開)
    AES.Key = System.Text.Encoding.UTF8.GetBytes(key);      // 共有キー(非公開)
    AES.Padding = System.Security.Cryptography.PaddingMode.PKCS7;
    byte[] output = AES.CreateEncryptor().TransformFinalBlock(input, 0, input.Length);

    // BASE64
    return System.Convert.ToBase64String(output);
}        

IEnumerator SendServer()
{      
    // ---------------
    //  KEY/IV
    // ---------------      
    
    // KEY(非公開)
    string key = "abcdefghijklmnop";

    // IV(公開)
    // ※16桁のランダムな英数字を生成
    string iv = System.Guid.NewGuid().ToString("N").Substring(0, 16);
    
    // ---------------
    //  URLの実行
    // ---------------
    // URL
    string url = "https://www.example.com/reg.php";
    url += "?name1=" + System.Web.HttpUtility.UrlEncode(AES128_Encode("テスト", key, iv));
    url += "&iv=" + iv;
    
    UnityWebRequest www = UnityWebRequest.Get(url);
    yield return www.SendWebRequest();

    if (www.isNetworkError || www.isHttpError)
    {
        // エラー
        Debug.Log(www.error);
    }
    else
    {
        // GETの結果を表示する
        Debug.Log(www.downloadHandler.text);
    }
}

public void run()
{
    StartCoroutine(SendServer());
}  

サーバー側(PHP)

// 暗号の復号化
function decrypt($base64) {
      
  $key = "abcdefghijklmnop";  // 共有キー(非公開)
  $iv  = $_GET['iv'];         // 初期化ベクトル(公開)
  $method  = 'AES-128-CBC';
  return openssl_decrypt($base64, $method, $key, 0, $iv);
}

$name1 = decrypt($_GET['name1']);
echo $name1;

※$keyの定義はpublic_htmlフォルダより上の階層のファイルで行う。

以上となります。





関連記事



公開日:2019年05月06日
記事NO:02757