ローグ・クローン2日本語版で遊んでるんだけどWizardパスワードを 知りたいという声が聞こえてきた。 ソースを見てそれらしい文字列を入れてみたがダメだという。 要はプログラムが読めないんだな。
そんなくだらないものを知ってどうするんだと言ってやろうかと思ったが、 まあ大きなお世話だな。 英語版のTipsの類には英語版のパスワードが載っているらしいし。
なのでソースを取り寄せてプログラムを読んでみた。ふむふむ。
zap.c
冒頭のchar *wiz_passwd
)。wiz_passwd
と比較される(zap.c
のwizardize()
)。score.c
のxxxx(char *buf, int len)
で文字列を暗号化、xxx(1)
で乱数列を初期化、xxx(0)
で乱数列を生成)。
なので、乱数列を生成してwiz_passwd
との
XORをとればパスワードがわかる。
で、せっかく解析したので覚え書きとして公開しておく。 きょうびrogueなんぞで遊ぼうという人の人口を考えたら この程度を公開したからといって大して害はないだろう。
wizardize()でのパスワード照合は一方向性ハッシュ関数を前提にした
書き方(入力文字列を暗号化して暗号化済みのテンプレートと比較)になっている。
UNIX上ではDESでも使っていたのだろう。
DOSへ移植するにあたってDESによるcrypt()
が
標準ライブラリになかったので簡単な暗号を新作したものと推測される……
と、ソースを見た途端思ったのだが、
FreeBSD付属のrogueソースを見ると、
太田純によるDOS移植・日本語化の前から同じ仕組みだったようだ。
オリジナルのrogue clone2は1987年だな。
このころのBSD UNIXにcrypt()
があったかどうかなんだが……
FreeBSDのcyrpt(3) man pageによると、 rotor-based crypt()はVersion6 AT&T UNIX(1975)、 current style crypt()はVersion7 AT&T UNIX(1979)が初出だそうだ。
まあ、少なくとも当時は一方向性ハッシュ関数は知られていなかっただろうし、 ソース配布でパスワードを隠しおおせるとは思ってなくて、 一目見てすぐにはわからない程度に隠しておけばいいと割り切っていたのだろう。 暗号化したあとのものどうしを比較という書き方については 当たり前と言えば当たり前でもあり、 このころのUNIXプログラマはUNIXのソースなり Lion's Commentaryなりを教科書として読んでいただろうし、 当たり前といえば当たり前な書き方ではあろう。 で、ちょうどゲームのために疑似乱数を作ってあったので これを流用したって感じなんだろうな。
Copyright (C) 2003 by MIURA Toshitaka
All rights reserved.
last update: $Date: 2003/01/16 15:42:52 $