• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

C - Problem z MD6

Object Storage Arubacloud
0 głosów
110 wizyt
pytanie zadane 15 sierpnia 2018 w C i C++ przez DeBos123 Nałogowiec (44,950 p.)

Witam, potrzebuję napisać program w języku C, który wypisze mi hash MD6 podanego wyrazu.

Wszystkie pliki potrzebne do tego pobrałem z tej strony: https://groups.csail.mit.edu/cis/md6/downloads.html

Mój kod wygląda następująco:

#include "md6/md6.h"
#include <string.h>
#include <stdio.h>

int main(){
	unsigned char *s="abc";
	unsigned char *o;
	md6_hash(256,s,strlen(s),o);
	printf(o);
	return 0;
}

Po skopmilowaniu programu poleceniem:

gcc main.c md6/md6_compress.c md6/md6_mode.c -o main.exe

i uruchomieniu go dostaje taki wynik:

kIM¸X▬p̨☺dpPW─♂feuÚÜŽůîąôŇHV█ŻŞmain.exe

Co robię źle i jak mogę uzyskać taki wynik:

230637d4e6845cf0d092b558e87625f03881dd53a7439da34cf3b94ed0d8b2c5

 

1 odpowiedź

0 głosów
odpowiedź 15 sierpnia 2018 przez mokrowski Mędrzec (155,460 p.)
wybrane 16 sierpnia 2018 przez DeBos123
 
Najlepsza
Podpowiem:

1. Jako jaki typ danych chcesz to wyświetlić przez printf(...)? Pewnie string ?

2. A w docelowym buforze ( o ) jest miejsce na te dane?

3. Argument nr 3 to ilośc bajtów? Czy może bitów?
komentarz 15 sierpnia 2018 przez DeBos123 Nałogowiec (44,950 p.)

W pliku nagłówkowym funkcja md6_hash wygląda tak:

extern int md6_hash( int d,                         /* hash bit length */
		     unsigned char *data,     /* complete data to hash */
		     uint64_t databitlen,        /* its length in bits */
		     unsigned char *hashval                 /* output */
		     );

1. Jako jaki typ danych chcesz to wyświetlić przez printf(...)? Pewnie string ?

Tak, najlepiej string.

2. A w docelowym buforze ( o ) jest miejsce na te dane?

Tylko zdefiniowałem zmienną 'o', więc raczej jest tam miejsce.

3. Argument nr 3 to ilośc bajtów? Czy może bitów?

Argumenty nr 3 i 1 muszą być podane w bitach (na początku podałem jest w bajtach), ale jak pomnożyłem je przez 8 to wynik wygląda tak:

A!!<losowy znak>

 

komentarz 15 sierpnia 2018 przez mokrowski Mędrzec (155,460 p.)

Nie chcę rozwiązać za Ciebie problemu. Nagłówek czytałem :)

1. To jest prototyp printf:

int printf(const char * restrict format, ...);

2. Nie nie masz miejsca na dane w o. Wskaźnik ma tylko miejsce na ... wskaźnik.

3. Dobrze że przemnożyłeś. A chcesz mieć '\0' kończące string czy nie?

komentarz 15 sierpnia 2018 przez DeBos123 Nałogowiec (44,950 p.)

1. To jest prototyp printf:

 Czyli rozumiem, że powinienem zamienić:

printf(o);

na:

printf("%s",o);

Czy źle zrozumiałem i to nie ma znaczenia?

2. Nie nie masz miejsca na dane w o. Wskaźnik ma tylko miejsce na ... wskaźnik.

Zmieniłem trochę kod:

int main(){
    unsigned char o;
    md6_hash(2048,"abc",strlen("abc")*8,&o);
    printf("%s",o);
    return 0;
}

Teraz wynik jest:

(null)

Nie wiem co zrobić, żeby wartość zmiennej 'o' została zmieniona w tamtej funkcji.

A chcesz mieć '\0' kończące string czy nie?

 Wydaje mi się, że jeżeli ma to być tablica char'ów to musi być '\0' na końcu

komentarz 16 sierpnia 2018 przez DeBos123 Nałogowiec (44,950 p.)

@mokrowski, czy mógłbyś prosze mi napisać co robię źle albo chociaż w jakim miejscu jest błąd?

Źle definiuje zmienne?

Zmieniłem trochę kod, ale dalej nie dostaję oczekiwanego wyniku:

#include "md6/md6.h"
#include <string.h>
#include <stdio.h>

int main(){
	unsigned char o[256];
	unsigned char b[]="abc";
	md6_hash(2048,(unsigned char *)b,strlen(b)*8,(unsigned char *)o);
	printf(o);
	return 0;
}

Nie wiem gdzie robie błąd, ponieważ:

  • W zmiennej 'o' jest miejsce (może jest go za mało?) na wynik.
  • Argumenty nr 1 i 3 są podane w bitach
komentarz 16 sierpnia 2018 przez mokrowski Mędrzec (155,460 p.)

Błędów masz bez liku. Nie obraź się ale mówiąc wprost nie ma sensu się nad nimi pochylać bo byłby to "gruby smrodek edukacyjny"...

Masz tu rozwiązanie na szybko. Nie alokowałem bufora ze sformatowanym wynikiem bo chciałeś dostać wynik na konsolę.

#include "md6/md6.h"
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>

#define MD6_HASH_SIZE 256
#define MD6_RESULT_BUFFER_SIZE (MD6_HASH_SIZE / CHAR_BIT)

#define TABLE_SIZE(table) (sizeof(table) / sizeof(table[0]))

void show_hash(const unsigned char buffer[static MD6_RESULT_BUFFER_SIZE]) {
    for(size_t i = 0; i < MD6_RESULT_BUFFER_SIZE; ++i) {
        printf("%02x", buffer[i]);
    }
}

int main(void){
    unsigned char values[] = "abc";
    unsigned char hash_result[MD6_RESULT_BUFFER_SIZE];

    int md6_status = md6_hash(MD6_HASH_SIZE,
                                values,
                                (TABLE_SIZE(values) - 1) * CHAR_BIT,
                                hash_result);

    if(MD6_SUCCESS == md6_status) {
        show_hash(hash_result);
        putchar('\n');
    } else {
        fprintf(stderr, "md6 hash error\n");
        return EXIT_FAILURE;
    }

    return EXIT_SUCCESS;
}

 

komentarz 16 sierpnia 2018 przez DeBos123 Nałogowiec (44,950 p.)

Błędów masz bez liku. Nie obraź się ale mówiąc wprost nie ma sensu się nad nimi pochylać bo byłby to "gruby smrodek edukacyjny"...

To, że jest tutaj dużo błędów to jest niestety prawda, więc nie mam się co obrażać.

Masz tu rozwiązanie na szybko.

Dziękuje za pomoc.

Nie znaleziono podobnych pytań

92,575 zapytań

141,424 odpowiedzi

319,649 komentarzy

61,960 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...