Liczenie sumy MD5

0

Dzień dobry,

To mój pierwszy post na tym forum :) Więc jeśli się powtórzyło (a pewnie tak jest) to wybaczcie .

Chce napisać prosty program wyliczający sume MD5 , tylko nie wiem czy nie za bardzo ambitnie do tego podszedłem ..:p.
Ambicja - Nie było by w tym nic złego gdyby nie to ,że w zasadzie to dopiero zaczynam programowanie w c++ v.11 . Nauke programowania rozpocząłem od Pythona ,więc podstawowe informacje mam .. Mam na myśli pętle , instrukcje , typy danych , podejście proceduralne , funkcje i zrozumienie podejścia obiektowego(ale w tedy przerwałem naukę pythona ,i zacząłem od zera cpp).

Zeby zrozumieć jak działa algorytm md5 ,zasięgnąłem do oficjalnej dokumentacji RFC ..:) i przyznam że chciał bym spróbować napisać ten program ,chociaż sam mechanizm... myślę że była by to dobra praktyka .

Ale teraz utknąłem w momencie konwersji z systemu HEX(16) na BIN(2), używałem funkcji bitset<x>(x) ale mam problem z konwersją typ ustring na typ char .
Próbowałem tez funkcji getline(cin,zmienna_dst) ,ale jest jakiś problem przy konwersji z typu string na int .

Several question:

1.Czy podpowie mi ktoś jak ugryźć temat konwersji ?
2. Czy próba napisanie tego algorytmu to trochę za dużo jak na początek ? Generalnie nie chce się ograniczyć to gotowych funkcji :).
3.Może powineinem stworzyć jakąś tablice asocjacyjną( nie wiem jeszcze czy w cpp coś takiego jest , z php-a kojarzę ) i do kazdej litery alfabetu przypisać wartość z kodu ASCII a potem z D(10) na BIN(2)?

0

Jak już napiszesz to sobie przetestuj md5sum plik ;-)

0

Hej hej :) nie do końca rozumiem , jeśli się mylę to wyprowadź mnie z błędu ,ale wyczuwam lekką ironię :)

0

Nie za bardzo ogarniam co chcesz zrobić i na kiego wała Ci tutaj bitset? Podaj fragment kodu gdzie masz problem. Ogólnie w tym algorytmie nie ma żadnej konwersji między czymkolwiek, bo on operuje na bitach (w większości implementacji na bajtach) więc nie ma czegoś takiego jak konwersja hex <-> bin.

0

Zacznij może od czegoś prostszego, np. CRC32.

0

Nie żebym był zbyt delikatny ,ale jesteś bardzo nie uprzejmy(jak na moderatora) ,jeśli masz problemy z nerwami to odczekaj chwile, ja dopiero zaczynam być może projekt zbyt trudny więc spróbuje z crc32.

W kodzie jedyny problem tkwi w konwersji typów, chce ze string-a zrobić konwersje na dziesiętny ,potem na binarny. Wpadłem teraz na pomysł żeby "zaszyfrować" to wszystko w taki sposób jak robi to XOR. Ale nie znam jeszcze funkcji która zwróciła by mi wynik string/chara w postaci binarnej.

Po co ? a no to jedyna funkcja(?)/suffix która do tej pory (tylko)wyświetliła mi wynik binarny ,ale tylko z typu intiger.

0

Nie wiem do którego moderatora pisałeś, ale jeśli chodzi o stan aktualny postów, to lepiej się przygotuj na dużo ostrzejsze komentarze na tym forum. Na razie nie było nawet sugestii tego co Cię tu może spotkać. Także skorupa na garb i do kodowania! A co do tych konwersji, to raczej jeszcze nie wiesz czego chcesz, a już na pewno nie konwersji na format binarny.

Trochę o bitach: http://www.foundbit.com/pl/zasoby/jezyki/cpp/podstawy/articles/cpp-bity.html

0

mam na myśli moderatora o nicu : hauleth. Spokojnie , ale jestem wyczulony na to :) . Biorę pod uwagę poprawkę z racji medium przekazu (brak emotikonek itp) :)

2

Ale nie znam jeszcze funkcji która zwróciła by mi wynik string/chara w postaci binarnej.

W komputerze wszystko jest liczbą. Znaki też. Oczywiście zależnie od kodowania ich wartości liczbowe będą różne, ale w najczęściej spotykanym obecnie przypadku jest to ASCII. Więc mając ciąg znaków przetwarzasz go używając podanego algorytmu. Momentami będziesz musiał zamienić twój strumień bitów w np. liczbę 32 bitową z podanym kodowaniem (big lub little endian) wygląda to tak (zakładając, że char ma 8 bitów, tak jak jest na większości obecnych platform):

aaaaaaaa - bity 1 liczby
bbbbbbbb - bity 2 liczby
cccccccc - bity 3 liczby
dddddddd - bity 4 liczby

aaaaaaaaabbbbbbbbccccccccdddddddd - big endian czyli tzw. network byte order
ddddddddcccccccccbbbbbbbbaaaaaaaa - little endian, czyli obecnie kolejność występująca na większości komputerów klasy PC

