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

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

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

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 04.06.2018, 15:54   #1
Anton_Jag
Пользователь
 
Регистрация: 05.11.2009
Сообщений: 41
По умолчанию чтение/записи бинарный файл

Шифрую данные стурктуры методом vmpc и записываю в бинарный файл. Далее пытаюсь считать и расшифровать. Расшифровываются все поля кроме последнего. Не могу понять почему.
Код:
typedef unsigned char u8;

u8 n = 0;
u8 P[256];
u8 s = 0;

void setup(u8 * key, u8 * iv)
{
	long m, i;
	u8 temp;
	s = 0;

	for (i = 0; i < 256; i++)
	{
		P[i] = (u8)i;
	}

	for (m = 0; m < 768; m++)
	{
		s = P[(s + P[m & 0xff] + key[m % 64]) & 0xff];
		temp = P[m & 0xff];
		P[m & 0xff] = P[s & 0xff];
		P[s & 0xff] = temp;
	}
	for (m = 0; m < 768; m++)
	{
		s = P[(s + P[m & 0xff] + iv[m % 64]) & 0xff];
		temp = P[m & 0xff];
		P[m & 0xff] = P[s & 0xff];
		P[s & 0xff] = temp;
	}
	n = 0;
}

void crypt(u8 * input, u8 * output, long len)
{
	long i;
	u8 z, temp;
	for (i = 0; i < len; i++)
	{
		s = P[(s + P[n & 0xff]) & 0xff];
		z = P[(P[(P[s & 0xff]) & 0xff] + 1) & 0xff];
		temp = P[n & 0xff];
		P[n & 0xff] = P[s & 0xff];
		P[s & 0xff] = temp;
		n = (u8)((n + 1) & 0xff);
		output[i] = (u8)(input[i] ^ z);
	}
}


int toFileCrypt(char* c_key, char* filename){
    FILE* ptr = fopen(filename, "wb");
    if(ptr == NULL) return -1;

    Elem* temp = head;
    u8 key[64];
    u8 iv[64];
    u8 buf1[S_FIELD];
    u8 buf2[S_FIELD];
    u8 buf3[S_FIELD];
    u8 buf4[6];
    u8 buf5[S_FIELD];
    u8 buf6[S_FIELD];
    strcpy((char*)key,"9999999999999999999999999999999999999999999999999999999999999999");
	strcpy((char*)iv, "8888888888888888888888888888888888888888888888888888888888888888");
	for(int i = 0; i < strlen(c_key); i++)
            key[i] = c_key[i];

    while(temp != NULL){

        setup(key, iv);
        crypt((u8*)temp->proiz, buf1, S_FIELD);
        fwrite(buf1, 1, S_FIELD, ptr);

        setup(key, iv);
        crypt((u8*)temp->model, buf2, S_FIELD);
        fwrite(buf2, 1, S_FIELD, ptr);

        setup(key, iv);
        crypt((u8*)temp->apert, buf3, S_FIELD);
        fwrite(buf3, 1, S_FIELD, ptr);

        sprintf((char*)buf4,"%i\0", temp->iso);
        setup(key, iv);
        crypt(buf4, buf4, 6);
        fwrite(buf4, 1, 6, ptr);

        setup(key, iv);
        crypt((u8*)temp->razresh, buf5, S_FIELD);
        fwrite(buf5, 1, S_FIELD, ptr);

        setup(key, iv);
        crypt((u8*)temp->format, buf6, S_FIELD);
        fwrite(buf6, 1, S_FIELD, ptr);

        temp = temp->next;
    }
    fclose(ptr);
}

