= 2ch トリップ仕様(抄) 見よう見まねでトリップを実装して2ch仕様と非互換のものを増やしやがるバカを撲滅す… 実際には2chトリップ仕様をぐぐって見つけるのが困難なので、ここにまとめる! == 仕様概要 2ch掲示板システム(以降2ch)の投稿処理スクリプト(以下bbs.cgi)に実装されているトリップの仕様において、重要なものは以下の通り。 * POSIX準拠のCRYPT(3)に基づいている! それは Perl などから容易に利用できる! * ハッシュアルゴリズムはDESベースのものを用いる。すなわちCRYPT(3)のSalt引数にて$により指定できる拡張暗号化アルゴリズム(MD5など)は利用しない。 * 2ch は Shift_JIS ベースである。よって記事投稿(カキコ)フォームにて入力された文字列は基本的に Shift_JIS にて bbs.cgi に渡される。すなわちトリップキーも Shift_JIS エンコードであることを前提とする。 * bbs.cgi はマルチバイト非対応Perl5にて記述されている。よって渡されたキーはマルチバイト処理を施さず、バイト(オクテット)単位で取り扱う。 * Salt は実装上の歴史的理由により、トリップキーの2文字目および3文字目から変換表により一意に決定する。 以下、2ch実装の実情ではあるが仕様不備な項目を挙げる。 * bbs.cgi の文字エスケープ(HTMLのメタ文字を置換)は、トリップキーに対しても行われる。また、bbs.cgi の文字エスケープ規則は基本的にアドホックである。 * bbs.cgi の語句置換処理(いわゆるNGワード)も、トリップキーに対して行われる。置換の対象語句はマルチバイトであるにもかかわらず、非マルチバイトにて置換が行われる。よって、一見置換対象でない文字列に対し置換が行われることがある。 * bbs.cgi 稼働サーバOS(FreeBSD)のCRYPT(3)には仕様不備がある。キーバイト列に含まれる 0x80 をキー文字列の終端(0x00)と見なし、以降のバイト列は 0x00 であるかのごとく処理してしまう。一部のShift_JIS全角文字がこの仕様に抵触する。 == 用語集 ||語||略語など||概要|| ||CRYPT(3)||crypt||POSIX|| ||DES||DES||元来は56ビットキーによる64ビットデータのブロック暗号。CRYPT(3)およびトリップでは、0をキーで25回繰り返して暗号化した結果をハッシュとして用いる。|| ||HTMLエスケープ|| ||ここに書くのか?|| ||SQLエスケープ|| ||' および \ を処理?|| ||エスケープ||escape||かきかけ|| ||トリップ||trip, hash||トリップキーから一意に変換された10文字の文字列を指す。それぞれの文字は64通りの集合(数字, アルファベット大文字, アルファベット小文字, ピリオド, スラッシュ)にて構成される。[[BR]]あるいは2chに実装されたID表示システムの通称。ひろゆき命名。|| ||トリップキー||key||えーと、めんどくせー|| == 掲示板システム実装者のために 基本的に、以下の項目に従っていれば、2chにおおむね準拠させることができる。 * トリップキーは Shift_JIS にて扱う。空白文字などをトリップキー終端と見なさない。 * トリップキーにはHTMLエスケープもしくはSQLエスケープを施さない。システム上エスケープを施す必要がある場合は、トリップキーの抽出を先に行う。 * Salt を 2ch 規則に従って生成する。 * 表示するトリップは、CRYPT(3)により得られたハッシュの末尾10文字を取り出して用いる。 2ch と同様の結果を得るためには、さらに以下の項目を実施する必要がある。いずれを施さなくても、利用者側でキーを一部改竄することに対応可能ではある。 * 非マルチバイト処理にてトリップキーのエスケープ・NGワード置換を行う。 * トリップキー中の 0x80 を認識し、それ以降の文字を切り落とす。 * トリップキーが2文字未満の場合、Salt生成がややめんどくせー。 === Perl(マルチバイト非対応) === Perl(use Encode) === PHP4 == Salt処理 || ||0||1||2||3||4||5||6||7||8||9||A||B||C||D||E||F|| ||0x00||.||.||.||.||.||.||.||.||.||.||.||.||.||.||.||.|| ||0x10||.||.||.||.||.||.||.||.||.||.||.||.||.||.||.||.|| ||0x20||.||.||.||.||.||.||.||.||.||.||.||.||.||.||.||/|| ||0x30||0||1||2||3||4||5||6||7||8||9||A||B||C||D||E||F|| ||0x40||G||A||B||C||D||E||F||G||H||I||J||K||L||M||N||O|| ||0x50||P||Q||R||S||T||U||V||W||X||Y||Z||a||b||c||d||e|| ||0x60||f||a||b||c||d||e||f||g||h||i||j||k||l||m||n||o|| ||0x70||p||q||r||s||t||u||v||w||x||y||z||.||.||.||.||.|| ||0x80||.||.||.||.||.||.||.||.||.||.||.||.||.||.||.||.|| ||0x90||.||.||.||.||.||.||.||.||.||.||.||.||.||.||.||.|| ||0xA0||.||.||.||.||.||.||.||.||.||.||.||.||.||.||.||.|| ||0xB0||.||.||.||.||.||.||.||.||.||.||.||.||.||.||.||.|| ||0xC0||.||.||.||.||.||.||.||.||.||.||.||.||.||.||.||.|| ||0xD0||.||.||.||.||.||.||.||.||.||.||.||.||.||.||.||.|| ||0xE0||.||.||.||.||.||.||.||.||.||.||.||.||.||.||.||.|| ||0xF0||.||.||.||.||.||.||.||.||.||.||.||.||.||.||.||.|| == 歴史 === Salt の扱い