ゲームでは、ゲーム中で使っている画像やテキストデータをペイントやメモ帳などで開けないように、データを暗号化することがよくあります。試しに市販のゲームのセーブデータなどを開いてみてください。開けても読めないはずです。
プログラミングの世界には、暗号化の入門編として名高い XOR という技術がありますのでこれを使ってみましょう。
XOR とはあるデータを、ほかのデータを使って変更することです(詳しい理屈は興味のある人だけ勉強していただければ良いと思います)。
たとえば、 100 を 777 を使って XOR すると 887 になります。 100 という数値が 887 になってしまうんですよ?訳がわかりませんよね?この訳がわからない変換を利用して暗号化を実装するのです。
そして XOR の最大の特徴は、もう一度 XOR すると元の数値に戻るという点です。 100 を 777 で XOR すると 887 になりましたが、逆に 887 を 777 を使って XOR すると 100 に戻るのです。この性質を利用して複合化を実装するのです。
サンプルプログラムはこんな感じです。
#include <iostream> int main(int argc, char *argv[]) { int data = 100; // 元となるデータ int salt = 777; // 暗号化パターン // 現在の data を表示する std::cout <<data <<std::endl; // 暗号化 data ^= salt; // 暗号化した data を表示する std::cout <<data <<std::endl; // 複合化 data ^= salt; // 複合化した data を表示する std::cout <<data <<std::endl; return 0; }
これを応用して、画像データの全バイトに XOR をかけてファイルに保存すれば、ペイントなどで開けなくなります。ゲームから使う場合は XOR して読み込めば、問題なく表示することができるようになります。意外と簡単ですよね。
しかし、この方法の問題点は、あまりに初歩的すぎて解読が簡単なことです。素人をだますにはちょうど良いのですが、パソコンに詳しい人はこの解読方法をよく知っています。人によっては「見ただけでわかる」という場合もあります。プログラマなら9割以上の方が知っているはずです。
あくまで暗号化の入門編と言うことでご了承ください。
Comments
お邪魔します~
単純なXORの暗号化でも、やるとやらないとでは雲泥の差ですね。
結構効果的なので僕はよく使ってます。
まぁ、単純にXORするだけではなく、独自のルーチンも織り交ぜていますので簡単には解析できないような仕様にしてますけどね。
お邪魔しました~
>たつにいさん
こんにちは。
同時にデータをアーカイブするプログラムを組むと
かなり配布しやすくなりますよね。
100% 解析できなくするというより、解析しにくくなっていれば、
XOR でも十分使っていけると思います。
あと、ゲームライブラリの記事を書いちゃいました。
問題あったら教えてください(^^;
Contributions