Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 30.11.2015, 10:49   #1
fkty
Форумчанин
 
Регистрация: 22.05.2013
Сообщений: 245
По умолчанию шифрование ГОСТ

Здравствуйте,пишу метод шифрования ГОСТ и возникли вот такие ошибки:
error C1021:недопустимая команда препроцессора"ifdef_alpha"(15 строка)
2IntelliSense:Предупреждение PCH: не удается найти подходящее расположение завершения заголовка. PCH-файл Intellisense не был создан(1 строка)
3IntelliSense:нераспознанная директива препроцессора(15 строка)
4IntelliSense:отсутствует #if для этой директивы(17 строка)
5IntelliSense:недопустимое сочетание спецификаторов типа(18 строка)
6IntelliSense:отсутствует #if для этой директивы(19 строка)

Код:
typedef unsigned long u4;
typedef unsigned char byte;

typedef struct {
	u4 k[8];
	char k87[256], k65[256], k43[256], k21[256];
} gost_ctx;

void gost_enc(gost_ctx *, u4 *, int);
void gost_dec(gost_ctx *, u4 *, int);
void gost_key(gost_ctx *, u4 *);
void gost_init(gost_ctx *);
void gost_destroy(gost_ctx *);

#ifdef_alpha 
typedef usingned int word32;
#else
typedef usingned long word32;
#endif 

int kboxinit(gost_ctx *c)
{
	int i;
	byte k8[16] = {14,4,13,1,2,15,11,8,3,10,6,12,5,9,0,7};
	byte k7[16] = {15,1,8,14,6,11,3,4,9,7,2,13,12,0,5,10};
	byte k6[16] = {10,0,9,14,6,3,15,5,1,13,12,7,11,4,2,8};
	byte k5[16] = {7,13,14,3,0,6,9,10,1,2,8,5,11,12,4,15};
	byte k4[16] = {2,12,4,1,7,10,11,6,8,5,3,15,13,0,14,9};
	byte k3[16] = {12,1,10,15,9,2,6,8,0,13,3,4,14,7,5,11};
	byte k2[16] = {4,11,2,14,15,0,8,13,3,12,9,7,5,10,6,1};
	byte k1[16] = {13,2,8,4,6,15,11,1,10,9,3,14,5,0,12,7};

	for (i = 0; i < 256; i++) {
		c->k87[i] = k8[i >> 4] << 4 | k7[i & 15];
		c->k65[i] = k6[i >> 4] << 4 | k5[i & 15];
		c->k43[i] = k4[i >> 4] << 4 | k3[i & 15];
		c->k21[i] = k2[i >> 4] << 4 | k1[i & 15];
	}}

static word32 f(gost_ctx *c,word32 x)
{
	x = c->k87[x>>24 & 255] << 24 | c->k65[x>>16 & 255] << 16 | c->k43[x>>8 & 255] << 8 | c->k21[x & 255];
        return x<<11 | x>>(32-11);}

void gostcrypt(gost_ctx *c, word32 *d) {
	register word32 n1, n2;
	n1 = d[0]; n2 = d[1];
	n2 ^= f(c,n1+c->k[0]); n1 ^= f(c,n2+c->k[1]);
	n2 ^= f(c,n1+c->k[2]); n1 ^= f(c,n2+c->k[3]);
	n2 ^= f(c,n1+c->k[4]); n1 ^= f(c,n2+c->k[5]);
	n2 ^= f(c,n1+c->k[6]); n1 ^= f(c,n2+c->k[7]);

	n2 ^= f(c,n1+c->k[0]); n1 ^= f(c,n2+c->k[1]);
	n2 ^= f(c,n1+c->k[2]); n1 ^= f(c,n2+c->k[3]);
	n2 ^= f(c,n1+c->k[4]); n1 ^= f(c,n2+c->k[5]);
	n2 ^= f(c,n1+c->k[6]); n1 ^= f(c,n2+c->k[7]);

	n2 ^= f(c,n1+c->k[0]); n1 ^= f(c,n2+c->k[1]);
	n2 ^= f(c,n1+c->k[2]); n1 ^= f(c,n2+c->k[3]);
	n2 ^= f(c,n1+c->k[4]); n1 ^= f(c,n2+c->k[5]);
	n2 ^= f(c,n1+c->k[6]); n1 ^= f(c,n2+c->k[7]);

	n2 ^= f(c,n1+c->k[7]); n1 ^= f(c,n2+c->k[6]);
	n2 ^= f(c,n1+c->k[5]); n1 ^= f(c,n2+c->k[4]);
	n2 ^= f(c,n1+c->k[3]); n1 ^= f(c,n2+c->k[2]);
	n2 ^= f(c,n1+c->k[1]); n1 ^= f(c,n2+c->k[0]);
        d[0] = n2; d[1] = n1;}

