Проверочные примеры ГОСТ 34.10-94

Тема в разделе "WASM.CRYPTO", создана пользователем explorus, 21 июн 2006.

  1. explorus

    explorus New Member

    Публикаций:
    0
    Регистрация:
    15 май 2006
    Сообщения:
    7
    Адрес:
    Russia
    Помогите найти ошибку:



    Пытаюсь реализовать ГОСТ 34.10-94 (смастерил простой класс для работы с большими целыми числами — DIGIT)

    начал с процедуры А



    Результат не сходится с проверочным примером



    Вот код:


    Код (Text):
    1. void a_proc(void* P,void* Q,ULONG T,USHORT X,USHORT C)
    2. {
    3.   DIGIT p[32];
    4.   dynarray<ULONG> y;
    5.   dynarray<ULONG> t,r;
    6.   DIGIT Ym,N,yt,z1,z2;
    7.   int i,s,m,M,k,z;
    8.   // смещение на 8  {8,     9,     10,    11,    12,    13,    14,    15,    16    }
    9.   // в шестнадцат.  {0x0083,0x0101,0x0209,0x0407,0x0805,0x1003,0x2011,0x4039,0x8003}
    10.   ULONG primes[9] = {131,   257,   521,   1031,  2053,  4099,  8209,  16441, 32771 };
    11.   // 1.
    12.   y[0]=X;
    13.   // 2.
    14.   t[0]=T;
    15.   i=0;
    16.   while(t[i]>=17){ t[i+1]=t[i]/2; i++; }
    17.   s=i;
    18.   M=s; // Обход шага 5 в цикле
    19.   // 3.
    20.   p[s]=primes[t[s]-8]; // учитывается смещение (начинается с 8 бит)
    21.   // 4.
    22.   m=s-1;
    23.   while(m>=0)
    24.   {
    25.     // 5.
    26.     if(M!=m)
    27.     {
    28.       r[m]=t[m+1]/16+(t[m+1]%16?1:0);
    29.       M=m;
    30.     }
    31.     // 6.
    32.     for(i=0;i<(int)r[m];i++)
    33.       y[i+1]=((((DIGIT)19381)*(DIGIT)y[i]+(DIGIT)C)%(DIGIT)(1<<16));
    34.     // 7. Ym = SUM[i=0..r[m]-1](y[i]*(2^(16*i)))
    35.     Ym=0;
    36.     for(i=0;i<(int)r[m];i++)
    37.       Ym+=((DIGIT)y[i])*(((DIGIT)1)<<(DIGIT)(16*i));
    38.     // 8.
    39.     y[0]=y[r[m]];
    40.     // 9.
    41.     // округление до наименьшего целого, не меньшего, чем результат деления
    42.     yt=((((DIGIT)1)<<(DIGIT)(t[m]-1))%p[m+1])>(DIGIT)0?1:0;
    43.     N=(((DIGIT)1)<<(DIGIT)(t[m]-1))/p[m+1]+yt+
    44.       ((((DIGIT)1)<<(DIGIT)(t[m]-1))*Ym)/((((DIGIT)1)<<(DIGIT)(16*r[m]))*p[m  +1]);
    45.     N+=N%(DIGIT)2;
    46.     // 10.
    47.     k=0;
    48.     z=0;
    49.     do
    50.     {
    51.       // 11.
    52.       p[m]=p[m+1]*(N+(DIGIT)k)+(DIGIT)1;
    53.       // 12.
    54.       if(p[m]>(((DIGIT)1)<<(DIGIT)t[m])) break; // на шаг 6
    55.       // 13.
    56.       PowMod(2,p[m+1]*(N+(DIGIT)k),p[m],z1);
    57.       PowMod(2,(N+(DIGIT)k),p[m],z2);
    58.       z=(z1==(DIGIT)1)&&(z2!=(DIGIT)1);
    59.       k+=2;
    60.     }
    61.     while(!z);
    62.     if(z) m--;
    63.   } // 14.
    64.   // ...
    65.  
    66. }
    67.  
    68. int main(int argc, char* argv[])
    69. {
    70.     unsigned char P[64];
    71.     unsigned char Q[32];
    72.     a_proc(P,Q,512,0x5EC9,0x7341);
    73. // ...


    Результат получается такой (не сходится с тем, что в ГОСТе):

    p[5]=8003

    p[4]=AF66 1C4D

    p[3]=F0DB AD4E 1AD1 6763

    p[2]=9461 B25D 289A D391 993F 076A F237 93D9

    p[1]=C4CD 9C99 2766 8E6E 4907 F82B 03F0 B350 54FA 2E99 9AA5 B027 448B 2873 C9E0 D0AD

    p[0]=9325 9891 5E7E C826 5EDF CDA3 1E88 F248 09B9 9955 7EB2 900A 5DB3 DDA7 18FC 958B 7343 02F9 A694 E384 ECA0 D92D D0C3 0D1D 2F64 36DF BA82 FE19 921B 1DDD 31A1 3F97



    Думал, что проблема с арифметикой — взял другой класс cBigNumber — тоже самое...

    значит в алгоритме проблема, либо примеры не верные (но вот в этом сильно сомневаюсь)

    Подскажите кто разбирался с сабжем...

    Заранее благодарен.
     
  2. _BC_

    _BC_ БЦ

    Публикаций:
    0
    Регистрация:
    20 янв 2005
    Сообщения:
    759
  3. explorus

    explorus New Member

    Публикаций:
    0
    Регистрация:
    15 май 2006
    Сообщения:
    7
    Адрес:
    Russia
    эту опечатку я уже вычислил

    у меня причем официальный оригинальный ГОСТ, полученный в ЦНТИ

    В нем действительно опечатка... :dntknw:



    Меня волнует вопрос: у кого нибудь ваще сводились результаты с примерами ГОСТа 34.10-94???



    Сейчас пытаюсь при помощи Экселя проверить эти примеры. О результатах постараюсь отписать.
     
  4. explorus

    explorus New Member

    Публикаций:
    0
    Регистрация:
    15 май 2006
    Сообщения:
    7
    Адрес:
    Russia
    По пунктам получается следующее:

    1. y[0]=0x5ec9

    2. t[0]=512,t[1]=256,t[2]=128,t[3]=64,t[4]=32,t[5]=16

    s=5

    3. p[5]=0x8003

    4. m=4

    5. r[m]=1

    6. y[1]=0x5A5E

    7. Y[m]=0x5EC9

    8. y[0]=y[1]=0x5A5E

    9. N=0xFFFB+0x5EC6

    10. k=0

    11. p[m]=0xAF651C47

    12. p[m]< 0x100000000

    13. 0x0FEC3BDB == 1 ? => k=2 на шаг 11

    0x0AF35F6A != 1

    11. p[m]=0xAF661C4D

    12. p[m]< 0x100000000

    13. 0x00000001 == 1 на шаг 6

    0xC2A473D8 != 1



    То есть p[4]=0xAF661C4D вместо 0xAD4B0FAB (в проверочном примере)



    Интересно следующее:

    если пункт 8 выполнить перед пунктом 7 получается искомый результат

    p[4]=0xAD4B0FAB



    но следующий p[3] снова не сходится, вот результаты:



    p[5]=8003

    rm=1

    p[4]=AD4B 0FAB

    rm=2

    p[3]=F0DB D3ED 9B7C 9E3B



    Ну кто же поможет картину прояснить??? HELP, S.O.S

    Кто поможет хотяб советом готов поделиться собственными исходниками гостов 34.11-94 и 28147-89
     
  5. explorus

    explorus New Member

    Публикаций:
    0
    Регистрация:
    15 май 2006
    Сообщения:
    7
    Адрес:
    Russia
    увидел я очепятку:



    процедура А, пункт 5 -

    вместо r[m]=t[m+1]/16 должно быть r[m]=t[m]/16



    теперь все сходится, буду дальше разбираться