2009/07/22

自転車が盗まれました

1時間くらい目を離していたらいつのまにか消えてしまいました。
バイクはぶっ壊れるし自転車は盗まれるし踏んだり蹴ったりでさすがにキツいです。

2009/07/18

クレジットカードと脆弱性

「クレジットマスター」か? VIPルーム宿泊男を逮捕 警視庁

他人のクレジットカード番号を割り出してインターネット決済し宿泊代金の支払いを免れたとして、警視庁と北海道警が電子計算機使用詐欺などの疑いで、指定暴力団山口組系元組員、瓜生誠被告(35)=覚せい剤取締法違反罪(使用)で起訴=を逮捕していたことが15日、同庁への取材で分かった。同庁などは、不正に入手した他人のIDとパスワードを使ったとして、14日に不正アクセス禁止法違反の疑いで追送検した。

眠れないのでとりあえず記事を更新することにしよう。

さてと、最近なんかクレジットマスター関連の犯罪が増えているような気がします。「クレジットマスター」自体はもう10年くらい前から登場している、古典的な手法らしいんですが、なんで最近になってこんなに頻出しているんでしょうか?謎です。

まず、世界中でよく使われているVISAのクレジットカードだと、桁数は16桁となっています。このままですととりうるカード番号の数は10^16通りであり、とてもじゃないですが実際に使われているカード番号にはたどり着けなさそうです。

ですが、実は全てのクレジットカード番号の最初の6桁は銀行のID番号になっていますので、容易に推測可能です。さらに最後の1桁はチェックサムであり、これも残りの数値から算出することが可能である*1)ため、16-7=9で残りは10^9通りとなりました。
この値が一体どれくらいの多さなのかというと、会員数が多いであろう三井住友VISAカードを例にとりますと、会員数は1641万人(平成20年3月末日)であるので、割合は0.01641。なんとランダムに数値を取っただけで100回につき1、2回は本物のカード番号に突き当たってしまうという計算になってしまいます。これはひどい。


(クレジットマスターの例。アルゴリズムは非常に簡単なので、こんな感じで容易にキージェネが作れてしまいます。一応問題ないとは思いますがモザイク入れておきますね。)

後の残る問題は有効期限なんですが、せいぜい3〜5年以内ですし試行はスクリプトなりなんなりを使えば容易に自動化できますから、1晩か2晩くらい回せばある程度の量の有効なクレジットナンバーが手に入りそうです。

まぁ名義が違ったら目をつけられますし、本物の住所を書くとすぐにお縄になってしまうので、容易さの割に非常にリスクが高い手法なんですが、自分が言いたいのはそんなことじゃなく、ここまで容易に割り出せてしまうクレジットカードの制度自体に問題があると思うのです。今時ナンバーと有効期限だけで認証が通ってしまうシステムってどうなのさっていう話で。

*1) どうやって算出するのかというと、『MOD10』アルゴリズムを用いて算出します。これについては他のサイトをご覧になったほうが容易に理解できると思います。このアルゴリズムの致命的な問題としては、残りの数値からチェックサムの値が一意に推測できてしまうという点でしょうか。これによって桁が1つ少なくできてしまうので。

2009/07/15

Pythonistaのための2chライブラリ"twopy"


"Beautiful Kuwait 2" by creativesam

概要

さて、実は以前からちょっと2chの文章を利用して、いろいろ弄くることができないかなぁとは思っていたんですが、残念な事に2ch用のpythonライブラリなんてマニアックなものは作っている人は誰もいない。
それじゃあ自分でなんとかしようの精神で作ってみようと。正直使う人が居るのかどうかは甚だ疑問なライブラリですが、損するわけじゃないので一応公開してみます。

というわけで、Pythonistaのための2chライブラリ"twopy"をリリースしました。
現在のところ単純なスレッド一覧の取得、スレッド上のコメント取得、コメント書き込みや新規スレッド機能に対応しておりますが、まだ完全に動作確認しているわけではないので使用は自己責任で。ちなみにライセンスはMITライセンスなんで、比較的自由に扱えると思います。改良はこれから始まる期末テストに飽きたらやると思います。

インストール方法

インストールに必要な環境は以下の通りです。
Python 2.5 or higher
2.6.2での環境で動作を確認。外部ライブラリに依存していないので、もしかしたらそれより前のヴァージョンでも動作するかもしれません。

インストール方法はCodeReposに上げておきますので、

$ svn checkout http://svn.coderepos.org/share/lang/python/twopy/trunk

なりなんなりでチェックアウトしてください。

簡単な使い方

