#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. Я предлагаю вам развернуть отладчик, чтобы выяснить, где возникает ошибка.