Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Алгоритм MD2

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Без описания
Robotex
Отправлено: 18 Февраля, 2011 - 04:27:56
Post Id


Новичок


Покинул форум
Сообщений всего: 22
Дата рег-ции: Март 2009  


Помог: 0 раз(а)




Написал свою реализацию алгоритма MD2. Но вот почему-то он генерирует неправильный хеш (не совпадает с эталоном), хотя код уже несколько раз перепроверил. В чем я ошибся?
CODE (htmlphp):
скопировать код в буфер обмена
  1. <?php
  2.  
  3.         $S = array(
  4.    41,  46,  67, 201, 162, 216, 124,   1,  61,  54,  84, 161, 236, 240,   6,  19,
  5.    98, 167,   5, 243, 192, 199, 115, 140, 152, 147,  43, 217, 188,  76, 130, 202,
  6.    30, 155,  87,  60, 253, 212, 224,  22, 103,  66, 111,  24, 138,  23, 229,  18,
  7.   190,  78, 196, 214, 218, 158, 222,  73, 160, 251, 245, 142, 187,  47, 238, 122,
  8.   169, 104, 121, 145,  21, 178,   7,  63, 148, 194,  16, 137,  11,  34,  95,  33,
  9.   128, 127,  93, 154,  90, 144,  50,  39,  53,  62, 204, 231, 191, 247, 151,   3,
  10.   255,  25,  48, 179,  72, 165, 181, 209, 215,  94, 146,  42, 172,  86, 170, 198,
  11.    79, 184,  56, 210, 150, 164, 125, 182, 118, 252, 107, 226, 156, 116,   4, 241,
  12.    69, 157, 112,  89, 100, 113, 135,  32, 134,  91, 207, 101, 230,  45, 168,   2,
  13.    27,  96,  37, 173, 174, 176, 185, 246,  28,  70,  97, 105,  52,  64, 126,  15,
  14.    85,  71, 163,  35, 221,  81, 175,  58, 195,  92, 249, 206, 186, 197, 234,  38,
  15.    44,  83,  13, 110, 133,  40, 132,   9, 211, 223, 205, 244,  65, 129,  77,  82,
  16.   106, 220,  55, 200, 108, 193, 171, 250,  36, 225, 123,   8,  12, 189, 177,  74,
  17.   120, 136, 149, 139, 227,  99, 232, 109, 233, 203, 213, 254,  59,   0,  29,  57,
  18.   242, 239, 183,  14, 102,  88, 208, 228, 166, 119, 114, 248, 235, 117,  75,  10,
  19.    49,  68,  80, 180, 143, 237,  31,  26, 219, 153, 141,  51, 159,  17, 131,  20);
  20.    
  21.         $input_string = "";
  22.         echo "Input string: ".$input_string."<br />";
  23.  
  24.         $input_array = array();
  25.  
  26.         for($i=0;$i<strlen($input_string);$i++)
  27.         {
  28.           $input_array[$i] = $input_string[$i];
  29.         }
  30.        
  31.         $length = count($input_array);
  32.         echo "String length: ".$length."<br />";
  33.        
  34.         $pad = 16 - $length%16;
  35.         echo "Padding by ".$pad." symbols<br />";
  36.        
  37.         for($i=$length;$i<$length+$pad;$i++)
  38.         {
  39.           $input_array[$i] = $pad;
  40.         }
  41.        
  42.         $length += $pad;
  43.        
  44.         echo "Now input_array are:<br /><pre>";
  45.  var_dump($input_array);
  46.  echo "</pre>";
  47.  echo "New length: ".$length."<br />";
  48.        
  49.         $C = array();
  50.        
  51.         for($i=0;$i<16;$i++)
  52.         {
  53.           $C[$i] = 0;
  54.         }
  55.          
  56.         $L = 0;
  57.        
  58.         for($i = 0;$i<$length/16;$i++)
  59.  {
  60.    for($j = 0;$j<16;$j++)
  61.    {
  62.      $c = $input_array[$i*16+$j];
  63.      $C[$j] = $C[$j] ^ $S[$c ^ $L];
  64.      $L = $C[$j];
  65.    }
  66.  }
  67.  
  68.  echo "Array C:<br /><pre>";
  69.  var_dump($C);
  70.  echo "</pre>";
  71.  
  72.  for($i=0;$i<count($C);$i++)
  73.         {
  74.           $input_array[$length+$i] = $C[$i];
  75.         }
  76.        
  77.         $length += count($C);
  78.  
  79.  echo "Now input_array are:<br /><pre>";
  80.  var_dump($input_array);
  81.  echo "</pre>";
  82.  echo "New length: ".$length."<br />";
  83.  
  84.  $X = array();
  85.  
  86.  for($i=0;$i<48;$i++)
  87.  {
  88.    $X[$i] = 0;
  89.  }
  90.  
  91.  for($i = 0;$i<$length/16;$i++)
  92.  {
  93.    for($j = 0;$j<16;$j++)
  94.    {
  95.      $X[16+j] = $input_array[$i*16+$j];
  96.      $X[32+j] = ($X[16+j] ^ $X[j]);
  97.    }
  98.  
  99.    $t = 0;
  100.  
  101.    for($j = 0;$j<18;$j++)
  102.    {
  103.      for($k = 0;$k<48;$k++)
  104.      {
  105.        $t = ($X[$k] ^ $S[$t]);
  106.        $X[$k] = ($X[$k] ^ $S[$t]);
  107.      }
  108.  
  109.      $t = ($t+$j)%256;
  110.    }
  111.  }
  112.    
  113.  echo "Array X:<br /><pre>";
  114.  var_dump($X);
  115.  echo "</pre>";
  116.  
  117.  $result = "";
  118.  
  119.  for($i=0;$i<16;$i++)
  120.  {
  121.    $result .= dechex($X[$i]);
  122.  }
  123.  
  124.  echo "MD2 Hash: ".$result."<br />";
  125.  echo "Etalon: ".hash("md2", $input_string)."<br />";
  126.        
  127. ?>
 
 Top
