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
сообщение 17.03.2009 19:09
Сообщение #2


Гость






Так... А вот теперь я разбирался со всеми функциями. И вот что удалось сделать:

1) не работай со знаковыми __int64, везде придется поменять этот тип на unsigned __int64...
2) в некоторых местах я убрал заведомо лишние действия, и добавил явные приведения типов там, где без них могут быть проблемы...
3) самое главное: в функции BaseStep ты делаешь:
Цитата
 helpS=helpS<<11;
- это совершенно неверно. В твоем документа ясно сказано, что сдвиг должен быть циклическим, т.е., выталкиваемый слева бит становится крайним справа. Это тоже поправил...
4) Ну, по мелочам: сделал локальные переменные в циклах, убрал неиспользуемые массивы и переменные, при чтении из зашифрованного файла проверяю значение, возвращаемое fread, иначе в расшифрованный файл записывается 8 байт мусора. Вот что получилось в итоге:
unsigned __int32 blokS[8][16];
unsigned __int32 Keys[8];
char *fileS,*fileIn="encrypted.txt",*fileOut="decrypted.txt";

//основной шаг
unsigned __int64 BaseStep(unsigned __int64 N, unsigned __int32 Key) {
unsigned __int32 L, R, S, helpS = 0;
R = (unsigned __int32)(N & 0x00000000FFFFFFFF);
L = (unsigned __int32)((N & 0xFFFFFFFF00000000) >> 32);

S = (R + Key) % 0xffffffff;
for(int i = 0; i < 8; i++) { // замена с использованием таблицы замен
int Sm = (S & 0xf);
S = S >> 4;
helpS = (helpS | blokS[i][Sm]) << 4;
}
for(int i = 0; i < 11; i++) { // циклический сдвиг !!!
bool b = (helpS & 0x80000000) ? true : false;
helpS <<= 1;
if(b) {
helpS |= 0x1;
}
}
helpS = helpS ^ L;
// меняем половины местами и получаем преобразованный блок
L = R;
R = helpS;
N = ((unsigned __int64)L << 32) | (unsigned __int64)R;
return N;
}

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

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

// Шифрование
void __fastcall TForm1::Button11Click(TObject *Sender)
{
// Ключ
for(int i = 0; i < 8; i++) {
Keys[i] = StrToInt(Memo1->Lines->Strings[i]);
}

if(OpenDialog2->Execute()){
// таблица замен
FILE *f = fopen(OpenDialog2->FileName.c_str(),"rt");
int 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);

unsigned __int64 N;
f = fopen("2.txt","rt");
FILE *fOut = fopen(fileIn, "wb"); // encrypted.txt
while(!feof(f)) {
char str[sizeof(unsigned __int64) + 1] = {0};
fscanf(f, "%8s", str);
N = *(__int64*)(&str[0]);
N = emcryption(N);
fwrite(&N, sizeof(unsigned __int64), 1, fOut);
}
fclose(fOut);
}
}
//---------------------------------------------------------------------------

// Дешифрование
void __fastcall TForm1::Button12Click(TObject *Sender)
{
// Ключ
for(int i = 0; i < 8; i++) {
Keys[i] = StrToInt(Memo1->Lines->Strings[i]);
}

// таблица замен
if(OpenDialog2->Execute()) {
FILE *f = fopen(OpenDialog2->FileName.c_str(),"rt");
int 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);
//

unsigned __int64 N;
f = fopen(fileIn, "rb"); // encrypted.txt
FILE *fOut = fopen(fileOut,"wt");
while(!feof(f)) {
char str[sizeof(unsigned __int64) + 1] = {0};
if(fread(&N, sizeof(unsigned __int64), 1, f)) {
N = decryption(N);
char result[9] = {0};
strncpy(result, (char *)&N, 8);
fprintf(fOut, "%s", result);
}
}
fclose(fOut);
}
}


Исходный и расшифрованный текст (те самые 8 байт: "qwertyui") полностью идентичны.
 К началу страницы 
+ Ответить 

Сообщений в этой теме
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:30
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"