t2. セーブデータの作り方 (暗号化編)
先ほどの方法では満足いかない人もいるでしょう。まだまだ不十分ですね。いくらでも改竄できてしまいます。例えば
現在のレベル「20」がセーブデータとして保存されているとしましょう。
20の0x45af6e5dを使った排他的論理和は1169124937です。これを1169124938に変更するとレベルは23になってしまいます。
バイナリエディタでユーザーは簡単に開けてしまいますし、改竄も容易で、それが改竄されたものかどうかもわかりません。
ここで、データが改竄されたものかどうかチェックする機能をつけてみましょう。
ここでも同じように論理演算を利用します。「論理和・論理積」を利用します。
例によってこの言葉を知らない人はt1節で紹介したリンクを参考にしてください。
各ビットについて、論理和と論理積の性質として
0との論理和は変更されない。1との論理和はかならず1になる。
0との論理積は必ず0になる。1との論理積は変更されない。
がありますから、これを利用します。例えば今暗号化キーAに「0xFFFF0000」を設定したとします。
1、Aとの論理和の結果、上位16ビットは必ず1にならなければなりません。
2、Aとの論理積の結果、下位16ビットは必ず0にならなければなりません。
この1,2が一方でも満たされなければデータは改竄された事がわかります。
セーブデータはこの論理和の結果と論理積の結果を保存しておきます。
0との論理和は変更されず、1との論理積は変更されないのですから、
「論理和の下位16ビット」と、「論理積の上位16ビット」を足したものが元のデータとなるわけです。
何の事か意味がよくわからなくなってきた人は以下の例を見てください。
今、レベル「77」というデータを保存したいと考えます。暗号化キーを「11110000」とします。
77は2進数で表すと01001101となります。
論理和
セーブしたいデータ⇒ | 0 | 1 | 0 | 0 | 1 | 1 | 0 | 1 |
↓ | ↓ | ↓ | ↓ | ↓ | ↓ | ↓ | ↓ | |
暗号化キー | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 0 |
↓ | ↓ | ↓ | ↓ | ↓ | ↓ | ↓ | ↓ | |
暗号化されたデータ | 1 | 1 | 1 | 1 | 1 | 1 | 0 | 1 |
状態 | 全て1 | 変わらず |
論理積
セーブしたいデータ⇒ | 0 | 1 | 0 | 0 | 1 | 1 | 0 | 1 |
↓ | ↓ | ↓ | ↓ | ↓ | ↓ | ↓ | ↓ | |
暗号化キー | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 0 |
↓ | ↓ | ↓ | ↓ | ↓ | ↓ | ↓ | ↓ | |
暗号化されたデータ | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 |
状態 | 変わらず | 全て0 |
セーブしたいデータのそれぞれの論理積と論理和の結果は表のようになります。
それぞれのピンクの部分は変更されていない事がわかりますね。つまり複合化する時は、このピンクの部分を取り出せばいいのです。
また、論理和の緑の部分は1以外だと、論理積の緑の部分は0以外だと改竄されたものだという事がわかります。
このようにして少しまともにセーブデータが作れます。
暗号化については複雑にすればいくらでも良質なデータが作れます。
シェアウェアなどでデータを配布する時はこの方法ではまだ不十分でしょう。
もし奥深く追及したい人はまた別途暗号化について、勉強してください。
- Remical Soft -