暗号化のメインのループ部分は、確かに>>1のHPにあった通りのアルゴリズムだった。

逆アセ:
loop {
 *p ^= code[(rand() * rand() mod 1000000)];
 p++;
}

ちなみにrand()はこんな感じ。

 static r;
 r = (r * 214013 + 2531011) mod 0x100000000;
 return (r / 0x10000) mod 0x10000;
}

この部分に問題があると思っていたんだけど、
rand()の2乗で偏りそうな以外は悪くないんじゃない?

乱数表の初期化部分は追ってないけど(ていうかソース出せ。いい加減逆アセ疲れた)
そこを改良すれば、初心者にしては発想はいい線いっていると思う。