Вычисление MD5 сигнатур файлов

Возникла задача определить "качество" хранения и копирования неких больших файлов. Создавались они само собой на жестком диске , потом могли быть скопированы по локальной сети, закачивались на FTP сервер, записывались на CDR(W). Тут и встала проблема обнаружения "битых" копий. Общий метод борьбы известен: считай контрольную сумму. Какой из алгоритмов выбрать?

Вычисление MD5 сигнатур файлов

Зачем это понадобилось

Возникла задача определить "качество" хранения и копирования неких больших файлов. Создавались они само собой на жестком диске , потом могли быть скопированы по локальной сети, закачивались на FTP сервер, записывались на CDR(W). Тут и встала проблема обнаружения "битых" копий. Общий метод борьбы известен: считай контрольную сумму. Какой из алгоритмов выбрать? Остановились на MD5 по следующим причинам:

  • это современный, стойкий, быстрый алгоритм
  • существуют консольные утилиты для вычисления
  • бесплатная реализация в виде динамической библиотеки
  • нафига еще искать, если это прекрасно работает 😉

The MD5 Message-Digest Algorithm

Сначала заставим Google поискать "md5". В первых строках получаем ссылку на MD5 Homepage (unofficial) откуда узнаем, что

MD5 был разработан в 1992 году Профессором Ronald L. Rivest из Массачусетского технологического института (MIT), одним из основателей RSA Security. Подробное описание можно найти в RFC 1321, а если коротко, то

[MD5 алгоритм] получает на вход сообщение произвольной длины и на выходе выдает "подпись"(сигнатуру) длиной 128 битов. Предполагается, что не существует двух сообщений имеющих одинаковые сигнатуры, или, что невозможно создать сообщение с заранее заданной сигнатурой. MD5 алгоритм в основном используется в крипрографических приложениях типа RSA. По существу, MD5 - это способ проверки целостности данных, гораздо более надежный, чем контрольная сумма или другие методы.

Другой умный мужик Francisco Carlos Piragibe de Almeida написал нам на счастье a DLL with a BAS wrapper module

Кроме того находим парочку консольных утилит

Условия использования простые - не забывайте указать "RSA Data Security, Inc. MD5 Message-Digest Algorithm" в своих программах и других материалах. Что собственно и делем 😉

Начинаем реализовавать новые знания

Для начала бэйсиковскую программку переводим на лисиный язык, попутно исправляя ошибки (кому интересно может тоже поразвлекаться с Fault Error) и оформляя все в виде класса.

[code] *-------------------------------------------------- * Это будет метод Init *-------------------------------------------------- DECLARE INTEGER MDStringFix IN aamd532.dll STRING s, LONG l, STRING r DECLARE INTEGER MDFile IN aamd532.dll STRING f, STRING r *-------------------------------------------------- * Function MD5String -- оформим одноименным методом *-------------------------------------------------- PARAM s r = SPACE(32) l = LEN(s) = MDStringFix( s, l, @r) RETURN r *-------------------------------------------------- * Function MD5File -- оформим одноименным методом *-------------------------------------------------- PARAM fname r = SPACE(32) = MDFile( fname, @r) RETURN r [/code]

В Command окне протестируем оба метода. Для проверки первого в конце RFC 1321 приведены тестовые образцы. Для проверки сигнатуры файла возьмем образец из дистрибутива FreeBSD 4.1-RELEASE В каждой папке с файлами там имеется файл checksum.md5, который представляет собой список сигнатур файлов.

[code] set classlib to md5 o=createobject("md5") && ------ Правильные ответы ------- ? o.md5string("") && d41d8cd98f00b204e9800998ecf8427e ? o.md5string("a") && 0cc175b9c0f1b6a831c399e269772661 ? o.md5string("abc") && 900150983cd24fb0d6963f7d28e17f72 ? o.md5string("message digest") && f96b697d7cb7938d525a2f31aaf161d0 ? o.md5string(space(15000000)) && Сигнатура 15 миллионов пробелов 😉 ? o.md5file("bin.aa") && e16d5641bd71c1308b9a85d47b3e6309 ? o.md5file("blabla.bla") && FILE NOT FOUND [/code]

Собственно метод, используемый во FreeBSD, нас вполне устраивает. Перед тем как переместить данные будем создавать файл checksum.md5 Для этого служит метод нашего класса MD5MakeList, которому будем передавать путь к папке с данными, а он породит нам список и вернет число обработанных файлов или -1 при ошибке. Позднее в класс были добавлены простенький "прогрессбар" (чтобы пользователь не скучал ;), а также свойства:

StopAtError -- если .F., то процесс обсчета не прерывается при ошибках.
BadFileCount -- после MD5MakeList содержит число необсчитанных файлов.

Download

Это архив с классом md5.vc*, библиотекой aamd532.dll и утилиткой md5.exe

aamd532.dll скопируйте в WindowsSystem или WINNTSystem32

PS. MD5 (md5vfp.zip) = dc8e6ec6d0e84fff9fb4c73289c09210 🙂


2001, Тепликов Илья, itp@karelia.ru

Автор: Илья Тепликов

Автор публикации

не в сети 2 месяца

Joys

2
Комментарии: 4Публикации: 227Регистрация: 25-06-2000
0
Вложенные файлы
#
Тип файла
Размер
Название
1 .zip 17,65 КБ md5vfp
Оставить комментарий
Авторизация
*
*
Генерация пароля