比较字节数组时的Malloc错误

时间:2018-09-20 16:34:25

标签: c openssl malloc

我不知道我的代码出了什么问题。我知道函数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 :(得分:1)

无需在任何中进行动态分配。整个练习的目的是蛮力生成随机的,等长的字母数字字符串,将其消化,并在对与前三个八位位组匹配的字符串进行罚款时停止。

  • 不需要字符串转换
  • 可以使用一个大小相同的消息缓冲区(与测试消息的大小匹配)。
  • 您可以重复使用摘要上下文。无需继续分配和销毁它。
  • 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

答案 1 :(得分:0)

我想出来的朋友。

我从没使用过free(qt),所以最终,它在循环后用完了要分配的内存!