Note that there are some explanatory texts on larger screens.

plurals
  1. PO
    primarykey
    data
    text
    <p>I don't think so.</p> <p>There is no easy way to show why it's not possible. If there was, then this would itself be the basis of an algorithm to find collisions.</p> <p>Longer analysis: </p> <p>The preprocessing makes sure that there is always at least one <code>1</code> bit in the input.</p> <p>The loop over <code>w[i]</code> will leave the original stream alone, so there is at least one 1 bit in the input (words 0 to 15). Even with clever design of the bit patterns, at least some of the values from 0 to 15 must be non-zero since the loop doesn't affect them.</p> <p>Note: <code>leftrotate</code> is circular, so no 1 bits will get lost.</p> <p>In the main loop, it's easy to see that the factor <code>k</code> is never zero, so <code>temp</code> can't be zero for the reason that all operands on the right hand side are zero (<code>k</code> never is).</p> <p>This leaves us with the question whether you can create a bit pattern for which <code>(a leftrotate 5) + f + e + k + w[i]</code> returns 0 by overflowing the sum. For this, we need to find values for <code>w[i]</code> such that <code>w[i] = 0 - ((a leftrotate 5) + f + e + k)</code></p> <p>This is possible for the first 16 values of <code>w[i]</code> since you have full control over them. But the words 16 to 79 are again created by <code>xor</code>ing the first 16 values.</p> <p>So the next step could be to unroll the loops and create a system of linear equations. I'll leave that as an exercise to the reader ;-) The system is interesting since we have a loop that creates additional equations until we end up with a stable result.</p> <p>Basically, the algorithm was chosen in such a way that you can create individual 0 words by selecting input patterns but these effects are countered by <code>xor</code>ing the input patterns to create the 64 other inputs.</p> <p>Just an example: To make <code>temp</code> 0, we have</p> <pre><code>a = h0 = 0x67452301 f = (b and c) or ((not b) and d) = (h1 and h2) or ((not h1) and h3) = (0xEFCDAB89 &amp; 0x98BADCFE) | (~0x98BADCFE &amp; 0x10325476) = 0x98badcfe e = 0xC3D2E1F0 k = 0x5A827999 </code></pre> <p>which gives us <code>w[0] = 0x9fb498b3</code>, etc. This value is then used in the words 16, 19, 22, 24-25, 27-28, 30-79.</p> <p>Word 1, similarly, is used in words 1, 17, 20, 23, 25-26, 28-29, 31-79.</p> <p>As you can see, there is a lot of overlap. If you calculate the input value that would give you a 0 result, that value influences at last 32 other input values.</p>
    singulars
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. VO
      singulars
      1. This table or related slice is empty.
    2. VO
      singulars
      1. This table or related slice is empty.
    3. VO
      singulars
      1. This table or related slice is empty.
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload