MD5, od czego zacząć?

0

Witam. Chciałem napisać program w C który będzie tworzył sumy kontrolne algorytmem md5. Przekopałem dość sporo art. dot. samego algorytmu jednak nie do końca wiem jak zabrać się za pisanie. Chciałem zacząć od samego początku, a mianowicie w pierwszym kroku funkcja powinna dopełniać do wiadomości dodatkowe bityw taki sposób aby jej długość była krótsza niż 64 bity od wielokrotności 512. Dokleja się najpierw jedynkę potem same zera. W związku z tym mam pytanie czy np. jeśli podam jakiś tekst z klawiatury to czy powinienem zapisać go w tablicy znakowej następnie każdy znak zamienić na postać liczy binarnej, a potem ldane bity w postaci liczby binarnej pogrupować po 512 bitów i na ostatniej wielokrotności gdzie brakuje dokleić "tak po prostu" to co napisałem wcześniej? Proszę o jakieś wskazówki dot. konstrukcji takiego programu oraz sprawdzenie mojego rozumowania. Pozdrawiam i dziękuję za wszelkie odpowiedzi.

0

A czy nie możesz skorzystać z jakiejś biblioteki która robi to bezbłędnie? Python np. ma moduł do tego: http://docs.python.org/library/hashlib.html#module-hashlib - do C też powinieneś jakąś bibliotekę znaleźć :)

0

Tylko problem w tym, że potrzebuję sam stworzyć taką funkcję haszującą.Wiem, że są kody źródłowe w necie w niemalże każdym języku, ale muszę samemu ją napisać.
Dzięki za odpowiedź.

0

w sumie wydaję mi się, że najtrudniejszym krokiem jest przedstawienie wchodzącej wiadomości w postaci bitowej i operacje na takich bitach tego właśnie do końca nie wiem jak zrobić. W książce szkoła programowania jest niby rozdział operacje bitowe, ale raczej na takich prostych przykładach.

pozdrawiam noworocznie;]

0
gadon napisał(a)

w sumie wydaję mi się, że najtrudniejszym krokiem jest przedstawienie wchodzącej wiadomości w postaci bitowej i operacje na takich bitach tego właśnie do końca nie wiem jak zrobić. W książce szkoła programowania jest niby rozdział operacje bitowe, ale raczej na takich prostych przykładach.

pozdrawiam noworocznie;]

W megatoturialu Xion dobrze pokazał operacje bitowe, prościej i jaśniej się już chyba nie da...
http://xion.org.pl/files/texts/mgt/html/D_C.html

0

Ok. Operacje bitowe raczej rozumiem. Jednak chodzi mi o to w jaki sposób mógłbym przedstawić jakąś wiadomość w postaci bitowej, przykładowo czy jeśli pobieram z klawiatury jakieś słowo to jest ono następnie zapisywane do tablicy znaków, potem wartość każdego znaku odczytujemy z tablicy ASCII i te liczby przedstawiamy w postaci liczby binarnej? Czy dobrze myślę?

0
gadon napisał(a)

Ok. Operacje bitowe raczej rozumiem. Jednak chodzi mi o to w jaki sposób mógłbym przedstawić jakąś wiadomość w postaci bitowej, przykładowo czy jeśli pobieram z klawiatury jakieś słowo to jest ono następnie zapisywane do tablicy znaków, potem wartość każdego znaku odczytujemy z tablicy ASCII i te liczby przedstawiamy w postaci liczby binarnej? Czy dobrze myślę?

każda dana w pamięci maszyny to sekwencja binarna
tekst jako tablica char'ów to 8 bitowe wartości liczbowe, będące wartościami ASCII, tyle w t//negacja bitowa podanego tekstu

std::string str = "chuj ci w ...";
for(int i = 0; i < str.size(); ++i) ~str[i]; //negacja każdego bajta (8bitów) w stringu
```cpp
0

Ok. Prace ruszyły troszkę do przodu, a mianowicie mam taki kod:

#include "header.h"
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(void)
{
    int i;
    char *tab;
    tab = (char *)malloc(sizeof(char));
    printf("\nPodaj tekst. ");
    for(i= 0; (tab[i] = getchar()) != '.'; ++i)
    tab = (char *)realloc(tab, (i + 1) * sizeof(char));
    tab[i+1] = '\0';

    //printf(" ten ciag to: %s  jego dl to: %d \n", tab, strlen(tab) + 1);

    unsigned char blok[64];
    for(i = 0; i < 64; i++)
    blok[i] = 0;                    //wypelnianie zherami tablicy
    strcpy(blok, tab);
    blok[strlen(tab) + 1] = 128;

    unsigned char dlugosc[8];
    for(i = 0; i < 8; i++)
    dlugosc[i] = 0;
    int n = strlen(tab) + 1;
    for(i = 0; i < 8; i++)
    {
        dlugosc[7 - i] = (unsigned char)((n >> (8 * i)) & 255);
        blok[63 - i] = dlugosc[7 - i];
        //printf("\\%u\\", dlugosc[7 - i]);
    }

    for(i = 0; i < 64; i++)
    printf(" %u ", blok[i]);
    //printf(" %u ", wartosci());
    free(tab);
    return 0;
}

 

Mam problem z dynamiczną alokacją pamięci, a mianowicie działa ona dla jakiejś małej ilości znaków, natomiast przy parunastu już znakach blokuje się program. Kolejnym znakiem zapytania jest dlaczego przy pętli for gdzie dodaję wielkość wprowadzonej wiadomości bajt po bajcie, od tyłu bloku, program wykonuje to dwukrotnie.. Mam jeszcze pytanie jak mógłbym wykonać, żeby program wprowadzany tekst dzielił na 64 bajtowe bloki w razie kiedy ta długość będzie większa od 56 bajtów(czy może jakaś lista, albo coś tego typu?)?

Pozdrawiam i z góry dzięki za odpowiedź.
gadon

1 użytkowników online, w tym zalogowanych: 0, gości: 1