ugnagブログ

たいした内容はありません。思いつきで書いているだけ。
開発日記がメインかな。

<< GC暗号化スクリプト完成 | main | 携帯充電器の規格統一へ >>

備忘記録

GC-PARの暗号化の問題をどうやって解決したのか書いていなかったので、備忘記録として書いておくことにする。
まず、何が問題だったのかというと、変数のタイプに符号無し32ビット整数が使えないことで、論理演算の結果が期待した通りにならないということ。

そこで、32ビット値を2つの16ビットに分け、それぞれ論理演算をした後、再度32ビットに組み合わせるという手法を使った。

32ビットに戻す際も、上位16ビットを左にシフトするのではなく、0x10000を乗算して行い、合成はORではなく加算する。

どうやら、四則演算ならうまくいくようで、こうすれば大丈夫そうだった。

毎回、こんな処理をすると面倒だし間違いの元なので、当然サブルーチン化してておく。

サブルーチンにするのは、ANDとXORの処理と左シフト。
右シフトは、符号無視左シフト演算(>>>)を使えば問題無いようなので、とりあえずこれを使う。


まとめると、


function and(a, b)
{

var a1 = a >>> 16;
var a2 = a & 0xFFFF;
var b1 = b >>> 16;
var b2 = b & 0xFFFF;

var c1 = a1 & b1;
var c2 = a2 & b2;

var c = c1 * 0x10000 + c2;


return c;

}


とこんな感じ。

左シフトは、トップビットをクリアした後1ビット左シフトというのを繰り返す。


function shiftLeft(val, shift)
{

for(var i = 0 ; i < shift ; i++){
val = val & 0x7FFFFFFF;
val = val << 1;
}

return val;

}


これでなんとかなった。

しかし、暗号化計算では、AND、XOR、ビットシフトがやたらと出てくるので、そのたびにサブルーチンに置き換えるのに苦労した。

例えば、

tbl1[tmp<<3] ^ tbl2[temp&0x3F]

というような、ネストしているものはワーク変数を使いながら、間違わないように処理させた。

結構な作業だったので、疲れた。。。
プログラム・開発(その他ゲームツール) | comments (0) | -

Comments

Comment Form

本文に書いて下さい
本文にh抜きで書いて下さい