Skip to content

Instantly share code, notes, and snippets.

Last active September 12, 2023 15:29
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save anonymous/fd1b15a02b1e1b5a826c108c4c84c064 to your computer and use it in GitHub Desktop.
Save anonymous/fd1b15a02b1e1b5a826c108c4c84c064 to your computer and use it in GitHub Desktop.
md5 propagation study
#include <stdlib.h>
#include <stdio.h>
#define BYTE_TO_BINARY_PATTERN "%c%c%c%c%c%c%c%c"
#define BYTE_TO_BINARY(byte) \
(byte & 0x80 ? '1' : '0'), \
(byte & 0x40 ? '1' : '0'), \
(byte & 0x20 ? '1' : '0'), \
(byte & 0x10 ? '1' : '0'), \
(byte & 0x08 ? '1' : '0'), \
(byte & 0x04 ? '1' : '0'), \
(byte & 0x02 ? '1' : '0'), \
(byte & 0x01 ? '1' : '0')
unsigned int rot(unsigned int val, unsigned int idx)
{
return val << idx | val >> (32 - idx);
}
unsigned int f(unsigned int A, unsigned int B, unsigned int C, unsigned int D){
unsigned int T = 0;
unsigned int n = 0;
unsigned int s = 0;
unsigned int index[16] = {7,12,17,22,5,9,14,20,4,11,16,23,6,10,15,21};
for(n = 0; n < 64; n++)
{
A = A | B | C | D;
s = 4 * (n % 16) + n % 4;
A = rot(A ,index[s]);
T = A;
A = D;
D = C;
C = B;
B = T;
printf("round %2i:",n);
printf(" "BYTE_TO_BINARY_PATTERN BYTE_TO_BINARY_PATTERN BYTE_TO_BINARY_PATTERN BYTE_TO_BINARY_PATTERN,
BYTE_TO_BINARY(A>>24), BYTE_TO_BINARY(A>>16), BYTE_TO_BINARY(A>>8), BYTE_TO_BINARY(A));
printf(" "BYTE_TO_BINARY_PATTERN BYTE_TO_BINARY_PATTERN BYTE_TO_BINARY_PATTERN BYTE_TO_BINARY_PATTERN,
BYTE_TO_BINARY(B>>24), BYTE_TO_BINARY(B>>16), BYTE_TO_BINARY(B>>8), BYTE_TO_BINARY(B));
printf(" "BYTE_TO_BINARY_PATTERN BYTE_TO_BINARY_PATTERN BYTE_TO_BINARY_PATTERN BYTE_TO_BINARY_PATTERN,
BYTE_TO_BINARY(C>>24), BYTE_TO_BINARY(C>>16), BYTE_TO_BINARY(C>>8), BYTE_TO_BINARY(C));
printf(" "BYTE_TO_BINARY_PATTERN BYTE_TO_BINARY_PATTERN BYTE_TO_BINARY_PATTERN BYTE_TO_BINARY_PATTERN,
BYTE_TO_BINARY(D>>24), BYTE_TO_BINARY(D>>16), BYTE_TO_BINARY(D>>8), BYTE_TO_BINARY(D));
printf("\n");
if(A == B && A == C && A == D && A == 0xFFFFFFFF)
return n;
}
return 64;
}
int main()
{
unsigned int res[128];
unsigned int i;
unsigned int max = 0;
for(i = 0; i < 32; i ++)
{
printf("%8x\n",1 << i);
res[i] = f(0,0,0,1 << i);
}
for(i = 0; i < 32; i ++)
{
printf("%8x\n",1 << i);
res[32+i] = f(0,0, 1 << i,0);
}
for(i = 0; i < 32; i ++)
{
printf("%8x\n",1 << i);
res[64+i] = f(0,1 << i,0,0);
}
for(i = 0; i < 32; i ++)
{
printf("%8x\n",1 << i);
res[96+i] = f(1 << i,0,0,0);
}
for(i = 0; i < 128; i++){
if(res[i] > max)
max = res[i];
}
printf("max num of rounds: %i\n",max);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment