- ベストアンサー
簡単な暗号化って出来ますか?
ゲームを現在作っているのですが、セーブデータはどのように作ったらいいのでしょうか? 現在セーブデータは例えば「3面までクリアした」というデータは「3*x」をする事で暗号化(といえる物ではないですが)表し、複合化はxを割ることで求めています。 xの数は十分大きくしておいて、データが改竄されてxの倍数でなければエラーになるようになっています。 こんなんじゃすぐわかってしまうでしょうし、もうちょっとクオリティを上げたいのですが、 セーブデータってどうやってファイルにデータ書き出せばいいのでしょうか? 専門性の高いアルゴリズムや難しいアルゴリズムは必要なく、遊び程度のアルゴリズムでいいので(むしろ簡単な方がいいので)教えていただけないでしょうか。 自分の記録したいデータは全てint型の 「n面までクリアした。」 「現在の最高得点」 「合計プレイ時間」 「x匹敵を倒した」 などのデータです。 よろしくお願いします!
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
同じ値で2回XORすると元に戻るのを利用して こんなのは int main(void) { int key = 0x45af6e5d; //任意の暗号化キー int num = 5; int crypt; printf("初期値=%d\n", num); crypt = num^key; printf("暗号化=%d\n", crypt); crypt = crypt^key; printf("複合化=%d\n", crypt); return 0; } どうでしょう
その他の回答 (3)
- tatsu99
- ベストアンサー率52% (391/751)
以下のような暗号はどうでしょうか。 int型の数値xが保存したい値とすると、この値をint型の定数Aで、AND(&)した値x1とOR(|)した値x2を、求め、この2つの値を保存します。 復元は、x1とx2と定数Aがあれば可能です。 またこのことにより、データのかいざんのチェックも可能です。 以下例を示します。 話を簡単にする為に、定数Aを0xFFFF0000とします。 定数AでANDした値x1は、必ず、下位16ビットが0でなければなりません。(定数Aのビットが0に対応する部分) 定数AでORした値x2は、必ず、上位16ビットが1でなければなりません。(定数Aのビットが1に対応する部分) 上記の条件が全て成立しないとき、データがかいざんされています。 次に復元方法ですが、x1の0x????0000とx2の0xFFFF????の部分の?のビットのみをお互いに合わせれば良いことになります。 x1とx2を合わせるとき、x2は0x0000????の状態に一度変換して(0x0000FFFFでANDをとって)、x1とx2のORをとります。これが求めるxになります。 定数Aは、実際には0xFFFF0000でなく、0xABCD789Eなどのビットの0,1が入り乱れた値がものが良いでしょう。
お礼
なるほど、改竄のチェックも出来るわけですね。 大変参考になります。 是非使用させていただきます。ありがとうございました。
- usokoku
- ベストアンサー率29% (744/2559)
私の場合はゲームソフトではありません。 以下の方法で暗号化しています。 1.通常の方法でSAVE 2.ish圧縮をかけて7bitテキスト化(BASE64を使うこともあります) 3.lzh圧縮をかけて8ピット化 4.8bitの乱数表Aで、256バイト単位で順番の入れ替え 5.8bitの乱数表Bで、可逆変換 ここで、乱数表A, Bを作成するルーチンで初期値を起動した時刻にすると、起動するきかいごとに乱数表が変わるので、解読はかなり苦労するはずです。 8ビットですから、256個の配列に順番に数字を入れて、適当な回数、2つ選んだ数値を入れ替えて作ります。 私の場合、取り扱うデータが3-10MBのテキストなので、8ビット内での数値の出現頻度をほぼ均一にするために、ish, lzhを使っています。 これで混ぜてしまうと、特定の場所だけの変更が変な場所まで影響してくれるので所在を特定しにくいです。 データが少ない場合には、適当なゴミを10-20KBつくって、この中に埋め込みます。 どこに埋め込むかは、起動時刻にあわせた乱数で。
お礼
なるほど、ありがとうございます。 クオリティの高いソフトを作る時は是非活用させていただきます。 ありがとうございました。
- softimage
- ベストアンサー率61% (68/111)
以下などはどうでしょうか? ・全て文字列としてそれぞれの桁毎に足し算をする。 各桁の数値はプログラム側で保存しておいてください。 ・関係ない数値を作成しておき、ランダムに数値を入れる。 ・上記を一定のルールで並べ替える また、各データの正当性判断いはハッシュ値やCD (重み付きで足し算や掛け算等した下1桁)を 用いるとよいと思います。
お礼
ありがとうございます。 色んなやり方があるなと関心しているところです。 お世話になりました。
お礼
おぉ、まさに私が一番望んでいた答えでした。 単純かつパッとみわかりにくい非常によい方法ですね。 ありがとうございました。