Dalej rzucasz ogólnikami i to co masz to ogólnie znany problem XY, czyli pytasz nas o to jak rozwiązać problem, który nie jest istotą twojego problemu. Problemem jest to, że nie rozumiesz jak są w komputerze składowane dane i jak je można przetwarzać. Ogólnie wszystkie funkcje skrótu tak jak napisałem wyżej operują na bajtach lub poszczególnych bitach (wszystkie funkcje SHA operują na bitach, ale rzadko która implementacja to tak robi, bo nie ma to wielu zastosowań praktycznych). W przypadku algorytmów kryptograficznych problemem jest to, że w ich opisach string znaczy zupełnie coś innego niż jesteś przyzwyczajony z reszty programowania. Dla Ciebie pewnie jest to ciąg znaków i symboli zakodowanych w ASCII natomiast w algorytmach krypto jest to strumień bajtów/bitów, który nie ma żadnego konkretnego kodowania, bo dla algorytmu nie ma to znaczenia. To samo dotyczy się reszty pojęć jak wiadomość, klucz, nonce, etc.

Ogólnie algorytm MD5 nie jest trudny w implementacji, gorzej jest z tym by to zrobić wydajnie, ale w celach naukowych to i tak nie ma znaczenia. Problem jest w tym, że Ty widać nie ogarniasz podstaw i przez to masz takie problemy. Bo sam algorytm jedyną konwersję jaką wymaga to umiejętność zamienienia 4x uint8_t na uint32_t zakodowane IIRC w big endian, która jest bardzo prosta jak umie się przeprowadzić podstawowe operacje bitowe.

EDIT: To nie tak, że chciałem być niemiły (bo dalej nie wiem co w tym było "niemiłego"), tylko byś uściślił z czym masz problem i przedstawił co już zrobiłeś, bo tak to obecnie sobie gdybamy o jakichś problemach, które zapewne nie mają ze sobą nic wspólnego.

0

Hej, oki . Faktycznie mam mało podstawy jeśli chodzi o ten język , myślałem że realizując projekt przyśpieszę przyswojenie informacji .. Ale muszę troszkę przystopować .

Co do koncepcji ..
Pomyślałem że najpierw trzeba zacząć od zmiany tekstu jawnego na kod hex/dec, co w sumie samo z siebie może być szyfrem (zależy kto na to patrzy),ale nie to ma być celem tej praktyki. Dużo łatwiej z tego systemu przejść na sys. binarny . Dla czego takie podejście ? odpowiedź jest bardzo prosta, to podejście jeszcze ze szkoły , pewnie dla tego analogicznie próbowałem zrobić z liczbami/znakami ,bo wiem że każdy znak w ASCII ma swój odpowiednik w hex/dec, i to traktowałem jako punkt wyjścia :).

2

samo z siebie może być szyfrem

Nie szyfrem a kodem. To są zupełnie 2 różne rzeczy. Kod w swoim założeniu nie ukrywa informacji w żaden sposób a jest jedynie inną formą prezentacji tego samego. To tak jak zapisanie tekstu po polsku cyrlicą.

Co więcej MD5 nie jest szyfrem a funkcją skrótu. To są już zupełnie inne bajki. W MD5 nie ma czegoś takiego jak "tekst jawny", jest tylko wiadomość i jej skrót. Ideą kryptograficznych funkcji skrótu jest to by po otrzymaniu wiadomości można było potwierdzić, że to jest ta sama wiadomość co wysłana i nikt nie był w stanie jej zmienić. Oczywiście jest to niemożliwe by mieć 100% pewność, że to jest ta sama wiadomość (bo nieskończenie wiele wiadomości może mieć ten sam skrót), ale by nikt umyślnie nie był w stanie podmienić wiadomości na inną, która ma taki sam skrót.

Dużo łatwiej z tego systemu przejść na sys. binarny

Dalej nie rozumiesz, ty już masz binarną reprezentację wiadomości w postaci ciągu liczb w pamięci. Przykładowy program to obrazujący:

#include <stdio.h>
#include <ctype.h>

int main() {
    const char* string = "Hello World";

    for (size_t i = 0; i < strlen(string); i++)
        printf("%c = %x (%d)\n", string[i], string[i], string[i]);
}

http://ideone.com/Bubd8C

Oczywiście możemy tą wiadomość bez problemu przedstawić również w formie binarnej:

#include <stdio.h>
#include <ctype.h>
 
void print_bin(char c) {
    for (int i = 1 << 7; i != 0; i >>= 1)
        printf("%c", c & i ? '1' : '0');
    puts("");
}
 
int main() {
    const char* string = "Hello World";
 
    for (size_t i = 0; i < strlen(string); i++) {
        printf("%c = %x (%d) = ", string[i], string[i], string[i]);
        print_bin(string[i]);
    }
}

http://ideone.com/sIS8sU

W programowaniu musisz przestać myśleć o hex/dec, bo to jest tylko forma prezentacji danych. One zawsze są w formie binarnej w komputerze.

Pomijamy już fakt, że MD5 zostało dawno "złamane" (są opracowane bardzo wydajne algorytmy generowania kolizji) i absolutnie nigdzie, gdzie jest istotne bezpieczeństwo nie należy go używać.

I tak, może taki projekt pomógłby Ci nauczyć się języka, ale wpierw musiałbyś umieć programować. A to jednak nie jest to samo. Bez podstaw niestety nic nie zdziałasz.

0

Dziękuję , myślę że pomogłeś mi zaoszczędzić czas no i wielce prawdopodobne ,że uchroniłeś przed zrażeniem się :). Ide się uczyć , atakuję tę pozycje :
http://faculty.euc.ac.cy/scharalambous/csc132/books/c++_book%201.pdf

Tak odbiję , czy waszym zdania mógł bym krok po kroczku rozwijać program np.do analizy Forex/Gpw ? :)

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