まいったな
しかし、PAR3の場合は複雑なので、とりあえずGCで試してみることにした。
GCの方が、PS2より少しはシンプルだからだ。
幸い、GPCでGCの暗号化モジュールはJAVAにしてあるので、JAVAからJavaScriptへ移植すればいい。
(これも結構大変な作業だが、C言語からの移植よりはましだ)
一応、ロジックの移植は終わり、とりあえず試してみる。
全然ダメだ。
結果がマイナス値になったりしている。
原因を調べていくと、JavaScriptの変数そのものに問題があることがわかった。
つまり、
・変数がバリアント型だということ
・符号無し32ビット整数がない
なんか、内部的に符号付き32ビット整数になったり、64ビット浮動小数点になったりしているような感じがする。
例えば、
b = 0x0FFFFFFF; //7桁
b = b & 0x080808080;
document.write(b.toString(16));
とすると、
808080
と表示される。
が
b = 0xFFFFFFFF; //8桁
b = b & 0x080808080;
document.write(b.toString(16));
とすると、
-7f7f7f80
となってしまう。
当然、80808080を期待しているわけだが。。。
PARの暗号化にはビット演算が必須なのだが、これでは正しい計算はできない。
さて、どうしたものか。。。
GCの方が、PS2より少しはシンプルだからだ。
幸い、GPCでGCの暗号化モジュールはJAVAにしてあるので、JAVAからJavaScriptへ移植すればいい。
(これも結構大変な作業だが、C言語からの移植よりはましだ)
一応、ロジックの移植は終わり、とりあえず試してみる。
全然ダメだ。
結果がマイナス値になったりしている。
原因を調べていくと、JavaScriptの変数そのものに問題があることがわかった。
つまり、
・変数がバリアント型だということ
・符号無し32ビット整数がない
なんか、内部的に符号付き32ビット整数になったり、64ビット浮動小数点になったりしているような感じがする。
例えば、
b = 0x0FFFFFFF; //7桁
b = b & 0x080808080;
document.write(b.toString(16));
とすると、
808080
と表示される。
が
b = 0xFFFFFFFF; //8桁
b = b & 0x080808080;
document.write(b.toString(16));
とすると、
-7f7f7f80
となってしまう。
当然、80808080を期待しているわけだが。。。
PARの暗号化にはビット演算が必須なのだが、これでは正しい計算はできない。
さて、どうしたものか。。。
Comments
というか、一応できてしまった。
もう少し、いろいろと試してみる必要はあるが、今のところ大丈夫。
どうしたかというと、
・1バイトなら、論理計算はうまくいく
・ビットシフトは四則演算で代用すれば大丈夫
ということを利用したサブルーチンにした。