void gostdecrypt(gost_ctx *c, u4 *d) {
	register word32 n1, n2;
	n1 = d[0]; n2 = d[1];
	n2 ^= f(c,n1+c->k[0]); n1 ^= f(c,n2+c->k[1]);
	n2 ^= f(c,n1+c->k[2]); n1 ^= f(c,n2+c->k[3]);
	n2 ^= f(c,n1+c->k[4]); n1 ^= f(c,n2+c->k[5]);
	n2 ^= f(c,n1+c->k[6]); n1 ^= f(c,n2+c->k[7]);

	n2 ^= f(c,n1+c->k[7]); n1 ^= f(c,n2+c->k[6]);
	n2 ^= f(c,n1+c->k[5]); n1 ^= f(c,n2+c->k[4]);
	n2 ^= f(c,n1+c->k[3]); n1 ^= f(c,n2+c->k[2]);
	n2 ^= f(c,n1+c->k[1]); n1 ^= f(c,n2+c->k[0]);

	n2 ^= f(c,n1+c->k[7]); n1 ^= f(c,n2+c->k[6]);
	n2 ^= f(c,n1+c->k[5]); n1 ^= f(c,n2+c->k[4]);
	n2 ^= f(c,n1+c->k[3]); n1 ^= f(c,n2+c->k[2]);
	n2 ^= f(c,n1+c->k[1]); n1 ^= f(c,n2+c->k[0]);

	n2 ^= f(c,n1+c->k[7]); n1 ^= f(c,n2+c->k[6]);
	n2 ^= f(c,n1+c->k[5]); n1 ^= f(c,n2+c->k[4]);
	n2 ^= f(c,n1+c->k[3]); n1 ^= f(c,n2+c->k[2]);
	n2 ^= f(c,n1+c->k[1]); n1 ^= f(c,n2+c->k[0]);
     d[0] = n2; d[1] = n1;}

void gost_enc(gost_ctx *c, u4 *d, int blocks) {
	int i;
        for (i=0; i<blocks; i++) {
		gostcrypt(c,d);d+=2;}}

void gost_dec(gost_ctx *c, u4 *d, int blocks) {
	int i;
        for (i=0; i<blocks; i++) {
		gostdecrypt(c,d);d+=2;}}

void gost_key(gost_ctx *c, u4 *k) {
	int i;
	for (i=0; i<8; i++) c->k[i]=k[i];}

void gost_init(gost_ctx *c) {
	kboxinit(c);}

void gost_destroy(gost_ctx *c) {
	int i;
	for (i=0; i<8; i++) c->k[i]=0;}

void main(void) {
	gost_ctx gc;u4 k[8], data[10];int i;
	gost_init(&gc);
	for (i=0; i<8; i++) k[i] = i;
	gost_key(&gc,k);
	data[0] = 0; data[1] = 0;
	gostcrypt(&gc,data);
	printf("Enc of zero vector: %081x %081x\n",data[0],data[1]);
	gostcrypt(&gc,data);
	printf("Enc of above: %081x %081x\n",data[0],data[1]);
	data[0] = 0xffffffff;
	data[1] = 0xffffffff;
	gostcrypt(&gc,data);
	printf("Enc of ones vector: %081x %081x\n",data[0],data[1]);
	gostcrypt(&gc,data);
	printf("Enc of above: %081x %081x\n",data[0],data[1]);
	for (i=0; i<10;i++) data[i]=i;
	gost_enc(&gc,data,5);
	for (i=0; i<10; i+=2)
	printf("Block %02d = %081x %081x\n", i/2,data[i],data[i+1]);
	gost_dec(&gc,data,1);
	gost_dec(&gc,data+2,4);
	printf("\n");
	for (i=0; i<10; i+=2)
		printf("Block %02d = %081x %081x\n", i/2,data[i],data[i+1]);
	gost_destroy(&gc);
}
fkty вне форума Ответить с цитированием
Старый 30.11.2015, 11:21   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,830
По умолчанию

Код:
#ifdef_alpha
пробел поставьте, есть ифдеф что-то
p51x вне форума Ответить с цитированием
Старый 30.11.2015, 11:26   #3
fkty
Форумчанин
 
Регистрация: 22.05.2013
Сообщений: 245
По умолчанию

спасибо, это исправила.
Возникли другие ошибки:Ошибка 1 error C4430: отсутствует спецификатор типа - предполагается int. Примечание. C++ не поддерживает int по умолчанию
Предупреждение 2 warning C4508: kboxinit: функция должна возвращать значение; предполагается возвращаемый тип "void"
3 IntelliSense: отсутствует явный тип (требуется "int")

Вот здесь:
Код:
kboxinit(gost_ctx *c)
{
	int i;
	byte k8[16] = {14,4,13,1,2,15,11,8,3,10,6,12,5,9,0,7};
	byte k7[16] = {15,1,8,14,6,11,3,4,9,7,2,13,12,0,5,10};
	byte k6[16] = {10,0,9,14,6,3,15,5,1,13,12,7,11,4,2,8};
	byte k5[16] = {7,13,14,3,0,6,9,10,1,2,8,5,11,12,4,15};
	byte k4[16] = {2,12,4,1,7,10,11,6,8,5,3,15,13,0,14,9};
	byte k3[16] = {12,1,10,15,9,2,6,8,0,13,3,4,14,7,5,11};
	byte k2[16] = {4,11,2,14,15,0,8,13,3,12,9,7,5,10,6,1};
	byte k1[16] = {13,2,8,4,6,15,11,1,10,9,3,14,5,0,12,7};

	for (i = 0; i < 256; i++) {
		c->k87[i] = k8[i >> 4] << 4 | k7[i & 15];
		c->k65[i] = k6[i >> 4] << 4 | k5[i & 15];
		c->k43[i] = k4[i >> 4] << 4 | k3[i & 15];
		c->k21[i] = k2[i >> 4] << 4 | k1[i & 15];
	}
}
fkty вне форума Ответить с цитированием
Старый 30.11.2015, 12:43   #4
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,830
По умолчанию

А теперь смотрим ваш первый пост
Код:
int kboxinit(gost_ctx *c)
{
Зачем инт удалили? И где ретурн? Если ничего не возвращаете пишите воид.
p51x вне форума Ответить с цитированием
Старый 01.12.2015, 12:52   #5
fkty
Форумчанин
 
Регистрация: 22.05.2013
Сообщений: 245
По умолчанию

Спасибо, а может кто-то объяснить что выводит программа? что за блоки? и где текст и зашифрованный текст?
fkty вне форума Ответить с цитированием
Старый 01.12.2015, 14:10   #6
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,830
По умолчанию

Цитата:
Спасибо, а может кто-то объяснить что выводит программа?
Так она ж пишет, что выводит и что делает.

Цитата:
что за блоки?
Т.е. вы спи... онерили код и даже не удосужились хотя бы вики посмотреть о чем задание? ГОСТ вообще-то блочный шифр.

Цитата:
и где текст и зашифрованный текст?
Вы код только скопировали, а читать не пробовали?
Вот вам "текст":
Код:
data[0] = 0; data[1] = 0;
и вот
Код:
data[0] = 0xffffffff;
data[1] = 0xffffffff;
А вот тут есть даже "зашифрованный текст" (о чем вам написали):
Код:
"Enc of zero vector: %081x %081x\n",data[0],data[1])
и вот тут
Код:
Enc of above: %081x %081x\n",data[0],data[1])
p51x вне форума Ответить с цитированием
Старый 01.12.2015, 14:17   #7
fkty
Форумчанин
 
Регистрация: 22.05.2013
Сообщений: 245
По умолчанию

т.е. ("Enc of zero vector: %081x %081x\n",data[0],data[1]) это выводится исходный массив из нулей. ("Enc of above: %081x %081x\n",data[0],data[1]) это зашифрованный. ("Enc of ones vector: %081x %081x\n",data[0],data[1]) это исходный массив из единиц. ("Enc of above: %081x %081x\n",data[0],data[1]) это зашифрованный. Далее заполняется массив for (i=0; i<10;i++)
data[i]=i; его шифруем и выводим 5 блоков. Затем его дешифруем и выводим 5 блоков. Так?
fkty вне форума Ответить с цитированием
Старый 01.12.2015, 14:19   #8
fkty
Форумчанин
 
Регистрация: 22.05.2013
Сообщений: 245
По умолчанию

и почему так выводятся массивы сначала нули а потом буквы? и что можно изменить,чтобы результат изменился?
Изображения
Тип файла: jpg Безымянный.jpg (101.1 Кб, 119 просмотров)
fkty вне форума Ответить с цитированием
Старый 01.12.2015, 14:27   #9
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,830
По умолчанию

Цитата:
т.е. ("Enc of zero vector: %081x %081x\n",data[0],data[1]) это выводится исходный массив из нулей.
т.е. "зашифрованный нулевой вектор" вам абсолютно ничего не сказало? Да и где ваша логика - у вас же вывелись не нули...
p51x вне форума Ответить с цитированием
Старый 01.12.2015, 14:29   #10
fkty
Форумчанин
 
Регистрация: 22.05.2013
Сообщений: 245
По умолчанию

а что тогда выводится в ("Enc of zero vector: %081x %081x\n",data[0],data[1]) и ("Enc of above: %081x %081x\n",data[0],data[1])? Остальное верно?
fkty вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Симметричное шифрование, ГОСТ 28147-89 ffpereverzev Помощь студентам 1 15.01.2015 09:17
Не работает шифрование по ГОСТ 28147-89 marycya ASP.NET 1 27.03.2014 20:09
Шифрование ГОСТ 28147-89 в Delphi. Написал, но не работает munthrekosh Общие вопросы Delphi 2 22.12.2013 16:06
Проблема с ГОСТ 28147-89 (симетричное шифрование) MNaz C# (си шарп) 1 12.01.2013 22:35
ГОСТ kiberbog Помощь студентам 0 22.03.2010 20:08