備忘記録

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]


[sb 1.10R]