投稿

3月, 2020の投稿を表示しています

暗号アルゴリズムのなかのハッシュを実装してみる MD5からSHA-3まで

デジタルな暗号の実装はいろいろあるのだけど、中身はあまり把握していないなということで、暗号やハッシュの実装を見てみようと思いいくつか実装してみた。  暗号の中でも使われていることもあり、実装が簡単そうなのがハッシュ関数というわけなのか、最初に目についたからかハッシュのMD4、MD5からSHA-1、SHA-2、SHA-3を実装してみた。GitHubに公開してみたが、結局他の実装はあまり見なかったかもしれない。 入門程度に詳細は省略するのでソースかWikipediaでも見てもらえればハッシュの単純さがわかる。 ハッシュとは、データの固まりに固有の番号(乱数っぽいもの)を生成するアルゴリズムで、ダウンロードしたデータが正確かどうか判定するために使ってみたりする。 昔はチェックサムだとか、CRCだとかがあったところの延長線上でもあり。 結果が分散している、結果からデータを逆に辿れないというのもポイント。 構造は、入力データを512ビットや1024ビット毎に区切り、ビット演算を繰り返した結果256ビットくらいの結果が出力される。 1ビットの違いが出力のほぼ全ビットに影響するので同じ値を探すのも難しい。 入門レベルで書かれているものでは、1回の暗号の構造については書かれているが、初期値がどうなるとか繰り返しがどこからどこまでででどうなるのかなど、よくわからないことも多々ある。 実装するには、基本的にインターネット関連の情報はRFCを読めば見つかる。MD4、MD5などの廃止された古いものもしっかり残っているのはRFCのよいところ。SHA-3はまだRFCにはなさそうだ。日本語化されたものもIPAなどのサイトで見つかるかもしれない。 RFC 1319 MD2 RFC 1320 MD4 RFC 1321 MD5 RFC 3174,FIPS 180-1 SHA-1 RFC 6234,FIPS PUB 180-4 SHA-2, HMAC,HKDF FIPS PUB 202 SHA-3 ハッシュの基本 SHA-2までとSHA-3では違うので別々に。 内部状態を持っている MD5の場合 32bit a,b,c,d で128bit、SHA2-256はa,b,c,d,e,f,g,hで256bit、SHA2-512では64bitの8つで1024bitな