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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 17.05.2013, 21:29   #1
Jirogirg
Пользователь
 
Регистрация: 13.05.2012
Сообщений: 30
По умолчанию Проверка целостности файлов (c++)

Здравствуйте! Получил задание:
"Подсчет контрольно*й суммы для каждого из файлов заданного поддерева*
файловой системы. Для подсчета контрольно*й суммы использова*ть алгоритм SHA 1.*
Путь к поддереву файловой системы задается*
из командной строки в качестве единственн*ого аргумента. Каждый из файлов выводится*
на стандартны*й вывод отдельной строкой, перед именем файла выводится значение*
SHA 1 дайджеста в шестнадцат*иричной форме и пробел.*
Если язык C: для рекурсивно*го обхода дерева использова*ть функции opendir/readdir, stat.*



~md5sum_check*

Подсчет контрольно*й суммы для каждого из файлов заданных списком в текстовом*
файле*
и сверка полученной* суммы со значением из того же контрольно*го списка*
для обнаружени*я модифициро*ванных файлов.*
Для подсчета контрольно*й суммы использова*ть алгоритм SHA 1.*
Список для сверки записан в текстовом файле, имя этого файла передаётся**
единственн*ым аргументом* командной строки.*
Каждая строка списка сверки имеет вид:*
<SHA 1 дайджест в hex> <путь к файлу>* "

Из всей этой информации я понял, что все файлы в директории надо пропустить через алгоритм SHA 1. Далее полученные коды надо вывести на экран в формате дайджест_имяфайла.

Вторая часть - держать контрольный суммы в текстовом файле. И полученные контрольные суммы сравнивать с имеющимися.

Можно получить какие-нибудь советы с чего начать? Просто давно не программировал уже. Решения не прошу, просто хотелось бы понять вообще задачу правильно.
Jirogirg вне форума Ответить с цитированием
Старый 18.05.2013, 06:44   #2
Ezhik Kihze
Форумчанин
 
Регистрация: 24.12.2012
Сообщений: 639
По умолчанию

1. написать функцию обхода папки, полученной из параметра (примеров навалом)
2. написать функцию подсчета хеша (примеров навалом)
3. соединить это и вывести на экран

Простейшая логика ж....
ICQ: 677936656 Gmail: ekEmbed@gmail.com
Ezhik Kihze вне форума Ответить с цитированием
Старый 18.05.2013, 19:24   #3
Jirogirg
Пользователь
 
Регистрация: 13.05.2012
Сообщений: 30
По умолчанию

Вот самую простотень набил:
Код:
using namespace std;
int main () {
	DIR *tmnt;
	SHA1 sha1;
	bool x;
	struct dirent *entry;
	tmnt=opendir(".");
	if (tmnt==NULL) {
	cout<<"no such file\n";
	}
	while ((entry=readdir(tmnt)) != NULL) {
		
		printf("  %s\n", entry->d_name);
	}
	return 0;
}
Выводит на экран все файлики в директории. Хочу теперь каждый файлик чере SHA1 пропустить. Но что-то не догоняю.

Вот код вроде бы нужной функции класса SHA1
Код:
/*  
 *  Result
 *
 *  Description:
 *      This function will return the 160-bit message digest into the
 *      array provided.
 *
 *  Parameters:
 *      message_digest_array: [out]
 *          This is an array of five unsigned integers which will be filled
 *          with the message digest that has been computed.
 *
 *  Returns:
 *      True if successful, false if it failed.
 *
 *  Comments:
 *
 */
bool SHA1::Result(unsigned *message_digest_array)
{
    int i;                                  // Counter

    if (Corrupted)
    {
        return false;
    }

    if (!Computed)
    {
        PadMessage();
        Computed = true;
    }

    for(i = 0; i < 5; i++)
    {
        message_digest_array[i] = H[i];
    }

    return true;
}
На вход она принимает указатель на массив undefined integer из пяти элементов. И записывает дайджест в него же. Я не понимаю сути. Мне нужно пропустить какой-то файл и получить его уникальный код, который и будет контрольной суммой файла, но в скачанной реализации SHA1 я ничего подобного не нашёл, а пример использования SHA1 в с++ на гугле тоже что-то не замечал.

