TL;DR









【総当たりによるパスワード解読にかかる時間】

SHA-256(No Stretching/Salt)を仮定したRTX 4070(8031.8 MH/s)による平均計算時間です。

L数字英小文字数/英大小数/英/記*日本語
4<< 1 ms<< 1 ms<< 1 ms0.26秒29分
5<< 1 ms<< 1 ms57 ms68秒46日
6<< 1 ms19 ms3.5秒4.8時間300年
7<< 1 ms0.50秒3.6分302日0.67百万年
86.2 ms13秒3.8時間36年20億年
962 ms5.6分10日9.1万年2.0兆年
100.62秒2.4時間1.7年2.4百万年2.0京年
116.2秒2.7日100年5.9億年0.20垓年
121.0分69日6.3千年1500億年200垓年
1310分5.0年39万年37兆年20万垓年
141.7時間130年2400万年9.7京年2.0億垓年
1517時間3.4千年15億年2.6垓年2.0千億垓年
167.2日8.7万年950億年6.3垓年2.0兆垓年
1772日2.2百万年5.9兆年1.6千垓年2.0京垓年
182.0年5700万年360兆年41万垓年2.0*10^42年





アルゴリズムの策定









現在,ハッシュ関数として知られる一方向性関数は数多く存在し,例えばMD5を筆頭としてSHA-224〜SHA-512やSHA3-224〜SHA3-512などは有名です。

ここでは,問題の簡素化のためストレッチングなし・ソルトなしのSHA-256を仮定して,文字数と文字範囲が既知の場合の平均計算時間と必要コストの推定を行います。

まず1秒間に計算できるSHA-256の数を求めます。

なお入力値の長さによって計算量に多少の差異はありますが,線形時間の差であるため切り捨てて考えます。というかSHA-256は64バイトのブロックに分割して処理を行うため,入力長がそれ以下であれば無関係です。

まず,GPUに最適化されているhashcatで計算速度を評価します。






手元の2023年に販売開始されたミドルレンジGPU「GeForce RTX 4070」では,毎秒約80億のハッシュが計算できることが分かりました(ハッシュレートは8031.8 MH/s)。




計算時間の推定









次に利用する文字の種類ごとに1文字あたりのパターン数を調べます。ここでは以下の組み合わせを考えることにしました。

数字(10通り)
英小文字(26通り)
数字+英大小文字(62通り)
数字+英大小文字+記号(255通り)
平仮名+片仮名+常用漢字(2298通り)





※最後の「平仮名+片仮名+常用漢字」は日本語こそ最強のセキュリティ説を検証するためのネタ枠であるため,細かいことは気にしないでください。というかもはや1バイトですらないような気がしますが!

1文字あたりのパターン数を$N$通りとすると,当然文字数$L$を指数として$N^L$通りの組み合わせになります。ここでは現実的によくある $ 4 \leqq L \leqq 18 $ として,有効数字2桁で組み合わせ数を一覧にしてみます。

L数字 (10通り)英小文字 (26通り)数字+英大小文字 (62通り)数字+英大小文字+記号 (255通り)平仮名+片仮名+常用漢字 (2298通り)
41.0 * 10^44.6 * 10^51.5 * 10^74.2 * 10^92.8 * 10^13
51.0 * 10^51.2 * 10^79.2 * 10^81.1 * 10^126.4 * 10^16
61.0 * 10^63.1 * 10^85.7 * 10^102.8 * 10^141.5 * 10^20
71.0 * 10^78.0 * 10^93.5 * 10^127.0 * 10^163.4 * 10^23
81.0 * 10^82.1 * 10^112.2 * 10^141.8 * 10^197.8 * 10^26
91.0 * 10^95.4 * 10^121.4 * 10^164.6 * 10^211.8 * 10^30
101.0 * 10^101.4 * 10^148.4 * 10^171.2 * 10^244.1 * 10^33
111.0 * 10^113.7 * 10^155.2 * 10^193.0 * 10^269.5 * 10^36
121.0 * 10^129.6 * 10^163.2 * 10^217.6 * 10^282.2 * 10^40
131.0 * 10^132.5 * 10^182.0 * 10^231.9 * 10^315.0 * 10^43
141.0 * 10^146.4 * 10^191.2 * 10^254.9 * 10^331.2 * 10^47
151.0 * 10^151.7 * 10^217.7 * 10^261.3 * 10^362.6 * 10^50
161.0 * 10^164.4 * 10^224.8 * 10^283.2 * 10^386.1 * 10^53
171.0 * 10^171.1 * 10^243.0 * 10^308.2 * 10^401.4 * 10^57
181.0 * 10^182.9 * 10^251.8 * 10^322.1 * 10^433.2 * 10^60





そしてさきほど得られたハッシュレート 8031.8 MH/s を元に,それぞれの組み合わせの数の半分を計算するのにかかる時間を見積もります。

L数字 (10通り)英小文字 (26通り)数字+英大小文字 (62通り)数字+英大小文字+記号 (255通り)平仮名+片仮名+常用漢字 (2298通り)
4<< 1 ms<< 1 ms<< 1 ms0.26秒29分
5<< 1 ms<< 1 ms57 ms68秒46日
6<< 1 ms19 ms3.5秒4.8時間300年
7<< 1 ms0.50秒3.6分302日0.67百万年
86.2 ms13秒3.8時間36年20億年
962 ms5.6分10日9.1万年2.0兆年
100.62秒2.4時間1.7年2.4百万年2.0京年
116.2秒2.7日100年5.9億年0.20垓年
121.0分69日6.3千年1500億年200垓年
1310分5.0年39万年37兆年20万垓年
141.7時間130年2400万年9.7京年2.0億垓年
1517時間3.4千年15億年2.6垓年2.0千億垓年
167.2日8.7万年950億年6.3垓年2.0兆垓年
1772日2.2百万年5.9兆年1.6千垓年2.0京垓年
182.0年5700万年360兆年41万垓年2.0*10^42年








最後に









本記事では,総当たりによるパスワード解読にかかる時間をフェルミ推定に類似した方法で概算しました。安全性と利便性のつり合いを考えると,今のところ「数字,英語の小文字と大文字,記号を混合させた8文字以上」が一番良さそうです。

技術の進歩により,それもやがて簡単に解けるようになるかもしれませんが...。

また,逆に18文字のとき「平仮名+片仮名+常用漢字」は,$2.0 × 10^{42}$年という途方もない時間になってしまいました。パスワードを得るのと,観測可能な宇宙に存在する全ての陽子が崩壊するのは,どちらが先なのか悩ましいところではあります。

※あくまでも高校生が趣味程度に作成した表であり,信憑性は保証できかねますので,論文等への引用はお控えください。また,多くの環境では実際にはストレッチングやソルトの付加が行われており,計算時間が大きく異なる可能性があります。