SHA1の解析(逆計算)
30分プログラム、その716。とある事情でSHA1の解析(逆計算)をしなければならなくなりました。就活をしてるわけではないんですけど、まあ流れというやつです。
で、全組合せに対してSHA1を計算して、それが目的のものと一致するかどうかを調べるというブルートフォースアタックをしかけています。カンで対象をアルファベット小文字だけに制限してます。
あと、SHA1の計算は、- http://journal.batard.info/post/2007/07/19/erlang-sha-1-libraryにあったライブラリを使わさせてもらいました。
使い方
% 答えがfooの場合 1> netagent:start(). *** 1 *** *** 2 *** *** 3 *** answer = "foo"
ソースコード
-module(netagent). -compile([export_all]). makePassword(Pid,0,S) -> Pid ! {password, S}; makePassword(Pid,N,S) -> lists:foreach(fun(C) -> makePassword(Pid,N-1,[C|S]) end, lists:seq($a,$z)). makePassword(Pid,N) -> makePassword(Pid,N,""), Pid ! done. checkPassword(Pid) -> Ans = "E5877EBE3560BE14D35C6EB96FFA38FEE97078F0", receive {password, S} -> case sha1:hexstring(S) == Ans of true -> Pid ! {ok,S}; _ -> checkPassword(Pid) end; done -> Pid ! done end. main(N) -> io:format("*** ~p ***~n",[N]), Self = self(), Check = spawn(fun () -> checkPassword(Self) end), spawn(fun () -> makePassword(Check,N) end), receive {ok,S} -> io:format("answer = ~p~n",[S]), ok; done -> main(N+1) end. start() -> main(1).