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


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

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

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

まずは \(\textrm{ROTL}^n\), \(\textrm{ROTR}^n\), \(\textrm{SHR}^n\) を定義します。 関数名はPDFに合わせて rotl, rotr, shr にしています。

それぞれの関数の最初の引数 n は、 PDFでも \(n\) として表示されていたもので、 \(\textrm{ROTL}^n\), \(\textrm{ROTR}^n\), \(\textrm{SHR}^n\) のように関数名の右肩に表示されています。 引数 w はワードサイズを表すもので、 SHA-256 では 32 です。

ROTL

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

ROTR

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

SHR

\(\textrm{SHR}^n\) は右にシフトする関数です。 多くのプログラミング言語では >> で記述できますね。

次に、 \(\textit{Maj}\), \(\textit{Ch}\), \(\sum^{\{256\}}_0\), \(\sum^{\{256\}}_1\), \(\sigma^{\{256\}}_0\), \(\sigma^{\{256\}}_1\) を定義します。 PDFの記述をそのままPythonで書けるので、簡単に書けます。

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