高校生がC#でSHA256暗号化アルゴリズムを完全独自実装してみた。content高校生がC#でSHA256暗号化アルゴリズムを完全独自実装してみた。CC#アルゴリズム暗号化sha256高校生の僕がSHA256暗号化アルゴリズムを外部ライブラリやランタイムに一切頼らず、独自で実装してみました。当記事は、マイクロソフト様にケンカを売る記事ではございません。前置きこの記事をご覧になっている方々は、様々な分野でお仕事をされている方がいらっしゃると思います。いった方々含め、プログラミングを実際にされていない方も「SHA256」という単語は一度でも目に入れた方も多くいらっしゃるのではないでしょうか。よって連邦情報処理標準とされた暗号化アルゴリズムのひとつです。SHA256の他にも、「SHA-1」や「SHA-512」といった多くの暗号化アルゴリズムがあります。そのひとつである「SHA-1」は、2017年にGoogleによって攻撃手段が公開され、それまでSHA-1を使用していたシステムは半強制的に、より安全な暗号化アルゴリズムへの移行を余儀なくされた。いう事件がありましたね。使って独自で実装してみたいと思います。ビットコインを支えているブロックチェーンでも、SHA-256は活躍しています。ブロックチェーンに関しましては、下記記事をご参照頂くとわかりやすいと思います。【Python】10分でイキリ高校生がブロックチェーンを初心者に解説してやる!!!SHA256の特徴ここまでで、様々な暗号化アルゴリズムがあることがわかりました。ここで、”困難”と言ったのは、総当り攻撃による突破が可能であるからです。論理的には、2^80(2の80乗)という回数総当たりを仕掛ければどれかが当たる、ということです。現在では、遥かに少ない2^63(2の63乗)という回数で突破できる手法が見つかっているそうです。▶SHA-1で使用された攻撃手法。衝突させることが困難である。簡単に言うと、異なる2つの平文から同一のハッシュ値が得られる脆弱性に強いということです。詳しく知りたい方は、下記の記事を参照下さい。巷で話題のGoogleのSHA-1衝突やってみた実装してみるここからは、実際にプログラムを書いてC#で暗号化アルゴリズムを再現してみたいと思います。大まかな処理フローかなり大雑把ではありますが、大まかな処理フローは以下の通りです。2.パディング処理パディング(Padding)と呼ばれる空埋め処理を行います。1ブロックのサイズは64byteですので、それ以下であれば空の部分を埋める必要があります。埋めるだけではダメです。例として以下のようなブロックがあったとします。14byte分足りません。これを、ただ埋めると何が起こるかは安易に予想できます。Xの部分を0で埋めたとすると、異なるブロックであっても全く同じメッセージブロックが生まれてしまいます。同じブロックが生まれる。そこで、もとのブロックのブロック長を末端に記録します。Bの部分がブロック長を記録した部分です。BBBBブロック長が64byte丁度だったり、万が一記録する余裕が無かっただった場合は次のブロックで記録します。3.ブロックをメッセージブロックに分割パディングが済んだ512byteのブロックを64byte長のメッセージブロックへと分割します。初回ラウンドでは、初期ベクトル(IV)を使用します。};5.合計64ラウンド処理を行う行う処理は簡単に以下の通りです。論理代数ここからは論理代数の分野です。正直なところ、僕もふわっとしか理解できていません。一通り調べてはみましたが、情報そのものが正しいものであるか区別する手段がありませんでしたので、あくまで参考として記載します。詳しい方がいらっしゃいましたら、コメント欄にて解説をお願い致します。25);}C#ソースコードここからは、実際のソースコードを紹介します。SHA256ハッシュを生成します。Stringを2進数に変換します。与えられた配列から定数Kを算出します。パディングと呼ばれる、空埋め処理を行います。パディングされた配列を512バイトのブロック長に分割します。ブロックを処理します。計算をより楽に、分かりやすくするためにStringとのペアを生成します。追記(2)より、一度byte[32]に変換しないと0が抜け落ちる模様。2進数を16進数の文字列に変換します。チャンクをバイナリに変換します。