ハッシュ値 SHA-256 in Python – ビット演算の実装


この記事は、 SHA256を計算する in Pythonのステップ3です。

SHA-256 を計算するときに多用する関数を定義しておきます。

ビット演算については、2段階で定義します。

まずは ROTLn, ROTRn, SHRn を定義します。 関数名はPDFに合わせて rotl, rotr, shr にしています。

それぞれの関数の最初の引数 n は、 PDFでも n として表示されていたもので、 ROTLn, ROTRn, SHRn のように関数名の右肩に表示されています。 引数 w はワードサイズを表すもので、 SHA-256 では 32 です。

ROTL

ROTLn は、ビット配列を左にずらし、溢れたビットを右に挿入する関数です。 たとえば 7 (= 0b111) を rotl(2, 7, 4) で変換すると、 左に2ビットシフトされ (0b11100)、 4 bit のワードサイズから溢れた部分(0b1xxxx)が右に追加されて 29 (0b11101) になります。 結果の値は引数で与えられたワードサイズを超えるのですが、最終的な計算には影響しません。

ROTR

ROTLn は、ビット配列を右にずらし、溢れたビットを左に挿入する関数です。 たとえば 7 (= 0b111) を rotr(2, 7, 4) で変換すると、 4 bit のワードが右に2ビットシフトされ (0b01)、 7 を (4 – 2 =) 2 bit 左にシフトした値(0b11100)が左から追加されて 29 (0b11101) になります。 これも、結果の値は引数で与えられたワードサイズを超えるのですが、最終的な計算には影響しません。

SHR

SHRn は右にシフトする関数です。 多くのプログラミング言語では >> で記述できますね。

次に、 Maj, Ch, 0{256}, 1{256}, σ0{256}, σ1{256} を定義します。 PDFの記述をそのままPythonで書けるので、簡単に書けます。

次は最後のステップ SHA-256の計算 です。