備忘記録
2006.07.11 (火) 12:00
ugnag
まず、何が問題だったのかというと、変数のタイプに符号無し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
val = val & 0x7FFFFFFF;
val = val
}
return val;
}
これでなんとかなった。
しかし、暗号化計算では、AND、XOR、ビットシフトがやたらと出てくるので、そのたびにサブルーチンに置き換えるのに苦労した。
例えば、
tbl1[tmp
というような、ネストしているものはワーク変数を使いながら、間違わないように処理させた。
結構な作業だったので、疲れた。。。
[7] beginning...
[1] comments (1)
-
[7] << GC暗号化スクリプト完成
[9] 携帯充電器の規格統一へ >>
[0] [top]