JustUserR
Отправлено: 18 Февраля, 2011 - 11:13:52
Post Id



Активный участник


Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009  


Помог: 17 раз(а)




Robotex Возможной причиной осуществления некорректного функционирования предполагаемого PHP-приложения обеспечивающего генерации элементоа MD2-кода для заданного строкового информационного поля - является включение эффектов связанных с применение механизма автоматического преобразования типов данных и изменения элементного трактования в языке PHP - в частности возможно использования операций с информационными полями и локальными константами для которых осуществляется несогласованный выбор объектного уровня трактования к выполнение несоответственной операции - кроме того возможной причиной рассогласнования результата может являться обеспечение включения побитовых операций при условии несовпадения размера контейрнего битового поля


-----
Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик Улыбка
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
 
 Top
Robotex
Отправлено: 18 Февраля, 2011 - 16:21:53
Post Id


Новичок


Покинул форум
Сообщений всего: 22
Дата рег-ции: Март 2009  


Помог: 0 раз(а)




Как задавать в PHP размер и тип? Вообще, есть в нем тип byte или char?
 
 Top
JustUserR
Отправлено: 19 Февраля, 2011 - 21:57:29
Post Id



Активный участник


Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009  


Помог: 17 раз(а)




Robotex пишет:
Как задавать в PHP размер и тип? Вообще, есть в нем тип byte или char?
Использование языка PHP для разработки приложения предполагает осуществление автоматической конверсии информационных полей без обеспечения строгого контроля типов элементов данных - тем не менее для осуществления работы с элементами двоичных данных возможно использование их трактования в виде строковых контейнерных объектов с последующим применением функций типа pack/unpack


-----
Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик Улыбка
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
 
 Top
Robotex
Отправлено: 20 Февраля, 2011 - 19:16:45
Post Id


Новичок


Покинул форум
Сообщений всего: 22
Дата рег-ции: Март 2009  


Помог: 0 раз(а)




Переписал на С, хеш другой, но тоже неправильный.