int fromFileCrypt(char* c_key, char* filename){
    FILE* ptr = fopen(filename, "rb");
    if(ptr == NULL) return -1;

    u8 key[64];
    u8 iv[64];
    u8 buf[S_FIELD];
    u8 buf2[S_FIELD];
    u8 proiz[S_FIELD];
    u8 model[S_FIELD];
    u8 iso[6];
    u8 apert[S_FIELD];
    u8 razresh[S_FIELD];
    u8 format[S_FIELD];
    strcpy((char*)key,"9999999999999999999999999999999999999999999999999999999999999999");
	strcpy((char*)iv, "8888888888888888888888888888888888888888888888888888888888888888");
	for(int i = 0; i < strlen(c_key); i++)
            key[i] = c_key[i];

    while(!feof(ptr)){

        if(fread(buf,1,S_FIELD,ptr) != S_FIELD) break;
		setup(key, iv);
		crypt(buf, buf, S_FIELD);
        strcpy(proiz, (char*)buf);

        if(fread(buf,1,S_FIELD,ptr) != S_FIELD) break;
		setup(key, iv);
		crypt(buf, buf, S_FIELD);
        strcpy(model, (char*)buf);

        if(fread(buf,1,S_FIELD,ptr) != S_FIELD) break;
		setup(key, iv);
		crypt(buf, buf, S_FIELD);
        strcpy(apert, (char*)buf);

        if(fread(buf,1,6,ptr) != 6) break;
		setup(key, iv);
		crypt(buf, buf, 6);
        strcpy(iso, (char*)buf);

        if(fread(buf,1,S_FIELD,ptr) != S_FIELD) break;
		setup(key, iv);
		crypt(buf, buf, S_FIELD);
        strcpy(razresh, (char*)buf);

        if(fread(buf2,1,S_FIELD,ptr) != S_FIELD) break;
		setup(key, iv);
		crypt(buf2, buf2, S_FIELD);
        strcpy(format, (char*)buf2);

        elementAdd(proiz, model, apert, atoi(iso), razresh, format);
    }
    fclose(ptr);
}
Для эксперимента переставил местами запись и считывание двух последних полей
Код:

        if(fread(buf2,1,S_FIELD,ptr) != S_FIELD) break;
		setup(key, iv);
		crypt(buf2, buf2, S_FIELD);
        strcpy(format, (char*)buf2);

if(fread(buf,1,S_FIELD,ptr) != S_FIELD) break;
		setup(key, iv);
		crypt(buf, buf, S_FIELD);
        strcpy(razresh, (char*)buf);
Не хочет расшифровывать(или неправильно зашифровывает) именно поле temp->format
Сама структура
Код:
typedef struct Elem Elem;

struct Elem{
    char* proiz;
    char* model;
    char* apert;
    int iso;
    char* razresh;
    char* format;
    struct Elem *next;
};

Последний раз редактировалось Anton_Jag; 04.06.2018 в 16:30.
Anton_Jag вне форума Ответить с цитированием
Старый 04.06.2018, 16:33   #2
Anton_Jag
Пользователь
 
Регистрация: 05.11.2009
Сообщений: 41
По умолчанию

Проект целиком. CodeBlocks
Вложения
Тип файла: rar BD.rar (48.7 Кб, 4 просмотров)
Anton_Jag вне форума Ответить с цитированием
Старый 05.06.2018, 03:39   #3
alexzk
Форумчанин
 
Регистрация: 12.04.2017
Сообщений: 889
По умолчанию

Смотрю вы меня не дочитали в прошлой теме...

Код:
 strcpy((char*)key,"9999999999999999999999999999999999999999999999999999999999999999");
	strcpy((char*)iv, "8888888888888888888888888888888888888888888888888888888888888888");
можно заменить на

Код:
memset(key, '9', sizeof(key));
memset(iv, '8', sizeof(iv));
Блин, и вообще, почистите код. Ваш этот char *format содержит 1 букву ? Ну так заменить поле просто на char.
Вместо strcpy используйте memcpy, т.к. длины вы уже знаете.
100500 буферов у вас...к чему? - можно сделать 1 большой (макс. длина среди всех) и пользовать егою (кстати, для strcpy после текущих осмысленных данных должен быть 0, т.е. если вычитаете 2 байта, а потом 1 байт - ваша прога сломалась. Там 2й байт не ноль будет, а то что осталось от первого чтения. Инициализаций у вас там тоже нет буферов, так что они тоже не ноль. Повторяете, как с ключем было).

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

Код:
 if(fread(buf,1,S_FIELD,ptr) != S_FIELD) break;
		setup(key, iv);
		crypt(buf, buf, S_FIELD);
        strcpy(apert, (char*)buf);
