ゲームデータの暗号化  

自分が作ったゲームの中のデータを見られたり、改造されたりされるとちょっと癪ですよね?
っていうことで、ゲームに使用している画像や音声などのデータを暗号化して、ちょっとやそっとじゃ見れなくしようっていう話

ちなみに市販のゲームやオンラインゲームなどでも、通常データに暗号化がかかってます

暗号化?  

とは言ってもそんなにガチガチのセキュリティは求めません
適当にデータをこねくり回して見にくくするだけです

排他的論理和(XOR)で暗号化  

今回は排他的論理和を使った簡単な暗号化をやってみましょうか

最初に、暗号化したいデータを2進数に変換します
今回はASCIIコードで"Hello!"ってします

data.png

次に、鍵を用意します
この鍵はパスワードみたいなもので、これが分からないと暗号を解けません
今回はASCIIコードで"passwd"ってします

key.png

最後に、データと鍵の排他的論理和を計算します

xor.png

そして、この結果を暗号文とします
なお、この暗号文はアルファベットで表現することができない2進数が含まれているため、
メモ帳とかで見るとホントにグチャグチャになります

復号化  

暗号化しっぱなしじゃダメなので、次は暗号を元に戻す復号化をします
とはいっても、実は復号化したいデータと鍵の排他的論理和を計算するだけです

dxor.png

暗号化と復号化の処理が全く同じ!  

なので、暗号化と復号化のプログラムを別々に作らなくてもいいので作るときにラクなんです

C言語で書いてみる  

実際にC言語で書くとどうなるかっていう話

//暗号化・復号化
//pOut: 処理結果が格納される配列
//pIn: 処理したいデータ
//size: データの長さ
//pKey: 鍵文字列
//keysize: 鍵の長さ
void Encrypt(
    char *pOut,
    char *pIn,
    unsigned int size,
    char *pKey,
    unsigned int keysize)
{
    unsigned int i;
    for( i = 0; i < size; i++ ) {
        pOut[i] = pIn[i] ^ pKey[i % keysize];
    }
}

C言語では「^」がXORを行う演算子です
また、鍵よりデータが長かった場合は鍵を繰り返して使用するようにしています

デモンストレーション  

実際にこの方法を使ってファイルを暗号化してみます
暗号化するファイルはC言語のソースコード、鍵は"password"としています

demo.png

左が暗号化前、右が暗号化後です
暗号化後のデータは何が書いてあるか全く分からないでしょ?

最後に  

っていうことで、ゲームのデータの暗号化を書いてみました

今回は排他的論理和だけを使ってシンプルに暗号化してみましたが、
暗号化の方法はこれ以外にも、データにある一定の値を加算したり、
ビットシフト演算子でビットをずらしたり、ビットを反転させたりなどなど
色々あるので、自分だけの暗号化アルゴリズムを作ってみるのもおもしろいかも知れないです