Последний раз редактировалось Jirogirg; 18.05.2013 в 19:32.
Jirogirg вне форума Ответить с цитированием
Старый 18.05.2013, 21:49   #4
Ezhik Kihze
Форумчанин
 
Регистрация: 24.12.2012
Сообщений: 639
По умолчанию

Цитата:
Вот код вроде бы нужной функции класса SHA1
Вы пробывали читать коменты к ней?.. Есть же готовые варианты в инете. Возьмите криптоапи хотя бы.
ICQ: 677936656 Gmail: ekEmbed@gmail.com
Ezhik Kihze вне форума Ответить с цитированием
Старый 18.05.2013, 22:09   #5
Jirogirg
Пользователь
 
Регистрация: 13.05.2012
Сообщений: 30
По умолчанию

Нашёл в том же файлике реализацию сравнения сумм двух файлов.
Код:
for(i = 1; i <= 2; i++)
    {
	
        sha.Reset();

        if (!(fp = fopen(argv[i],"rb")))
        {
            fprintf(stderr, "sha: unable to open file %s\n", argv[i]);
            return SHA1_FILE_ERROR;
        }

        c = fgetc(fp);
        while(!feof(fp))
        {
            sha.Input(c);
            c = fgetc(fp);
        }

        fclose(fp);

        if (!sha.Result(message_digest[i-1]))
        {
            fprintf(stderr,"shacmp: could not compute message digest for %s\n",
                    argv[i]);
            return SHA1_FILE_ERROR;
        }
    }
Пытаюсь на основе этого построить функцию просто вычета суммы. С входным параметром имя файла. Вот написал и запнулся. Ругается, что не может преобразовать *FILE в *char..

Код:
int summa (const char * x) 
{
	SHA1 sha1;
	FILE *fp;
	char c [100];
	sha1.Reset();
	fp = fopen(x,"r");
	c=fgets(fp);
}

Последний раз редактировалось Jirogirg; 18.05.2013 в 22:12.
Jirogirg вне форума Ответить с цитированием
Старый 19.05.2013, 20:11   #6
Jirogirg
Пользователь
 
Регистрация: 13.05.2012
Сообщений: 30
По умолчанию

Код:
void summa (char *x) 
{
    unsigned message_digest[1] [5];
	SHA1 sha1;
	FILE *fp;
	char m;
	sha1.Reset();
	fp = fopen(x,"rb");
	m=fgetc(fp);
    while (!feof(fp))
    {
        sha1.Input(m);
        m = fgetc(fp);
    }
    fclose(fp);

    if (!sha1.Result(message_digest[0]))
        {
            fprintf(stderr,"shacmp: could not compute message digest for %s\n",
                    x);
            //return SHA1_FILE_ERROR;
        }	
	printf( "\t%08X %08X %08X %08X %08X\n",
            message_digest[0][0],
            message_digest[0][1],
            message_digest[0][2],
            message_digest[0][3],
            message_digest[0][4]);
}
Так я подсчитываю контрольную сумму файлика. На линуксе в аудитории работало, а дома на винде что-то не пашет. Точнее прога компилится, но потом зависает при запуске.
Jirogirg вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ограничения целостности MySQL sl1mka Помощь студентам 0 30.10.2011 16:39
Ошибка целостности Aleksey1989 БД в Delphi 2 05.06.2011 07:28
Проверка файлов VadEr Помощь студентам 3 18.03.2011 14:34
Проверка расширений файлов spamer Общие вопросы Delphi 6 20.07.2009 02:02
Проверка целостности файлов trech85 Общие вопросы Delphi 1 28.11.2008 19:08