目次
この記事は、 SHA256を計算する in Pythonのステップ3です。
SHA-256 を計算するときに多用する関数を定義しておきます。
ビット演算については、2段階で定義します。
まずは \(\textrm{ROTL}^n\), \(\textrm{ROTR}^n\), \(\textrm{SHR}^n\) を定義します。 関数名はPDFに合わせて rotl
, rotr
, shr
にしています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
def rotl(n: int, x, w=32): """ rotate left :param x: w-bit word :param n: :param w: :return: """ assert 0 <= n < w assert 0 <= x < 2 ** w return (x << n) | (x >> (w - n)) def rotr(n: int, x, w=32): """ rotate right :param x: w-bit word :param n: :param w: :return: """ assert 0 <= n < w assert 0 <= x < 2 ** w return (x >> n) | (x << (w - n)) def shr(n: int, x, w=32): """ shift right :param x: w-bit word :param n: :param w: :return: """ assert 0 <= n < w assert 0 <= x < 2 ** w return x >> n |
それぞれの関数の最初の引数 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で書けるので、簡単に書けます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
def ch(x, y, z): return (x & y) ^ ((~x) & z) def maj(x, y, z): return (x & y) ^ (x & z) ^ (y & z) def sum_0(x): return rotr(2, x) ^ rotr(13, x) ^ rotr(22, x) def sum_1(x): return rotr(6, x) ^ rotr(11, x) ^ rotr(25, x) def sig_0(x): return rotr(7, x) ^ rotr(18, x) ^ shr(3, x) def sig_1(x): return rotr(17, x) ^ rotr(19, x) ^ shr(10, x) |
次は最後のステップ SHA-256の計算 です。