Если правильно писать код - таких исключительных (дляtemp->format) ошибок не будет. Раз нет копипасты - значит не работает или все, или все ок.
Типа так:
Код:
static bool readNext(FILE* fp, const size_t len_bytes, void* outp)
{
    char buf[1024];
    if (len_bytes -1 >= sizeof(buf))
          return false;
    memset(buf, 0, len_bytes + 1);
    bool result = false;
    if((result = fread(buf,1, len_bytes, fp) == len_bytes))
    {
          setup(key, iv);
          crypt(buf, buf, len_bytes);
         memcpy(outp, buf, len_bytes);
    }
    return result;
};
Вобщем моя мысль простая - зачем искать ошибки в копи-пасте? Уберите копипасту и ошибки исчезнут сами.

Потом, вам не лень ото 100500 proiz переменных писать, есть же struct Elem, сделайте так


Код:
struct Elem{
    char proiz[S_FIELD];
    char model[S_FIELD];
    char apert[S_FIELD];
    int iso;
    char razresh[S_FIELD];
    char format[S_FIELD];
    struct Elem *next;
};
Дальше чтение
Код:

void elementAdd(const Elem* source)
{
     Elem *ptr = new Element();
    memcpy(ptr, source, sizeof(Elem));
     //добавляем в список - ставим указатели и т.д.
}

int fromFileCrypt(char* c_key, char* filename){
    FILE* ptr = fopen(filename, "rb");
    if(ptr == NULL) return -1;
     u8 key[64];
    u8 iv[sizeof(key)]; 
    memset(key, '9', sizeof(key));
    memset(iv, '8', sizeof(iv));
    Elem tmp; 
    u8 iso[6]; memset(iso, 0, sizeof(iso));
     bool ok = true;
     while(!feof(ptr) && ok){
       memset(&tmp, 0, sizeof(tmp));
       ok &= readNext(ptr, tmp.proiz, sizeof(tmp.prois));
       ok &= readNext(ptr, tmp.model, sizeof(tmp.model));
       ok &= readNext(ptr, tmp.apert, sizeof(tmp.apert));
       ok &= readNext(ptr, iso, sizeof(iso));
       ok &= readNext(ptr, tmp.razresh, sizeof(tmp.razresh));
      ok &= readNext(ptr, tmp.format, sizeof(tmp.format));
      if (ok)
         tmp.iso = atoi(iso);
      elementAdd(&tmp);
    }
    fclose(ptr);
}
Можно еще добавить магии и совсем убрать копи-паст, но тут я на форумном редакторе текста могу и ошибиться:
Код:
#define READF(NAME) ok &= readNext(ptr, tmp.NAME, sizeof(tmp.NAME))
int fromFileCrypt(char* c_key, char* filename){
    FILE* ptr = fopen(filename, "rb");
    if(ptr == NULL) return -1;
     u8 key[64];
    u8 iv[sizeof(key)]; 
    memset(key, '9', sizeof(key));
    memset(iv, '8', sizeof(iv));
    Elem tmp; 
    u8 iso[6]; memset(iso, 0, sizeof(iso));
     bool ok = true;
     while(!feof(ptr) && ok){
       memset(&tmp, 0, sizeof(tmp));
       READF(proiz);
       READF(model);
       READF(apert);
       ok &= readNext(ptr, iso, sizeof(iso));
       READF(razresh);
       READF(format);
      if (ok)
         tmp.iso = atoi(iso);
      elementAdd(&tmp);
    }
    fclose(ptr);
}
#undef READF

Последний раз редактировалось alexzk; 05.06.2018 в 04:42.
alexzk вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Паскаль. Написать программу записи в файл и чтение из файла элементов массива структур для регистрации автомашин с полями... spike_1 Помощь студентам 1 01.03.2015 08:50
C++, задача на бинарный файл (Бинарный файл состоит из записей по 5 бит) zaitsevmishka Помощь студентам 3 16.05.2014 21:39
Бинарный файл. Чтение записи с конца. rommster Общие вопросы C/C++ 30 12.12.2012 23:45
Чтение и запись структуры в бинарный файл. jack291 Помощь студентам 2 20.08.2011 18:07
Чтение и запись структуры в бинарный файл Bed Alice Общие вопросы C/C++ 1 09.11.2010 21:17