Генерация коллизий md5.

Discussion in 'Криптография, расшифровка хешей' started by Vlad1792, 19 Aug 2010.

  1. Byte_

    Byte_ Elder - Старейшина

    Joined:
    7 Sep 2008
    Messages:
    143
    Likes Received:
    34
    Reputations:
    2
    да, это
    2220412422
    -
    4275878552
    =
    -2055466130 (в десятичной)
     
  2. Vlad1792

    Vlad1792 New Member

    Joined:
    18 Aug 2010
    Messages:
    15
    Likes Received:
    2
    Reputations:
    0
    А в шестнадцатеричной системе счисления как отрицательные числа записываются?
    В смысле у них как и в десятичной знак ставится или у них какая - нибудь часть за знак отвечает?
     
  3. Monsieur

    Monsieur New Member

    Joined:
    17 Jan 2010
    Messages:
    11
    Likes Received:
    2
    Reputations:
    0
    Ни в коем случае знак не ставится. Это не очень легкий вопрос.
    Вот тут хорошая статья по этой теме. Ровно в середине рассказывается про отрицательные шестнадцатиричный числа.
     
    #23 Monsieur, 19 Aug 2010
    Last edited: 19 Aug 2010
  4. Vlad1792

    Vlad1792 New Member

    Joined:
    18 Aug 2010
    Messages:
    15
    Likes Received:
    2
    Reputations:
    0
    Спасибо. Сейчас почитаю.
     
  5. Monsieur

    Monsieur New Member

    Joined:
    17 Jan 2010
    Messages:
    11
    Likes Received:
    2
    Reputations:
    0
    Вот еще нашел по теме готовую программу. Только она на ассемблере :eek:
    Скачать: http://www.mestack.narod.ru/soft/set/MD5.RAR
    Скриншот: http://www.mestack.narod.ru/scr/MD5.JPG
     
  6. Vlad1792

    Vlad1792 New Member

    Joined:
    18 Aug 2010
    Messages:
    15
    Likes Received:
    2
    Reputations:
    0
    Да уж в коде на ассемблере будет трудно разобраться. Ну мне по крайней мере.
     
  7. Vlad1792

    Vlad1792 New Member

    Joined:
    18 Aug 2010
    Messages:
    15
    Likes Received:
    2
    Reputations:
    0
    Я реализовал этот алгоритм на C. Работает он так:
    берём нужный нам md5 хеш разбиваем его на 4 равные части, запускаем программу и вводим эти части начиная с правой. Например у нас есть хеш: d8578edf8458ce06fbc5bb76a58c5ca4
    Делим его на 4 части:
    d8578edf 8458ce06 fbc5bb76 a58c5ca4
    запускаем программу и вводим их в таком порядке:
    1. a58c5ca4
    2. fbc5bb76
    3. 8458ce06
    4. d8578edf
    программа выводит выравненное значение коллизии.
    Вот сам код:
    Code:
    #include <stdio.h>
    #include <stdlib.h>
    #include <math.h>
    #include <windows.h>
    
    DWORD cycler(DWORD a, int s) 
    {
      return (a>>s) | (a<<32-s);
    }
    DWORD F(DWORD x, DWORD y, DWORD z)
    {
    return ((x&y)|(~x&z));
    }
    
    DWORD G(DWORD x, DWORD y, DWORD z)
    {
    return ((x&z)|(~z&y));
    }
    
    DWORD H(DWORD x, DWORD y, DWORD z)
    {
    return (x^y^z);
    }
    
    DWORD I(DWORD x, DWORD y, DWORD z)
    {
    return (y^(~z|x));
    }
    
    int main()
    {
    DWORD A, B, C, D;
    scanf("%x", &A);
    scanf("%x", &B);
    scanf("%x", &C);
    scanf("%x", &D);
    A-=0x01234567;
    B-=0x89abcdef;
    C-=0xfedcba98;
    D-=0x76543210;
    DWORD X[16];
    int s[4];
    int k[16];
    k[0]=9;
    k[1]=2;
    k[2]=11;
    k[3]=4;
    k[4]=13;
    k[5]=6;
    k[6]=15;
    k[7]=8;
    k[8]=1;
    k[9]=10;
    k[10]=3;
    k[11]=12;
    k[12]=5;
    k[13]=14;
    k[14]=7;
    k[15]=0;
    s[0]=21;
    s[1]=15;
    s[2]=10;
    s[3]=6;
    int i;
    DWORD T[64];
    for(i=0;i<64;i++)
    T[i]=(unsigned long)(4294967296*fabs(sin(i+1)));
    int r=0;
    //Round 4
    for(i=0;i<16;i++,r++)
    {
     if(r==0)
     {
      X[k[i]] = cycler((B-C),s[r])-(I(C,D,A)+T[63-i]);
      B=0x00000000;
     }
     
     if(r==1)
     {
      X[k[i]] = cycler((C-D),s[r])-(I(D,A,B)+T[63-i]);
      C=0x00000000;
     } 
     
     if(r==2)
     {
      X[k[i]] = cycler((D-A),s[r])-(I(A,B,C)+T[63-i]);
      D=0x00000000;
     }
     
     if(r==3)
     {
      X[k[i]] = cycler((A-B),s[r])-(I(B,C,D)+T[63-i]);
      A=0x00000000;
      r=-1;
     } 
    }
    s[0]=23;
    s[1]=16;
    s[2]=11;
    s[3]=4;
    
    k[0]=2;
    k[1]=15;
    k[2]=12;
    k[3]=9;
    k[4]=6;
    k[5]=3;
    k[6]=0;
    k[7]=13;
    k[8]=10;
    k[9]=7;
    k[10]=4;
    k[11]=1;
    k[12]=14;
    k[13]=11;
    k[14]=8;
    k[15]=5;
    //Round 3 
    for(i=0, r=0;i<16;i++,r++)
    {
     if(r==0)
     {
      X[k[i]] = cycler((B-C),s[r])-(H(C,D,A)+T[47-i]);
      B=0x00000000;
     } 
     
     if(r==1)
     {
      X[k[i]] = cycler((C-D),s[r])-(H(D,A,B)+T[47-i]);
      C=0x00000000;
     }
     if(r==2)
     {
      X[k[i]] = cycler((D-A),s[r])-(H(A,B,C)+T[47-i]);
      D=0x00000000;
     }
     if(r==3)
     {
      X[k[i]] = cycler((A-B),s[r])-(H(B,C,D)+T[47-i]);
      A=0x00000000;
      r=-1;
     } 
    }
    
    s[0]=20;
    s[1]=14;
    s[2]=9;
    s[3]=5;
    
    k[0]=12;
    k[1]=7;
    k[2]=2;
    k[3]=13;
    k[4]=8;
    k[5]=3;
    k[6]=14;
    k[7]=9;
    k[8]=4;
    k[9]=15;
    k[10]=10;
    k[11]=5;
    k[12]=0;
    k[13]=11;
    k[14]=6;
    k[15]=1;
    
    //Round 2
    
    for(i=0, r=0;i<16;i++,r++)
    {
     if(r==0)
     {
      X[k[i]] = cycler((B-C),s[r])-(G(C,D,A)+T[31-i]);
      B=0x00000000;
     }
     if(r==1)
     {
      X[k[i]] = cycler((C-D),s[r])-(G(D,A,B)+T[31-i]);
      C=0x00000000;
     }
     if(r==2)
     {
      X[k[i]] = cycler((D-A),s[r])-(G(A,B,C)+T[31-i]);
      D=0x00000000;
     }
     if(r==3)
     {
      X[k[i]] = cycler((A-B),s[r])-(G(B,C,D)+T[31-i]);
      A=0x00000000;
      r=-1;
     } 
    }
    s[0]=22;
    s[1]=17;
    s[2]=12;
    s[3]=7;
    //Round 1
    X[15]=0x00000080; 
    X[14]=0x00000000;
    B = cycler((B-C),s[0])-(F(C,D,A)+T[15])-X[15];
    C = cycler((C-D),s[1])-(F(D,A,B)+T[14])-X[14];
    for(i=13, r=2;i>4;i--)
    {
    X[i]=0x00000000;
    if(r==0)
    B = cycler((B-C),s[r])-(F(C,D,A)+T[i])-X[i];
    if(r==1)
    C = cycler((C-D),s[r])-(F(D,A,B)+T[i])-X[i];
    if(r==2)
    D = cycler((D-A),s[r])-(F(A,B,C)+T[i])-X[i];
    if(r==3)
    A = cycler((A-B),s[r])-(F(B,C,D)+T[i])-X[i];
    }
    X[4]=0x10000000;
    A = cycler((A-B),s[3])-(F(B,C,D)+T[4])-X[4];
    for(i=0;i<4;i++)
    {
    DWORD An, Bn, Cn, Dn;
    if(i==0)
    {
    Bn=0x89abcdef;
    X[3-i] = cycler((B-C),s[r])-(F(C,D,A)+T[i])-Bn;
    B=Bn;
    }
    if(i==1)
    {
    Cn=0xfedcba98;
    X[3-i] = cycler((C-D),s[r])-(F(D,A,B)+T[i])-Cn;
    C=Cn;
    }
    if(i==2)
    {
    Dn=0x76543210;
    X[3-i] = cycler((D-A),s[r])-(F(A,B,C)+T[i])-Dn;
    D=Dn;
    }
    if(i==3)
    {
    An=0x01234567;
    X[3-i] = cycler((A-B),s[r])-(F(B,C,D)+T[i])-An;
    A=An;
    }
    }
    // Printing result
    for(i=0;i<16;i++)
    printf("%x", X[i]);
    printf("\n");
    system("PAUSE");
    return 0;
    }
    P.S
    Код довольно кривой. К тому же его можно сократить раза в два. И я пока не понял правильно она работает или нет.
     
    #27 Vlad1792, 19 Aug 2010
    Last edited: 19 Aug 2010
  8. Vlad1792

    Vlad1792 New Member

    Joined:
    18 Aug 2010
    Messages:
    15
    Likes Received:
    2
    Reputations:
    0
    Программа работает не верно. Ошибку пока не нашёл.
     
  9. Vlad1792

    Vlad1792 New Member

    Joined:
    18 Aug 2010
    Messages:
    15
    Likes Received:
    2
    Reputations:
    0
    >>А как она должна работать?
    Довольно странный вопрос. Она должна работать верно.