Вычисление md5. Реализация на языке С

Это вторая статья. Продолжаем разговор о вычислении хэш-суммы по алгоритму md5. Первая статья тут:

http://wp.me/p1H7g0-1aC

Вычисление md5 в языке С практически ничем не отличается от вычисления в Питоне, разве что суеты по подготовке к компиляции будет чуть больше. Я имею в виду только то, что при установке Питона необходимый для работы модуль hashlib уже входит в состав дистрибутива, и Python-программисту ничего дополнительного предпринимать не нужно. Си-шнику же для работы с md5 придется сначала установить пакет libssl-dev:

# apt-get install libssl-dev

Эта команда для Debian. Если у вас Ubuntu, то:

$ sudo apt-get install libssl-dev

Пакет установит нужные нам для работы библиотечные файлы libcrypto.a и libcripto.so в директорий /usr/lib/. А заголовочный (хэдерный) файл md5.5 в директорий /usr/include/openssl/.

Всё это проконтролировать можно с помощью команды

$ dpkg --listfiles libssl-dev

, которая выдаст на консоль довольно-таки длинный список — какие файлы куда были установлены. Можно облегчить себе участь «прогнав» список через grep:

$ dpkg --listfiles libssl-dev | grep md5
$ dpkg --listfiles libssl-dev | grep libcrypto

Ну, так или иначе, будем считать, что пакет установлен. Теперь давайте напишем короткую тестовую программу для вычисления хэш-суммы для «ничего». Другим словами нам нужно получить стартовое значение, как в первой статье для пустого объекта.

Файл md5-test.c:

/* md5-test.c */

#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <openssl/md5.h>

int main()
{
  uint32_t i;
  MD5_CTX hMD5;
  uint8_t digest[MD5_DIGEST_LENGTH];

  MD5_Init(&hMD5);
  MD5_Final(digest, &hMD5);

  for (i = 0; i < MD5_DIGEST_LENGTH; i++)
    printf("%02x", digest[i]);

  printf("\n");

  return EXIT_SUCCESS;
}

hMD5 — это дескриптор типа MD5_CTX.
digest — 16-байтовый буфер, куда будет помещаться хэш. Его размер определяется константой MD5_DIGEST_LENGTH.

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

Остальное, если вы знаете Си, комментировать для вас будет бесполезно. Поэтому переходим к процессу компиляции.

Поскольку наш проект состоит всего из одного файла, то городить для него Makefile не имеет никакого смысла. Произведем компиляцию в командной строке:

$ gcc -lcrypto -o md5-test md5-test.c

В результате мы должны получить исполняемый файл размером примерно 7 кБ. Если все правильно, то его запуск приведет к выдаче на консоль хэш-суммы пустого объекта:

$ ./md5-test
d41d8cd98f00b204e9800998ecf8427e

Сравните с тем, что выдает Питон. Совпадает?

Теперь давайте чуть усложним программу. Давайте добавим вычисление хэш-суммы для двух строчек чисел — «12345» и «67890», как это было в Питоновской программе.

Я не буду переписывать заново весь исходник, а приведу только фрагмент, где нужно произвести изменения. Между вызовами функций MD5_Init и MD5_Final нужно вставить две строки:

...
  MD5_Init(&hMD5);
  MD5_Update(&hMD5, "12345", 5);
  MD5_Update(&hMD5, "67890", 5);
  MD5_Final(digest, &hMD5);
...

Произведите заново компиляцию и запустите новую версию проги. На консоль должна появиться следующая последовательность:

$ ./md5-test
e807f1fcf82d132f9bb018ca6738a19f

Сравните с тем, что вывела прога на Питоне. Ну что, работает? Вот и отлично!

Реклама

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход / Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход / Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход / Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход / Изменить )

Connecting to %s