I was recently trying to gain a better understanding of the SHA-512/256 algorithm and on this NIST example they use the word "abc" as the input. In the Block Contents, it shows the expected hexadecimal 616263
(abc), although why is it directly followed by 0x80
and 0x18
at the very end?
Block Contents:
W[ 0] = 6162638000000000
W[ 1] = 0000000000000000
W[ 2] = 0000000000000000
W[ 3] = 0000000000000000
W[ 4] = 0000000000000000
W[ 5] = 0000000000000000
W[ 6] = 0000000000000000
W[ 7] = 0000000000000000
W[ 8] = 0000000000000000
W[ 9] = 0000000000000000
W[10] = 0000000000000000
W[11] = 0000000000000000
W[12] = 0000000000000000
W[13] = 0000000000000000
W[14] = 0000000000000000
W[15] = 0000000000000018
I realize the zeros are padding, however, it's the 0x80
and 0x18
presence I'm not understanding.
It is the byte padding of SHA-512 encoded as the big-endian, simply
1
, that is the last 0x80
in the begging partNIST FIPS 180-4 on page 13 defines the padding scheme for SHA-512 as;
Suppose that the length of the message, $M$, is $\ell$ bits. Append the bit
1
to the end of the message, followed by $k$ zero bits, where $k$ is the smallest, non-negative solution to the equation $$\ell + 1 + k \equiv 896 \bmod 1024$$
Your message size is $\ell =24$ than
$$24 + 1 + k \equiv 896 \bmod 1024$$ solving for minimal $k = 896-24-1 = 871$. Therefore the padded message is
$$ \text{padded message } = \overbrace{M}^{24-bit} \mathbin\| \overbrace{1}^{1-bit} \mathbin\| \overbrace{000\cdots 000}^{871-bit\; 0s} \mathbin\| \overbrace{00000000\cdots00011000}^{128-\text{bit binary encoded length } \ell} $$
External links referenced by this document: