IPB
ЛогинПароль:

> Внимание!

1. Пользуйтесь тегами кода. - [code] ... [/code]
2. Точно указывайте язык, название и версию компилятора (интерпретатора).
3. Название темы должно быть информативным. В описании темы указываем язык!!!

> Блочное шифрование данных, алгоритм ГОСТ 28147-89
18192123
сообщение 3.03.2009 20:26
Сообщение #1


Профи
****

Группа: Пользователи
Сообщений: 920
Пол: Женский
Реальное имя: Марина

Репутация: -  2  +


Здравствуйте!
Требуется реализовать алгоритм блочного шифрования ГОСТ 28147-89 в следующих режимах
шифрования: режим простой замены; режим гаммирования; режим гаммирования с обратной связью.
Программа должна запрашивать имя входного и выходного файлов,
ключ, вектор инициализации (синхропосылку), режим работы
(зашифрование или расшифрование), режим шифрования.

У меня прежде всего вопрос по организации данных..
В соответствии с алгоритмом

размер блока – 64 бита;
- размер ключа – 256 бит. Ключ представляется как массив из
восьми 32-битных подключей K={K0,K1,…,K7};
- количество S-блоков – 8. Каждый S-блок (в терминах стандарта –
узел замены) содержит 16 четырехбитных значений, представляющих
собой произвольную перестановку чисел от 0 до 15. Совокупность всех
S-блоков можно представить в виде матрицы (таблицы замен) размером 8 на 16.

Скажите пожалуйста, какие типы правильнее использовать для массива ключей и таблицы замен?


 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
volvo
сообщение 15.03.2009 18:44
Сообщение #2


Гость






Цитата
мне не понятно, как передать определённый подключ в функцию..
Я ж тебе в четвертом посте показывал, как работать с под-ключами, как "выдирать" их из ключа в любом порядке...

У тебя есть документы, которые содержат все необходимые тебе преобразования. Продумай, наконец, систему типов программы. Продумай систему преобразований типов (явных или неявных, может, будет проще написать небольшой класс, может, будет проще работать с массивами bool-ов, может - со строками, может - с __int64, я не знаю, у меня информация об алгоритме только очень отрывочная), а то так и будешь плавать в ненужных наворотах от одной задачи к другой. Я не буду делать все задание за тебя. Это мне не интересно (кстати, я сомневаюсь, что программная реализация стандарта шифрования ГОСТ 28147-89 вообще законна, у меня есть документ, однозначно утверждающий: "приведенный ниже материал не должен ни при каких условиях использоваться для программной или аппаратной реализации алгоритма криптографического преобразования" (С), так что можно ли вообще делать то, что ты делаешь - еще очень большой вопрос)
 К началу страницы 
+ Ответить 
18192123
сообщение 15.03.2009 23:31
Сообщение #3


Профи
****

Группа: Пользователи
Сообщений: 920
Пол: Женский
Реальное имя: Марина

Репутация: -  2  +


Цитата(volvo @ 15.03.2009 18:44) *

...так что можно ли вообще делать то, что ты делаешь - еще очень большой вопрос)

Ну поскольку учебная программа предполагает, то почему нельзя?)
И к тому же, программа-то не предназначена для использования вне учебных целей)

Вообщем реализовала я основной шаг криптопреобразования, шифрование-дешифрование в режиме простой замены..
Вот только в процессе зашифрования получаю идентичный исходному текст...

int blokS[8][16];
__int32 Keys[8];
char *fileS,*fileIn,*fileOut;
//основной шаг
__int64 BaseStep(__int64 N,__int32 Key)
{
__int32 L,R,S,helpS=0;
int i,Sm;
R = (N & 0x00000000FFFFFFFF);
L = (N & 0xFFFFFFFF00000000) >> 32;
S = (R+Key)%0xffffffff;
for (i=0;i<8;i++) //замена с использование таблицы замен
{
Sm=(S&0xf);
S=S>>4;
helpS=(helpS|blokS[i][Sm])<<4;
}
helpS=helpS<<11;
helpS=helpS^L;
//меняем половины местами и получаем преобразованный блок
L=R;
R=helpS;
N=0;
N=(N|L)<<32;
N=N|R;
return N;
}

__int64 emcryption(__int64 n)
{
int k,j;
__int32 l;
for (k=0; k<3; k++)
for (j=0; j<8; j++)
n=BaseStep(n,Keys[j]);
for (j=7; j>=0; j--)
n=BaseStep(n,Keys[j]);
l = (n & 0xFFFFFFFF00000000) >> 32;
n=(n & 0x00000000FFFFFFFF)<<32;
n=n|l;
return n;
}

__int64 decryption(__int64 n)
{
int k,j;
__int32 l;
for (j=0; j<8; j++)
n=BaseStep(n,Keys[j]);
for (k=0; k<3; k++)
for (j=7; j>=0; j--)
n=BaseStep(n,Keys[j]);
l = (n & 0xFFFFFFFF00000000) >> 32;
n=(n & 0x00000000FFFFFFFF)<<32;
n=n|l;
return n;
}

void __fastcall TFormMain::ButBeginClick(TObject *Sender)
{
int i;
//Ключ
for (i=0;i<8;i++)
Keys[i]=StrToInt(MemoKey->Lines->Strings[i]);

//таблица замен
FILE *f = fopen(OpenDialog2->FileName.c_str(),"rt");
i = 0;
while(i < 8)
{
int j = 0;
int code;
while((!feof(f)) && (j < 16))
{
fscanf(f, "%d", &code);
blokS[i][j++] = (int)code;
}
i++;
}
fclose(f);
//
__int64 N,masN[100];
f=fopen(fileIn,"rt");
FILE *fOut;
fOut=fopen(fileOut,"w");
__int32 L,R;
while (!feof(f))
{
char str[sizeof(__int64) + 1] = {0};
fscanf(f, "%8s", str);
N = *(__int64*)(&str[0]);
N=emcryption(N);
//N=decryption(N);
fwrite(&N,sizeof(__int64),1,fOut);
}
fclose(fOut);
}




Думаю, что в основном шаге напутала чего-нибудь... Помогите пожалуйста разобраться, что не так..?
Текст по-прежнему в текстовом файле..

Сообщение отредактировано: 18192123 - 16.03.2009 21:55


Прикрепленные файлы
Прикрепленный файл  2.txt ( 8 байт ) Кол-во скачиваний: 213
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
18192123
сообщение 16.03.2009 20:01
Сообщение #4


Профи
****

Группа: Пользователи
Сообщений: 920
Пол: Женский
Реальное имя: Марина

Репутация: -  2  +


Цитата(18192123 @ 15.03.2009 23:31) *


//...
N=emcryption(N);
//N=decryption(N);
fwrite(&N,sizeof(__int64),1,fOut);
//...



Поправила вызов функций зашифрования-расшифрования...
Приведённый выше файл удалось зашифровать..Но результат расшифрования не совпал с исходным текстом...
Зашифрование-расшифрование проводилось с ключом (1;2;3;4;5;6;7;8) - вводится в Memo..

Сообщение отредактировано: 18192123 - 16.03.2009 22:02


Прикрепленные файлы
Прикрепленный файл  decryption.txt ( 8 байт ) Кол-во скачиваний: 192
Прикрепленный файл  emcryption.txt ( 8 байт ) Кол-во скачиваний: 199
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

Сообщений в этой теме
18192123   Блочное шифрование данных   3.03.2009 20:26
volvo   Язык - С++, как видно? Тогда тебе нельзя привязыва...   3.03.2009 21:57
18192123   typedef bool Tsubkey[32]; typedef Tsubkey Tk...   3.03.2009 22:54
volvo   Строкой... Все вводится строкой. Если длина ключа ...   3.03.2009 23:47
18192123   Мне не очень понятно, как поступить с таблицей зам...   13.03.2009 22:46
18192123   Вот что у меня получилось при формировании таблицы...   14.03.2009 19:56
18192123   Пока не могу добиться нормального считывания из фа...   15.03.2009 12:46
volvo   Файл текстовый? Двоичный? Здесь не форум телепатов...   15.03.2009 12:59
18192123   Таблица замен в текстовом файле..Ниже его содержим...   15.03.2009 13:25
volvo   Ну, раз текстовый, то: wchar_t blokS[8][16]; void...   15.03.2009 13:58
18192123   У меня ещё вопрос по считыванию блока текста (текс...   15.03.2009 15:13
volvo   Зачем ты заталкиваешь это в __int64? Ты хочешь пол...   15.03.2009 15:33
18192123   __int64 value64; //... value64 = *(__int64*)(...   15.03.2009 15:54
volvo   Вот 2 способа: union Convertor { __int64 value6...   15.03.2009 16:57
18192123   Итак..далее.. У меня будет функция (выступающая в ...   15.03.2009 17:44
volvo   Я ж тебе в четвертом посте показывал, как работать...   15.03.2009 18:44
18192123   ...так что можно ли вообще делать то, что ты дела...   15.03.2009 23:31
18192123   //... N=emcryption(N); //N=decryption(N); ...   16.03.2009 20:01
volvo   Все-таки что-то не так в функции decryption(): есл...   17.03.2009 0:11
volvo   Так... А вот теперь я разбирался со всеми функциям...   17.03.2009 19:09


 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия 18.07.2025 10:24
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"