Ошибка сегментации в do_crypt()

#c

#c

Вопрос:

Это мой код, но когда я его запускаю, он выдает ошибку сегментации в функции do_crypt(). Когда я пытаюсь распечатать все ключи в функции, она распечатает только несколько, и я не знаю почему, потому что, если я напечатаю все ключи перед вызовом do_crypt, он напечатает их без каких-либо проблем.

Любой совет по исправлению этого был бы прекрасен!!

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


#define MAX_LINE_NUM 25143
#define MAX_LINE_LEN 80
#define MAX_WORDS 25143
#define MAX_WORD_LEN 30

char words[MAX_WORDS][MAX_WORD_LEN];
unsigned char output[] = "";

void read_KeyFile(int *line_counter, char *KeyFilename, char arr[MAX_LINE_NUM][MAX_LINE_LEN]){
    FILE *fptr;
    char read_line[MAX_LINE_LEN];
    char buffer[MAX_LINE_NUM];
    const char delim[] = " n";
    int buff_line_num = 0;
    int word_counter = 0;
    char *token;

    fptr = fopen(KeyFilename, "r");
    while(fgets(read_line, MAX_LINE_LEN, fptr) != NULL){
        strncpy(arr[*line_counter], read_line, MAX_LINE_LEN);
        *line_counter = *line_counter   1;
    }
    fclose(fptr);

    for (int i = 0; i<*line_counter; i  ){
        strncpy(buffer, arr[buff_line_num], MAX_LINE_LEN);
        token = strtok(buffer, delim);
        while(token != NULL){
            strncpy(words[word_counter], token, MAX_WORD_LEN);
            word_counter = word_counter   1;

            token = strtok(NULL, delim);
        }
        buff_line_num  ;
    }
}

int do_crypt(char plaintext[], char ciphertext[], unsigned char tempKey[], unsigned char output[], int do_encrypt){

    unsigned char inbuf[1024], outbuf[1024   EVP_MAX_BLOCK_LENGTH];
    int inlen, outlen;
    EVP_CIPHER_CTX ctx;

    unsigned char iv[] = "aabbccddeeff00998877665544332211";
    unsigned char key[] = "";
    strcpy(key, tempKey);
    int len = strlen(key);
    
    if (len < 16){
        for (int i=0; i<(16-len) 1; i  ){
            strcat(key, "#");
        }
    }

    FILE *in;
    in = fopen("Input.txt", "r");
    FILE *out;
    out = fopen("output.txt", "w");

    EVP_CIPHER_CTX_init(amp;ctx);
    EVP_CipherInit_ex(amp;ctx, EVP_aes_128_cbc(), NULL, NULL, NULL, do_encrypt);
    OPENSSL_assert(EVP_CIPHER_CTX_key_length(amp;ctx) == 16);
    OPENSSL_assert(EVP_CIPHER_CTX_iv_length(amp;ctx) == 16);

    EVP_CipherInit_ex(amp;ctx, NULL, NULL, key, iv, do_encrypt);

    for(;;) {
        inlen = fread(inbuf, 1, 1024, in);
        if(inlen <= 0) break;
        if(!EVP_CipherUpdate(amp;ctx, outbuf, amp;outlen, inbuf, inlen)){
            /* Error */
            EVP_CIPHER_CTX_cleanup(amp;ctx);
            return 0;
        }
        fwrite(outbuf, 1, outlen, out);
        strcpy(output, outbuf);
    }
    if(!EVP_CipherFinal_ex(amp;ctx, outbuf, amp;outlen)){
        /* Error */
        EVP_CIPHER_CTX_cleanup(amp;ctx);
        return 0;
    }
    fwrite(outbuf, 1, outlen, out);
    strcpy(output, outbuf);

    EVP_CIPHER_CTX_cleanup(amp;ctx);


    return 1;

}

void toHexConverter(unsigned char output[], int i, unsigned char tempKey[17]){
    char hex[100];
    for (int j=0, k=0; j<strlen(output);   j, k  =2){
        sprintf(hex   k, "x", output[j] amp; 0xff);
    }
    strcpy(output, hex);
}

int main(int argc, char *argv[]){
    
    char plaintext[] = "This is a top secret.";
    unsigned char ciphertext[] = "764aa26b55a4da654df6b19e4bce00f4ed05e09346fb0e762583cb7da2ac93a2";
    char hexCompare[] = "";
    

    int line_counter = 0;
    char *KeyFilename = NULL;
    char lines[MAX_LINE_NUM][MAX_LINE_LEN];    
    unsigned char tempKey[] = "";
    int do_encrypt = 1;
    
    KeyFilename = argv[1];
    
    read_KeyFile(amp;line_counter, KeyFilename, lines);
    
    for (int i=0; i<MAX_WORDS; i  ){
        // printf("%sn", words[i]);
        strcpy(tempKey, words[i]);
        do_crypt(plaintext, ciphertext, tempKey, output, do_encrypt);
    }
}
  

Комментарии:

1. for (int i=0; i<=MAX_WORDS; i ) выглядит подозрительно. Это может привести к повреждению массива, но есть код, который вы не показываете. В любом случае unsigned char tempKey[17] выглядит туго. Не будьте скупы на размеры строк: попробуйте unsigned char tempKey[100] .

2. Я отредактировал вопрос и опубликовал весь свой код

3. i<=MAX_WORDS должно быть i<MAX_WORDS . Массив в C индексируется от 0 to [length-1] . Следите и за другими конечными тестами, такими как i<(16-len) 1 , хотя я не знаю, что это ошибка.

4. Это я

5. Я предлагаю вам развернуть отладчик, чтобы выяснить, где возникает ошибка.