Помогите найти ошибку: Пытаюсь реализовать ГОСТ 34.10-94 (смастерил простой класс для работы с большими целыми числами — DIGIT) начал с процедуры А Результат не сходится с проверочным примером Вот код: Код (Text): void a_proc(void* P,void* Q,ULONG T,USHORT X,USHORT C) { DIGIT p[32]; dynarray<ULONG> y; dynarray<ULONG> t,r; DIGIT Ym,N,yt,z1,z2; int i,s,m,M,k,z; // смещение на 8 {8, 9, 10, 11, 12, 13, 14, 15, 16 } // в шестнадцат. {0x0083,0x0101,0x0209,0x0407,0x0805,0x1003,0x2011,0x4039,0x8003} ULONG primes[9] = {131, 257, 521, 1031, 2053, 4099, 8209, 16441, 32771 }; // 1. y[0]=X; // 2. t[0]=T; i=0; while(t[i]>=17){ t[i+1]=t[i]/2; i++; } s=i; M=s; // Обход шага 5 в цикле // 3. p[s]=primes[t[s]-8]; // учитывается смещение (начинается с 8 бит) // 4. m=s-1; while(m>=0) { // 5. if(M!=m) { r[m]=t[m+1]/16+(t[m+1]%16?1:0); M=m; } // 6. for(i=0;i<(int)r[m];i++) y[i+1]=((((DIGIT)19381)*(DIGIT)y[i]+(DIGIT)C)%(DIGIT)(1<<16)); // 7. Ym = SUM[i=0..r[m]-1](y[i]*(2^(16*i))) Ym=0; for(i=0;i<(int)r[m];i++) Ym+=((DIGIT)y[i])*(((DIGIT)1)<<(DIGIT)(16*i)); // 8. y[0]=y[r[m]]; // 9. // округление до наименьшего целого, не меньшего, чем результат деления yt=((((DIGIT)1)<<(DIGIT)(t[m]-1))%p[m+1])>(DIGIT)0?1:0; N=(((DIGIT)1)<<(DIGIT)(t[m]-1))/p[m+1]+yt+ ((((DIGIT)1)<<(DIGIT)(t[m]-1))*Ym)/((((DIGIT)1)<<(DIGIT)(16*r[m]))*p[m +1]); N+=N%(DIGIT)2; // 10. k=0; z=0; do { // 11. p[m]=p[m+1]*(N+(DIGIT)k)+(DIGIT)1; // 12. if(p[m]>(((DIGIT)1)<<(DIGIT)t[m])) break; // на шаг 6 // 13. PowMod(2,p[m+1]*(N+(DIGIT)k),p[m],z1); PowMod(2,(N+(DIGIT)k),p[m],z2); z=(z1==(DIGIT)1)&&(z2!=(DIGIT)1); k+=2; } while(!z); if(z) m--; } // 14. // ... } int main(int argc, char* argv[]) { unsigned char P[64]; unsigned char Q[32]; a_proc(P,Q,512,0x5EC9,0x7341); // ... Результат получается такой (не сходится с тем, что в ГОСТе): 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 — тоже самое... значит в алгоритме проблема, либо примеры не верные (но вот в этом сильно сомневаюсь) Подскажите кто разбирался с сабжем... Заранее благодарен.
эту опечатку я уже вычислил у меня причем официальный оригинальный ГОСТ, полученный в ЦНТИ В нем действительно опечатка... Меня волнует вопрос: у кого нибудь ваще сводились результаты с примерами ГОСТа 34.10-94??? Сейчас пытаюсь при помощи Экселя проверить эти примеры. О результатах постараюсь отписать.
По пунктам получается следующее: 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 - вместо r[m]=t[m+1]/16 должно быть r[m]=t[m]/16 теперь все сходится, буду дальше разбираться