スレッド一覧の取得
import twopy
b = twopy.Board("http://takeshima.2ch.net/news4vip/")
b.retrieve()

スレッドごとのタイトル、レス数、速度(res/h)を取得することができます。
for t in b:
print u"%s (%i) %.4f" % (t.title, t.res, t.velocity)

配列のように呼び出すことも可能です。
print b[0].title
print b[0].since


スレッドの内容の取得
t = b[0]
t.retrieve()

で一番上にあるスレッドの内容を取得します。
t = twopy.Thread(b, "1247375844.dat")
t = twopy.Thread.initWithURL("http://takeshima.2ch.net/test/read.cgi/news4vip/1247375844/")

として、datファイルあるいはURLから直接初期化することも可能です。

コメントを出力するには以下のようにループさせます。また、特定のコメントのみを取り出すこともできます。
for c in t: print c.render()
print t[1].render()

ただし、その場合の引数は実際のレス番号を指定する必要があります(0から始まるわけではない)。

コメントの抽出
特定のコメントのURLやレスポンスを抜き出すことができます。
for c in t: print c.extractResponses(returnType="comment")
for c in t: print c.extractUrls()

追記: 10/07/22
returnType引数は廃止され、メソッドとして分割されることになりました。
for c in t:
    print c.extractResponses()
    print c.extractResponsesAsInteger()
    print c.extractResponsesAsComment()

コメントの書き込み
特定のスレッドに対して、コメントを書き込むことができます。

t.post(name=u"", mailaddr=u"", message=u"")

ただし、2ch側の仕様により必ずしも書き込まれるとは限らず、確認が求められる場合がありますので、実際には以下のようにします。
r = t.post(name=u"", mailaddr=u"", message=u"")
if r[0] == twopy.STATUS_COOKIE:
    t.post(name=u"", mailaddr=u"", message=u"", hidden=r[2])

すべての確認作業を自動的に行うメソッドも存在します。

t.autopost(name=u"", mailaddr=u"", message=u"")

ただし、上2つのコードは2ch側の確認をユーザに見せることなく書き込みを行っていますので、実際にはユーザーに文章を見せてから、同意を行なわせる必要があるでしょう。

他にもスレッド作成機能などのいろいろ細々したのもありますが、それはソースコード見ればだいたい理解できると思います。行数そんな多くないですし。
もし正常に動かないなどのバグがありましたらご連絡お願いします。暇があれば対処したいと思います。それでは。

2009/07/14

ヤスオクと人間心理、上手い商売

新感覚オークション「ヤスオク」の仕組み - いぬビーム
http://d.hatena.ne.jp/kusigahama/20090713/1247446523

とりあえず何も読まずに開いて、どういうサイトなのか考えてみてください。

ヤスオク

内容は上の記事を読んでみれば分かるとして、なかなか上手い商売を考えつくものだなぁと思います。きな臭いとか、実際にやってみたいかどうかは別として。

さて、記事では胴元にとても有利なギャンブルとあります。それじゃあどれくらい有利なギャンブルであるのか、ちょっと確かめてみることにします。

まず、初めのオークション開始価格をS0、市場価格(この場合ですとamazonの価格ですね)をSm、入札単位金額をα、入札回数をn、入札手数料をpと定義すると、主催側の儲けは以下のように定式化できます。

Slastはオークションでの最終価格です。

逆に主催側の損失はSmだけです。これより、主催側の儲けと損失の和がちょうど0になるような入札回数n~は以下のような方程式を解けば算出できます。

これよりn~が求まったので、主催者が損しない最低限のラインである入札金額S~は以下のように求まります。

今回の場合ですとα=15、p=75、S0=0であるので、S~は

以上より、大体市場価格の17%くらいの価格を越えれば主催側は特をするわけです。言い換えれば83%オフの値段より落札価格が越えれば元がとれると。

このシステムの秀逸なところは、人間の価値関数を上手く利用している点にあります。プロスペクト理論によると、人間は損をすることを極端に嫌がります。そして殆どの場合、そのまま損失を認める選択肢を選ぶよりは、多少のリスクを背負ってでも損失を回避しようとする選択肢を選ぶわけです。今回の場合ですと75円損失して入札するというリスクを背負うわけですね。

それじゃあどうやって主催者を打ち負かせればいいのかというと実は簡単で、裏で話し合って誰も争うことなく次々と落札すればいいんです。いわゆる談合です。
ざっと利用規約を見た感じですと談合しないでくださいとは書いてありませんし、誰かやってくれないでしょうか(笑)

追記
typo ×ヤスログ ○ヤスオク
他、表記をより適切なものに修正致しました。