Ошибка Malloc при сравнении массивов байтов - PullRequest
0 голосов
/ 20 сентября 2018

Я не могу понять, где мой код работает неправильно.Я знаю, что в моей функции getit () есть ошибка выделения, но я не могу понять, почему!Любая помощь приветствуется.

Моя программа выполняет хеширование сообщения в один массив.Затем у меня есть генератор случайных слов, который создает строки и хэширует их.Моя программа затем сравнивает хэши и продолжает составлять слова до тех пор, пока хеш не совпадет с оригинальным.

 #include <stdio.h>
 #include <openssl/evp.h>
 #include <string.h>

void randString(int length, char* s);
void getit(unsigned char rando[], unsigned char hash[]);
char* mess1 = "Test Message";
unsigned char match[3];
int boolean = 0; 
unsigned char orHash[3];
unsigned char raHash[3];
int counter = 0;

 int main(int argc, char *argv[])
 {
    srand(time(NULL));
    EVP_MD_CTX *mdctx;
     const EVP_MD *md;
     unsigned char md_value[EVP_MAX_MD_SIZE];
     int md_len, i;


     OpenSSL_add_all_digests();

     md = EVP_get_digestbyname("SHA256");

     mdctx = EVP_MD_CTX_create();
     EVP_DigestInit_ex(mdctx, md, NULL);
     EVP_DigestUpdate(mdctx, mess1, strlen(mess1));
     EVP_DigestFinal_ex(mdctx, md_value, &md_len);
     EVP_MD_CTX_destroy(mdctx);
     strcpy(match,md_value);
     strcpy(orHash,match); 
     printf("Digest is: ");
     for (i = 0; i < 3; i++)
         printf("%02x", match[i]);
     printf("\n");


   while(boolean < 3){
    char* qt = malloc(strlen(mess1) * sizeof(char));
    randString(strlen(mess1),qt);
     mdctx = EVP_MD_CTX_create();
     EVP_DigestInit_ex(mdctx, md, NULL);
     EVP_DigestUpdate(mdctx, qt, strlen(mess1));
     EVP_DigestFinal_ex(mdctx, md_value, &md_len);
     EVP_MD_CTX_destroy(mdctx);
     strcpy(raHash,md_value);
     getit(raHash, orHash);
    }

     exit(0);
 }

 void randString(int length, char* s) {
    const char alpha[] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
    for (int i = 0; i < length; i++){
        s[i] = alpha[rand()%(int)(sizeof(alpha) -1)];
    }
    s[length] = '\0';
 }

void getit(unsigned char rando[], unsigned char hash[]){
    counter += 1;

    for (int i = 0; i < 3; i++)
         printf("%02x", rando[i]);

    for(int i = 0; i < 3; i++){
        if (rando[i] != hash[i]){
                printf("%d: The hashes don't match\n", counter);
        boolean = 0;
                break;
            }
            boolean += 1;
        if(boolean == 3){
            printf("Match Found!");

        }    
        }
}

Я получаю следующую ошибку:

hash: malloc.c:2392: sysmalloc: Assertion `(old_top == initial_top (av) && old_size == 0) || ((unsigned long) (old_size) >= MINSIZE && prev_inuse (old_top) && ((unsigned long) old_end & (pagesize - 1)) == 0)' failed.

Код пробивается в пробной версии 505каждый раз (завершил сравнение проб 504), пытаясь определить, совпадают ли эти два массива, так что это может помочь.

Ответы [ 2 ]

0 голосов
/ 20 сентября 2018

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

  • Нет преобразования строктребуется
  • Можно использовать один буфер сообщений одинакового размера (соответствующий размеру вашего тестового сообщения).
  • Вы можете повторно использовать контекст дайджеста.Не нужно продолжать выделять и уничтожать его.
  • getit в конечном счете бессмысленно, кроме как подсчитывать счетчик.

Результат примерно такой:

Код

#include <stdio.h>
#include <string.h>
#include <openssl/evp.h>

void randString(size_t length, char* s);

int main()
{
    unsigned char md_value[EVP_MAX_MD_SIZE];
    unsigned char md_test[EVP_MAX_MD_SIZE];
    unsigned int md_len, i;

    char msg[] = "Test Message";

    srand((unsigned)time(NULL));

    OpenSSL_add_all_digests();

    const EVP_MD *md = EVP_get_digestbyname("SHA256");
    EVP_MD_CTX *mdctx = EVP_MD_CTX_create();

    EVP_DigestInit_ex(mdctx, md, NULL);
    EVP_DigestUpdate(mdctx, msg, sizeof msg-1);
    EVP_DigestFinal_ex(mdctx, md_value, &md_len);

    printf("Digest is: ");
    for (i = 0; i < md_len; i++)
        printf("%02x", md_value[i]);
    printf("\n");

    int counter = 0;
    while (1)
    {
        ++counter;
        char rand_msg[sizeof msg];
        randString(sizeof msg - 1, rand_msg);
        EVP_DigestInit_ex(mdctx, md, NULL);
        EVP_DigestUpdate(mdctx, rand_msg, sizeof rand_msg - 1);
        EVP_DigestFinal_ex(mdctx, md_test, &md_len);
        if (memcmp(md_test, md_value, 3) == 0)
        {
            printf("Match found: %s\nAttempts: %d\n", rand_msg, counter);
            printf("Digest is: ");
            for (i = 0; i < md_len; i++)
                printf("%02x", md_test[i]);
            printf("\n");
            break;
        }
    }

    return 0;
}

Пример вывода (различается, очевидно)

Digest is: b67d1b3ab0d839eb8bc1156b8717bb441c897fcab323374e2ae530a40632feba
Match found: nPbeGgsZcNoo
Attempts: 9570596
Digest is: b67d1bcdab5d05a8712a8cd4c99b5bf683fdcefcf43fc453f852f4ff14b28a39
0 голосов
/ 20 сентября 2018

Друзья, я понял это.

Я никогда не использовал free (qt), поэтому, в конце концов, ему не хватило памяти для выделения после зацикливания!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...