1 minute read

MD5 (RFC 1321)


  • word: 32 bit quantity
  • byte: 8 bit quantity
  • \(X <<< 3\): circularly rotating \(X\) by 3 times

MD5 Algorithm

To find the md5 for a message \(m\) of \(b\)-bits, where \(m\) can be visualized as

\[m_0 \, m_1 \, \cdots \, m_{b-1}\]

Step 1: Appending Padding Bits

The mesage is padded so that its length is congruent to \(448\), modulo \(512\). This means after padding the message length is 64 bits shy of being a multiple of 512. Formally:

\[m\_size \cong 448 \, (modulo \, 512)\]

Padding: to pad the message to the desired length, a single 1 bit is appended followed by 0 bits. At lease 1 bit (length \(447 \% %512\)) or at most 512 bit (already \(448\)).

Step 2: Append length

A 64-bit representation of \(b\) (length of the message before padding) is appeneded to the result of step 2. If \(b > 2^64\), only the lower 64 bits of b are used.

At this point the message is a multiple of \(512\) and multple of \(16\) (32 bit) words.

Now let the following denote the words of the resulting message where \(N\) is a multiple of 16

\[M[0,\, \cdots \,,N-1]\]

Step 3: Initialize MD Buffer

A buffer of four word (4 x 32 bit) \((A, B, C, D)\) is used to compute the MD5

\[word\, A:\, 01\, 23\, 45\, 67\] \[word\, B:\, 89\, ab\, cd\, ef\] \[word\, C:\, fe\, dc\, ba\, 98\] \[word\, D:\, 76\, 54\, 32\, 10\]

Step 4: Process Message in 16-Word Blocks (512 bits)

For every 512 bits, peform a set of complex operations on the buffer. These complex operations are bit wise parallel (see Step 4. Processing in 16-Word Blocks) for more information.

Step 5: Output

The final MD5 is just the concat the buffer DCBA