パスワード文字列生成アルゴリズム
EpisoPassは、問題と回答の組合せをもとにしてシード文字列を変換することによってパスワード文字列を生成します たとえばシード文字列がabcABC123のとき、pveMIH084のようなパスワード文字列が生成されます
英小文字は英小文字に、数字は数字に変換されます
選択した回答によりランダムな感じでパスワード文字列が生成されます
変換はcrypt(seed,str)で計算されます
seedはシード文字列で、strは問題とユーザの回答を並べたものです
たとえば問題が['コケたのはどこ?', 'メガネをなくしたのは?']で、ユーザの回答が['東京', '岡山']だったとき、str = コケたのはどこ東京メガネをなくしたのは岡山とします
strからmd5ハッシュ(32桁のHex文字列)hを作成し、それを使ってシード文字列を置換します
hを4文字ずつ区切って8要素の整数配列を作成します。
たとえばstrのmd5が0x01234567...だったとき、a = [0x0123, 0x4567, ...]という整数配列を作成します。
seedの0文字目, 1文字目, ...をこの整数値を使って置換します。
たとえばseedの0文字目がsだったとき、sは英小文字なのでabcd...xyzとa[0] = 0x0123を使って置換します
sは"abcd...xyz"[18]なので、"abcd...xyz"[(0x123-18+26) % 26] = nに置換します
nは"abcd...xyz"[13]なので、"abcd...xyz"[(0x123-13+26) % 26] = sとなります
seedの1文字目が0だったとき、0123456789とa[1] = 0x4567を使って置換します
0は"0123456789"[0]なので、"0123456789"[(0x4567-0+10) % 10] = 7に置換します
7は"0123456789"[7]なので、"0123456789"[(0x4567-7+10) % 10] = 0となります
このように、crypt(crypt(seed,str),str) = seed となります