Навіщо це знадобилося

Виникла задача визначити "якість" зберігання і копіювання якихось великих
файлів. Створювалися вони само собою на жорсткому диску, потім могли бути
скопійовані по локальній мережі, закачувалися на 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)
і оформляючи все у вигляді класу.

*————————————————–
* Це буде метод 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

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

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 (15 млн)) & & Сигнатура 15 мільйонів прогалин;)
? o.md5file ("bin.aa") & & e16d5641bd71c1308b9a85d47b3e6309
? o.md5file ("blabla.bla") & & FILE NOT FOUND

Власне метод, який використовується у FreeBSD, Нас цілком влаштовує.
Перед тим як перемістити дані будемо створювати файл checksum.md5 Для
цього служить метод нашого класу MD5MakeList, Яким будемо передавати
шлях до папки з даними, а він породить нам список і поверне число оброблених
файлів або -1 при помилці. Пізніше в клас були додані простенький
"Прогрессбара" (щоб користувач не нудьгував;), а також властивості:



Download


Це архів з класом md5.vc *, бібліотекою aamd532.dll і
утилітки md5.exe


aamd532.dll скопіювати в WindowsSystem або
WINNTSystem32


PS. MD5 (md5vfp.zip) = dc8e6ec6d0e84fff9fb4c73289c09210 🙂

Завантажити md5vfp.zip [18 Кб]

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*