2009-04-12 2 views
1

Я пытаюсь что-то сделать на C с MD5 (и последний пытается что-то сделать с помощью алгоритма SHA1). Моя основная проблема заключается в том, что я никогда на самом деле не делал ничего сложного в C, просто простую вещь (ничего похожего на указатели на указатели или структуры).Пытаюсь понять алгоритм MD5

I got the md5 algorithm here.

Я включил файлы md5.c и md5.h в моем C проекта (с использованием CodeBlocks), но единственная проблема в том, что я не очень понимаю, как использовать его. Я прочитал и перечитал код, и я не понимаю, как использовать эти функции, чтобы превратить «пример» в хэш MD5.

Я еще не сделал программирование на C (в основном php), поэтому я немного потерялся здесь. В основном то, что я прошу, касается некоторых примеров использования. Они предоставляются через файл md5main.c, но я их не понимаю.

Я целенаправленно здесь? Должен ли я остановить все это и снова начать чтение книги C, или кто-нибудь может дать мне несколько указателей и посмотреть, смогу ли я это понять.

Спасибо.

ответ

5

Пока я согласен с Биллом, вы должны вернуться к книге C, если хотите действительно понять, что делаете. Но, в попытке помочь, я изменил и прокомментировал некоторые из кода от md5main.c ...

const char* testData = "12345"; // this is the data you want to hash 
md5_state_t state; // this is a state object used by the MD5 lib to do "stuff" 
        // just treat it as a black box 
md5_byte_t digest[16]; // this is where the MD5 hash will go 

// initialize the state structure 
md5_init(&state); 

// add data to the hasher 
md5_append(&state, (const md5_byte_t *)testData, strlen(testData)); 

// now compute the hash 
md5_finish(&state, digest); 

// digest will now contain a MD5 hash of the testData input 

Надеется, что это помогает!

+0

Спасибо за это. Я пробовал ваш код, и я получил это -> é | ╦ ♫ ÛèplL4íhæ ° N { Я запускаю это на winxp при победе консоли. Имеет ли он какое-то отношение к кодировке символов? – AntonioCS

+0

, поэтому дайджест двоичный, другими словами массив дайджеста заполнен 16 байтами данных (не 16 символов), если вы хотите его в печатном формате, тогда вы можете использовать этот цикл для его печати в виде шестнадцатеричной строки: для (int di = 0; di <16; ++ di) printf ("% 02x", дайджест [di]); –

+0

конечно! Спасибо, он работает сейчас :) – AntonioCS

5

Вы должны остановить все это и снова начать чтение книги C.

Мой опыт в том, что когда я пытаюсь изучить новый язык программирования, нецелесообразно одновременно пытаться реализовать сложный проект. Вы должны делать простые упражнения на языке C, пока не почувствуете себя комфортно с языком, а затем займитесь чем-то вроде реализации MD5 или интеграции существующей реализации.

Кстати, код чтения - это навык, отличный от написания кода. Существуют различия между этими двумя навыками, но оба требуют, чтобы вы хорошо понимали язык.

+0

Я знаю C, но, по-видимому, не так хорошо :( – AntonioCS

+0

Ну, идея работает так же хорошо, как «освежающий себя языком, который я не использовал в то время». Вам нужно пройти, прежде чем вы запустите. –

+0

Вы правы. :) – AntonioCS

2

Я думаю, вы выбрали худшее, на что можно обратить внимание (не по своей вине). Алгоритмы шифрования и хеширования сделают самое странное использование языка возможным для того, чтобы сделать тот тип математики, который им нужно сделать быстро. Их почти гарантированно запутывают и трудно понять. Кроме того, вам нужно будет увязнуть в математике, чтобы действительно понять их.

Если вы просто хотите алгоритм хеширования, получите известную реализацию и используйте ее как черный ящик. Не пытайтесь реализовать его самостоятельно, вы почти наверняка внесете некоторую криптографическую слабость в реализацию.

Редактировать: Чтобы быть полностью отзывчивым, если вы хотите отличные книги (или ресурсы) для шифрования, посмотрите на Брюса Шнайера. Applied Cryptography - классика.

+0

+1 Я согласен с MD5 и алгоритмы, как будто они сложны. Это не лучшие примеры кода для изучения того, кто приближается к скорости на языке программирования. –

+0

Спасибо за совет.Я действительно перечитаю книгу C и попытаюсь снова схватить бинарные и шестнадцатеричные вещи. – AntonioCS

Смежные вопросы