Liczenie sumy MD5

Liczenie sumy MD5
P3
  • Rejestracja:prawie 8 lat
  • Ostatnio:9 miesięcy
  • Postów:113
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)?

wujnia
  • Rejestracja:około 8 lat
  • Ostatnio:ponad 7 lat
  • Postów:161
0

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

P3
  • Rejestracja:prawie 8 lat
  • Ostatnio:9 miesięcy
  • Postów:113
0

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

wujnia
Nic nie pajacuje, ale jak jesteś pod linuxem to możesz to z terminala tak sprawdzić.
hauleth
Moderator
  • Rejestracja:około 17 lat
  • Ostatnio:10 dni
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.


vpiotr
  • Rejestracja:ponad 13 lat
  • Ostatnio:prawie 3 lata
0

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

P3
  • Rejestracja:prawie 8 lat
  • Ostatnio:9 miesięcy
  • Postów:113
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.

vpiotr
  • Rejestracja:ponad 13 lat
  • Ostatnio:prawie 3 lata
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

P3
  • Rejestracja:prawie 8 lat
  • Ostatnio:9 miesięcy
  • Postów:113
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) :)

edytowany 1x, ostatnio: pain368
hauleth
Moderator
  • Rejestracja:około 17 lat
  • Ostatnio:10 dni
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):

Kopiuj
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.


edytowany 1x, ostatnio: hauleth
P3
  • Rejestracja:prawie 8 lat
  • Ostatnio:9 miesięcy
  • Postów:113
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 :).

edytowany 2x, ostatnio: pain368
hauleth
Moderator
  • Rejestracja:około 17 lat
  • Ostatnio:10 dni
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:

Kopiuj
#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:

Kopiuj
#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.


P3
  • Rejestracja:prawie 8 lat
  • Ostatnio:9 miesięcy
  • Postów:113
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 ? :)

edytowany 2x, ostatnio: hauleth
Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)