Добавил:
korayakov
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Документация по криптоалгоритмам / GOST-28147-89 / GOST_UTI / SHOWGOST
.C/*----------------------------------------------------
ShowGost.c - Їа®Ја ¬¬ ¤«п ўлў®¤ ®взҐв ® Їа®жҐббҐ
иЁда®ў Ёп Ї® ѓЋ‘’ 28147-89
----------------------------------------------------
(c) Copyright 1995 Ђ¤аҐ© ћа쥢Ёз ‚Ё®Єга®ў, Њ®бЄў
‚ҐабЁп 1.00, 09.02.95
----------------------------------------------------
Џа®Ја ¬¬ ўл¤ Ґв ®взҐв ® б®бв®пЁпе ॣЁбва®ў ¬®¤Ґ-
«Ё иЁда®ў вҐ«п Ї® ѓЋ‘’ 28147-89. ‚ᥠЇ а ¬Ґвал иЁд-
а®ў вҐ«п § ¤ овбп Їа®Ё§ў®«м®, зв®Ўл ‚л ¬®Ј«Ё ®б®-
ў вҐ«м® Ї®Ґ..вм «Ј®аЁв¬. ќв Їа®Ја ¬¬ Ўг¤Ґв ‚ ¬
®..ЁвҐ«м® Ї®«Ґ§ ЇаЁ ®в« ¤ЄҐ ¬®¤г«Ґ© ѓЋ‘’ .
----------------------------------------------------
‘ 楫мо ¤®бвЁ¦ҐЁп ¬ ЄбЁ¬ «м®© Їа®бв®вл ¤ п
Їа®Ја ¬¬ ᮤҐа¦Ёв «Ёим ¬ЁЁ¬ «млҐ Їа®ўҐаЄЁ
Є®а४в®бвм ўе®¤ле ¤ ле.
----------------------------------------------------
*/
#include <ctype.h> // isspace
#include <io.h> // eof
#include <stdio.h> // FILE,scanf,printf,etc....
#include <stdlib.h> // strtoul,lrotl
#include <string.h> // strcpy,strlen
typedef struct
{
unsigned long low,high;
} CryptoBlock;
unsigned short KeyLength,KeyRepeat;
unsigned long Key[64];
unsigned short Cht[8][16];
char KeyUse[64+1];
CryptoBlock data;
void main(int argc,char **argv)
{
FILE *file;
unsigned i,j,k,l;
char *p;
unsigned long Old=0UL;
// ўл¤ з Є®ЇЁа ©в
printf(
"Џа®Ја ¬¬ ўл¤ зЁ Ї®¤а®Ў®Ј® ®взҐв ® Їа®жҐбᥠиЁда®ў Ёп "
"Ї® ѓЋ‘’ 28147-89\n"
"(c) Copyright 1995 Ђ¤аҐ© ћа쥢Ёз ‚Ё®Єга®ў, Ј.Њ®бЄў \n\n"
);
if (argc<6)
{
printf(
"”®а¬ в Є®¬ ¤®© бва®ЄЁ § ЇгбЄ Їа®Ја ¬¬л ¤®«¦Ґ Ўлвм б«Ґ¤гойЁ© :\n"
"\"name ChangeTableFile KeyFile KeyUsingScheme N1 N2\", Ј¤Ґ :\n"
"name - Ё¬п д ©« б Їа®Ја ¬¬®©;\n"
"ChangeTableFile - Ё¬п д ©« б в Ў«ЁжҐ© § ¬Ґ,"
" § ¤ ®© ў ⥪бв®ў®© д®а¬Ґ\n"
" ’‡ ¤®«¦ ᮤҐа¦ вм а®ў® 128 зЁбҐ« ®в 0 ¤® 255,\n"
" § ЇЁб ле ў 16-аЁз®© бЁб⥬Ґ бзЁб«ҐЁп;\n"
"KeyFile - Ё¬п д ©« б Є«о箬, ЇаҐ¤бв ў«Ґл¬"
" ў бЁ¬ў®«м®© д®а¬Ґ;\n"
" Є«оз ¤®«¦Ґ ᮤҐа¦ вм ®в 1 ¤® 64 н«Ґ¬Ґв®ў"
" - ¤«Ёле 楫ле\n"
" ЎҐ§ § Є , § ЇЁб ле ў 16-аЁз®© бЁб⥬Ґ;\n"
"KeyUsingScheme - бва®Є Ё§ бЁ¬ў®«®ў 0 Ё 1, "
"®ва ¦ ой п Ї®а冷Є ЁбЇ®«м§®ў Ёп\n"
" н«Ґ¬Ґв®ў Є«оз : 0-ўЇҐаҐ¤, 1- § ¤;\n"
"N1,N2 - ᮮ⢥вб⢥® ¬« ¤и п Ё бв аи п з бвЁ"
" иЁда㥬®Ј® Ў«®Є ;\n"
" ¤ ле\n"
"\n"
);
return;
}
// з⥨Ґ в Ў«Ёжл § ¬Ґ
if(!(file=fopen(argv[1],"rt")))
{
printf("ЌҐ ¬®Јг ®вЄалвм д ©« в Ў«Ёжл § ¬Ґ - \"%s\"\n");
return;
}
for (i=0; i<8*16; i++)
{
fscanf(file,"%hx",Cht[0]+i);
/* if(eof(fileno(file)) || !isspace(getc(file)))
{
printf("ЌҐ¤®ЇгбвЁ¬л© бЁ¬ў®« ў® ўе®¤®¬ Ї®в®ЄҐ\n");
return;
}
*/
}
fclose(file);
// з⥨Ґ Є«оз
if(!(file=fopen(argv[2],"rt")))
{
printf("ЌҐ ¬®Јг ®вЄалвм д ©« Є«оз - \"%s\"\n");
return;
}
for (KeyLength=0; KeyLength<64; KeyLength++)
if (!(fscanf(file,"%lx",Key+KeyLength)==1))
break;
fclose(file);
// з⥨Ґ беҐ¬л ЁбЇ®«м§®ў Ёп Є«оз
if ((KeyRepeat=strlen(argv[3])) > 64)
{
printf("‘ва®Є беҐ¬л ЁбЇ®«м§®ў Ёп Є«оз б«ЁиЄ®¬ ¤«Ё п\n");
return;
}
strcpy(KeyUse,argv[3]);
for (p=KeyUse; *p; p++)
{
if (*p != '0' && *p != '1')
{
printf("‚ б奬Ґ ЁбЇ®«м§®ў Ёп Є«оз ¤®ЇгбвЁ¬л в®«мЄ® 0 Ё 1\n");
return;
}
}
// ¤ҐЄ®¤Ёа®ў ЁҐ ¤ ле ¤«п иЁда®ў Ёп
data.low=strtoul(argv[4],&p,16);
if (*p)
{
printf("ЌҐ¤®ЇгбвЁ¬л© бЁ¬ў®« ў § ЇЁбЁ 16-аЁз®Ј® зЁб« N1 - \"%c\"\n",
*p);
return;
}
data.high=strtou(argv[5],&p,16);
if (*p)
{
printf("ЌҐ¤®ЇгбвЁ¬л© бЁ¬ў®« ў § ЇЁбЁ 16-аЁз®Ј® зЁб« N2 - \"%c\"\n",
*p);
return;
}
// ђҐ «Ё§ жЁп «Ј®аЁв¬ иЁда®ў Ёп
// ўл¤ з § Ј®«®ўЄ
printf(
"Ёда®ў ЁҐ ¤ ле Ї® ®Ў®ЎйҐ®¬г «Ј®аЁв¬г ѓЋ‘’ 28147-89\n"
"<i> <--N2--> <--N1--> <-K[i]-> <N1+Ki > <§ ¬Ґ > "
"<ўа й11> <--N2\'-> <--N1\'->\n"
);
// ®бгйҐбвў«ҐЁҐ Їа®жҐ¤гал § иЁда®ў Ёп
for (i=0,l=0; i<KeyRepeat; i++)
{
putchar('\n');
for (j=0; j<KeyLength; j++,l++)
{
Old=data.low;
k= (KeyUse[i]=='0') ? j : KeyLength-j-1;
printf ("%03u %08lx %08lx %08lx",
k,data.high,data.low,Key[k]);
data.low+=Key[k];
printf (" %08lx",data.low);
for (k=0; k<8; k++)
{
unsigned long L;
L=Cht[k][(unsigned)(data.low & 0x0000000FUL)];
data.low &= ~0x0000000FUL;
data.low |= L;
data.low = _lrotl(data.low,4);
}
printf (" %08lx",data.low);
data.low=_lrotl(data.low,11);
printf (" %08lx",data.low);
data.low ^= data.high;
data.high = Old;
printf (" %08lx %08lx\n",data.high,data.low);
}
}
printf("\n\n Result=%08lx%08lx",data.low,data.high);
}
Соседние файлы в папке GOST_UTI