Сейчас на форуме: -Sanchez- (+7 невидимых)

 eXeL@B —› Основной форум —› Что за алгоритм?
Посл.ответ Сообщение

Ранг: 112.9 (ветеран), 186thx
Активность: 0.090.01
Статус: Участник

Создано: 27 октября 2015 13:34 · Поправил: vden
· Личное сообщение · #1

Возможно, какой-то известный алгоритм?

Это какая-то трансформация байта.

Code:
  1. int transform_byte_C754(int a1, signed int a2)
  2. {
  3.   int result; // r0@1
  4.   signed int i; // r3@1
  5.   int sign; // r4@4
  6.  
  7.   result = 0;
  8.   for ( i = 0; i < 8; i = (unsigned __int8)(i + 1) )
  9.   {
  10.     if ( a2 & 1 )
  11.       result ^= a1;
  12.     sign = a1 & 0x80;
  13.     a1 = 2 * a1 & 0xFF;
  14.     if ( sign == 0x80 )
  15.       a1 ^= 0x1Bu;
  16.     a2 >>= 1;
  17.   }
  18.   return result;
  19. }


Трансформация дворда.

Code:
  1. void transform_dword_C788(_BYTE *buf, int ofs)
  2. {
  3.   unsigned __int8 b0; // ST00_1@1
  4.   unsigned __int8 b1; // ST01_1@1
  5.   unsigned __int8 b2; // ST02_1@1
  6.   unsigned __int8 b3; // ST03_1@1
  7.  
  8.   b0 = buf[ofs];
  9.   b1 = buf[ofs + 1];
  10.   b2 = buf[ofs + 2];
  11.   b3 = buf[ofs + 3];
  12.  
  13.   buf[ofs] = transform_byte_C754(14, b0);
  14.   buf[ofs] ^= transform_byte_C754(9, b3);
  15.   buf[ofs] ^= transform_byte_C754(13, b2);
  16.   buf[ofs] ^= transform_byte_C754(11, b1);
  17.  
  18.   buf[ofs + 1] = transform_byte_C754(14, b1);
  19.   buf[ofs + 1] ^= transform_byte_C754(9, b0);
  20.   buf[ofs + 1] ^= transform_byte_C754(13, b3);
  21.   buf[ofs + 1] ^= transform_byte_C754(11, b2);
  22.  
  23.   buf[ofs + 2] = transform_byte_C754(14, b2);
  24.   buf[ofs + 2] ^= transform_byte_C754(9, b1);
  25.   buf[ofs + 2] ^= transform_byte_C754(13, b0);
  26.   buf[ofs + 2] ^= transform_byte_C754(11, b3);
  27.  
  28.   buf[ofs + 3] = transform_byte_C754(14, b3);
  29.   buf[ofs + 3] ^= transform_byte_C754(9, b2);
  30.   buf[ofs + 3] ^= transform_byte_C754(13, b1);
  31.   buf[ofs + 3] ^= transform_byte_C754(11, b0);
  32. }


Большая трансформация.

Code:
  1. void __fastcall transform_C8C6(_BYTE (*data)[8][8])
  2. {
  3.   signed int i; // r5@1
  4.   signed int j; // r4@2
  5.   signed int m; // r4@8
  6.   signed int l; // r5@11
  7.   signed int n; // r5@13
  8.   signed int ii; // r5@16
  9.   signed int jj; // r4@17
  10.   int v8; // r7@18
  11.   signed int kk; // r6@18
  12.   int v10; // r7@20
  13.   int v11; // r7@21
  14.   signed int ll; // r5@28
  15.   signed int mm; // r4@29
  16.   signed int x; // r5@37
  17.   signed int y; // r4@38
  18.   signed int k; // [sp+0h] [bp-5Ch]@7
  19.   _BYTE mtx1[8][8]; // [sp+4h] [bp-58h]@3
  20.  
  21.   for ( i = 0; i < 8; i = (unsigned __int8)(i + 1) )
  22.   {
  23.     for ( j = 0; j < 8; j = (unsigned __int8)(j + 1) )
  24.       mtx1[i][j] = (*data)[j][i];
  25.   }
  26.   for ( k = 4; k != 255; k = (unsigned __int8)(k - 1) )
  27.   {
  28.  
  29.     for ( l = 0; l < 8; l = (unsigned __int8)(l + 1) )
  30.     {
  31.       for ( m = 0; m < 8; m = (unsigned __int8)(m + 1) )
  32.         mtx1[l][m] ^= *(&array_320_bytes_at_1DCC[64 * k] + 8 * m + l);
  33.     }
  34.  
  35.     for ( n = 0; n < 8; n = (unsigned __int8)(n + 1) )
  36.     {
  37.       transform_dword_C788(mtx1[n], 4);
  38.       transform_dword_C788(mtx1[n], 2);
  39.       transform_dword_C788(mtx1[n], 0);
  40.     }
  41.  
  42.     for ( ii = 0; ii < 8; ii = (unsigned __int8)(ii + 1) )
  43.     {
  44.       for ( jj = (unsigned __int8)(ii + 1); jj < 8; jj = (unsigned __int8)(jj + 1) )
  45.       {
  46.         v8 = mtx1[7][jj];
  47.         for ( kk = 7; kk != 255; kk = (unsigned __int8)(kk - 1) )
  48.         {
  49.           if ( kk )
  50.           {
  51.             v11 = v8 ^ mtx1[kk - 1][jj];
  52.             mtx1[kk - 1][jj] ^= v11;
  53.             v8 = v11 ^ mtx1[kk - 1][jj];
  54.           }
  55.           else
  56.           {
  57.             v10 = v8 ^ mtx1[7][jj];
  58.             mtx1[7][jj] ^= v10;
  59.             v8 = v10 ^ mtx1[7][jj];
  60.           }
  61.         }
  62.       }
  63.     }
  64.     for ( ll = 0; ll < 8; ll = (unsigned __int8)(ll + 1) )
  65.     {
  66.       for ( mm = 0; mm < 8; mm = (unsigned __int8)(mm + 1) )
  67.         mtx1[ll][mm] = array_256_bytes_at_1CCC[mtx1[ll][mm]];
  68.     }
  69.   }
  70.   for ( x = 0; x < 8; x = (unsigned __int8)(x + 1) )
  71.   {
  72.     for ( y = 0; y < 8; y = (unsigned __int8)(y + 1) )
  73.       (*data)[y][x] = mtx1[x][y];
  74.   }
  75. }





Ранг: 1053.6 (!!!!), 1078thx
Активность: 1.060.81
Статус: Участник

Создано: 27 октября 2015 13:57 · Поправил: reversecode
· Личное сообщение · #2

аес, 9 11 13 14 в нём встречается
--> Link <--
0x1B используется в умножении --> Link <--

transform_byte_C754 - GF2 галуа умножение

| Сообщение посчитали полезным: vden, 4kusNick, DenCoder
 eXeL@B —› Основной форум —› Что за алгоритм?
Эта тема закрыта. Ответы больше не принимаются.
   Для печати Для печати