備忘記録
まず、何が問題だったのかというと、変数のタイプに符号無し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]
というような、ネストしているものはワーク変数を使いながら、間違わないように処理させた。
結構な作業だったので、疲れた。。。
そこで、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
★ルイヴィトン★ヴェルニ★ポルトフォイユ・サラ★ファスナー付長財布★M91741★ブルーラゴン(廃カラー)★カード10枚収納★
届きました!
すでに廃盤になっているこの商品の新品を探していました。未使用品の新品でしたが、もう出会えないと思ったので購入しました。今日届きました。
確認す
と記載にあるとおり微細なキズはあるものの
気にならない程度でした。ヴィトンのタグも
っていました。商品ページには書かれていませんでしたが、純正の箱もありました。良い
エルメス サイズ 50 https://www.watchsjp.com/copy-12837.html