本日はクラウドワークスに出ていた
ツール作成の依頼のお値段のお話です

解説動画はこちら



さて
まずはこの求人の方ですが
こちらです。

sha256の逆変換ツール


さて仕事内容を見てみましょう。

お題:sha256の逆変換ツール

固定報酬制 100,000円 〜 300,000円

仕事の詳細
任意のHash(64桁)の入力値に対し
sha256の逆変換を10秒以内で
求めるプログラムを作成して下さい

例1:
b924ed427f4540e17a6c669982bf2373f2974f6733b7a737a08a6c49b0f70b81   <==入力値

(逆変換)↓  ↑ (Sha256)

eb6019e16fc6169662a87df672554ea74365bca49bae3f76200e33622c3f0335   <==求めてほしいもの

これがどれだけ大変なお仕事か・・・

まずはこのsha256についてですが

読み:しゃーにごろ 
などの読み方です。

Secure Hash Algorithm 256-bitの略で
任意の長さのデータから固定長の
出力データを返すハッシュ関数の一つです。

256ビット(32バイト)長の
ハッシュ値を得ることができますが
データを一方向にしか変換できず
ハッシュ化されたデータを
元のデータに戻すことは基本的にできません。

暗号は復号を行って元の値をみる事ができますが
ハッシュは一方的な変換のため
元の値を参照できません。

ですので、この依頼は
かなり難しい内容である事が分かると思います。

Pythonではこのハッシュ化は
簡単に行う事ができます。

次のようなコードで文字列を
ハッシュ化する事ができます。
import hashlib

text = "otupy"
hash_text = hashlib.sha256(text.encode()).hexdigest()
print(hash_text)
f662f0d21fac3d9c5903e24b81ce4a2f5a5557258378db2ab79e464e27c4c2b0

もし逆変換のツールを作るとしたら
何回も入力値を変えてハッシュ化して
そのハッシュ値と合うかどうかを
試していくしかありません。

仮で英数字の36種類で
文字数別での総当たり回数を求めてみると
for i in range(1,11):
    print('文字数 : {0:02}文字 , 回数{1:020,}'.format(i,36 ** i))
文字数 : 01文字 , 回数0,000,000,000,000,036
文字数 : 02文字 , 回数0,000,000,000,001,296
文字数 : 03文字 , 回数0,000,000,000,046,656
文字数 : 04文字 , 回数0,000,000,001,679,616
文字数 : 05文字 , 回数0,000,000,060,466,176
文字数 : 06文字 , 回数0,000,002,176,782,336
文字数 : 07文字 , 回数0,000,078,364,164,096
文字数 : 08文字 , 回数0,002,821,109,907,456
文字数 : 09文字 , 回数0,101,559,956,668,416
文字数 : 10文字 , 回数3,656,158,440,062,976

こんな感じになりました。
10文字のハッシュ化の答え合わせでも
桁がわからないくらい多いですね。

これが64文字だとしたら・・・

4011991914547630480065053387702443812690402487741812225955731622655455723258857248542161222254985216

最低でもこれくらいの回数です。

漢字や平仮名、記号なども含めたら
途方もない文字種類になるので
さらに回数は増えてしまいます。

現実的には64文字での復号は無理でしょう。

少ない文字種、文字数であれば
次のようなプログラムで
総当たりで解く事ができます。
import hashlib
import string
import itertools

text = "otupy"
repeat = 5
text = text[0:repeat]

answer = hashlib.sha256(text.encode()).hexdigest()
print('answer : {0}'.format(answer))
st = string.ascii_lowercase + string.digits
print('文字種 : {0}'.format(st))

for s in itertools.product(st,repeat=repeat):
    hash_text = hashlib.sha256(''.join(s).encode()).hexdigest()
    if hash_text == answer:
        print(''.join(s))
        break
answer : f662f0d21fac3d9c5903e24b81ce4a2f5a5557258378db2ab79e464e27c4c2b0
文字種 : abcdefghijklmnopqrstuvwxyz0123456789
otupy

と言う事で64桁なら
物凄い台数のPCを用意して上げて
総当たりを実行すれば解けるかもしれません。

1台100万円でも
10**100台ほど用意して
あげれば良いかもしれません。

解けたころには
地球はないかもしれませんがね。


さて
なかなか面白い仕事でしたねーー
クラウドワークス

たまに覗いてみると
面白い仕事が
見つかるかもしれませんよ

今回はこれまでです
それでは。