ホーム > カテゴリ > ゲーム開発・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


この記事を書いた人

💻 ITスキル・経験
サーバー構築からWebアプリケーション開発。IoTをはじめとする電子工作、ロボット、人工知能やスマホ/OSアプリまで分野問わず経験。

画像処理/音声処理/アニメーション、3Dゲーム、会計ソフト、PDF作成/編集、逆アセンブラ、EXE/DLLファイルの書き換えなどのアプリを公開。詳しくは自己紹介へ
プチモンテ代表、アーティスト名:プチモンテ
🎵 音楽制作
BGMは楽器(音源)さえあれば、何でも制作可能。歌モノは主にロック、バラード、ポップスを制作。歌詞は叙情詩、叙情的な楽曲が多い。楽曲制作は2023年12月中旬 ~

オリジナル曲を始めました✨

YouTubeで各楽曲を公開しています🌈
https://www.youtube.com/@petitmonte

【男性ボーカル】DA・KA・RA | 新たな明日が風と共に訪れる

【男性、女性ボーカル】時空を超越する先に | 時空と風の交響曲

【女性、男性ボーカル】絆 | 穏やかな心に奏でる旋律