CODE (htmlphp):
скопировать код в буфер обмена
  1.  
  2. #include <iostream>
  3. #include <iomanip>
  4. using namespace std;
  5.  
  6. unsigned char PI_SUBST[] = {
  7.     41,  46,  67, 201, 162, 216, 124,   1,  61,  54,  84, 161, 236, 240,   6,  19,
  8.     98, 167,   5, 243, 192, 199, 115, 140, 152, 147,  43, 217, 188,  76, 130, 202,
  9.     30, 155,  87,  60, 253, 212, 224,  22, 103,  66, 111,  24, 138,  23, 229,  18,
  10.    190,  78, 196, 214, 218, 158, 222,  73, 160, 251, 245, 142, 187,  47, 238, 122,
  11.    169, 104, 121, 145,  21, 178,   7,  63, 148, 194,  16, 137,  11,  34,  95,  33,
  12.    128, 127,  93, 154,  90, 144,  50,  39,  53,  62, 204, 231, 191, 247, 151,   3,
  13.    255,  25,  48, 179,  72, 165, 181, 209, 215,  94, 146,  42, 172,  86, 170, 198,
  14.     79, 184,  56, 210, 150, 164, 125, 182, 118, 252, 107, 226, 156, 116,   4, 241,
  15.     69, 157, 112,  89, 100, 113, 135,  32, 134,  91, 207, 101, 230,  45, 168,   2,
  16.     27,  96,  37, 173, 174, 176, 185, 246,  28,  70,  97, 105,  52,  64, 126,  15,
  17.     85,  71, 163,  35, 221,  81, 175,  58, 195,  92, 249, 206, 186, 197, 234,  38,
  18.     44,  83,  13, 110, 133,  40, 132,   9, 211, 223, 205, 244,  65, 129,  77,  82,
  19.    106, 220,  55, 200, 108, 193, 171, 250,  36, 225, 123,   8,  12, 189, 177,  74,
  20.    120, 136, 149, 139, 227,  99, 232, 109, 233, 203, 213, 254,  59,   0,  29,  57,
  21.    242, 239, 183,  14, 102,  88, 208, 228, 166, 119, 114, 248, 235, 117,  75,  10,
  22.     49,  68,  80, 180, 143, 237,  31,  26, 219, 153, 141,  51, 159,  17, 131,  20
  23. };
  24.  
  25. struct HexCharStruct
  26. {
  27.   unsigned char c;
  28.   HexCharStruct(unsigned char _c) : c(_c) { }
  29. };
  30.  
  31. inline std::ostream& operator<<(std::ostream& o, const HexCharStruct& hs)
  32. {
  33.  return (o << std::hex << (int)hs.c);
  34. }
  35.  
  36. inline HexCharStruct hex(unsigned char _c)
  37. {
  38.   return HexCharStruct(_c);
  39. }
  40.    
  41. void md2()
  42. {
  43.     unsigned char input_array[32];
  44.     int length = 0;
  45.  
  46.     unsigned char pad = 16;
  47.  
  48.     for(unsigned int j = length;j<length+pad;j++)
  49.    {
  50.        input_array[j] = pad;
  51.    }
  52.  
  53.    length += pad;
  54.  
  55.  
  56.    unsigned char C[16];
  57.  
  58.    for(unsigned char i=0;i<16;i++)
  59.        C[i] = 0;
  60.  
  61.    unsigned char L = 0;
  62.  
  63.    for(unsigned int i = 0;i<length/16;i++)
  64.    {
  65.        for(unsigned char j = 0;j<16;j++)
  66.        {
  67.            unsigned char c = input_array[i*16+j];
  68.            C[j] = C[j] ^ PI_SUBST[c ^ L];
  69.            L = C[j];
  70.        }
  71.    }
  72.  
  73.    for(unsigned char i=0;i<16;i++)
  74.        input_array[16+i] = C[i];
  75.  
  76.    length = 32;
  77.  
  78.    unsigned char X[48];
  79.  
  80.    for(unsigned char i=0;i<48;i++)
  81.        X[i] = 0;
  82.  
  83.    for(unsigned int i = 0;i<length/16;i++)
  84.    {
  85.        for(unsigned char j = 0;j<16;j++)
  86.        {
  87.            X[16+j] = input_array[i*16+j];
  88.            X[32+j] = (X[16+j] ^ X[j]);
  89.        }
  90.  
  91.        unsigned char t = 0;
  92.  
  93.        for(unsigned char j = 0;j<18;j++)
  94.        {
  95.            for(unsigned char k = 0;k<48;k++)
  96.            {
  97.                t = (X[k] ^ PI_SUBST[t]);
  98.                X[k] = (X[k] ^ PI_SUBST[t]);
  99.            }
  100.  
  101.            t = (t+j)%256;
  102.        }
  103.    }
  104.  
  105.    for(unsigned char i =0;i<16;i++)
  106.    {
  107.        cout << hex(X[i]);
  108.    }
  109.    
  110.    cout << endl;
  111. }
  112.  
  113. int main()
  114. {
  115.  md2();
  116.  return 0;
  117. }
  118.  
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Программирование на PHP »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB