2014-12-03 29 views
1

我正在尝试编写一个小程序在CBC模式下使用OpenSSL和AES加密某些内容。 这里是我的代码:Segfault from /lib/x86_64-linux-gnu/libcrypto.so.1.0.0

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <stdint.h> 
#include <openssl/aes.h> 
#include <openssl/rand.h> 

// main entrypoint 
int main(int argc, char **argv) 
{ 

    unsigned char *aes_key = malloc(32*sizeof(unsigned char)); 
     printf("Enter a 32 char key\n"); 
     scanf("%s", aes_key); 
     if ((sizeof(aes_key)/sizeof(aes_key[0])) != 8) { 
      fprintf(stderr,"you didn't write 32 char\n"); 
      return -1; 
     } 


    uint64_t msg = 30849384302932039; 

    /* generate input with a given length */ 
    unsigned char *aes_input = malloc(100*sizeof(unsigned char)); 
    sprintf(aes_input, "%lu", msg); 

    /* init vector */ 
    unsigned char *iv = (unsigned char*)malloc(sizeof(unsigned char) *AES_BLOCK_SIZE); 
    RAND_bytes(iv, AES_BLOCK_SIZE); 

    // buffers for encryption and decryption 
    unsigned char *enc_out = malloc(sizeof(unsigned char)*16); 
    sprintf(enc_out, "%d", 0); 

    AES_KEY enc_key, dec_key; 
    AES_set_encrypt_key(aes_key, 32, &enc_key); 
    AES_cbc_encrypt(aes_input, enc_out, 16, &enc_key, iv, AES_ENCRYPT); 

    printf("original:\t + %s\n",aes_input); 
    printf("encrypt:\t + %s\n",enc_out); 

    return 0; 
} 

我编译它与gcc -g test.c -lcrypto -o test但是当我运行它,我得到一个分段错误和gdb指示我:

Program received signal SIGSEGV, Segmentation fault. 
0x00007ffff7a7b9a0 in ??() from /lib/x86_64-linux-gnu/libcrypto.so.1.0.0 

尝试调试之后,我发现,该行AES_cbc_encrypt(aes_input, enc_out, 15, &enc_key, iv, AES_ENCRYPT);负责segfaut ...但是,所有参数似乎初始化,我试图打印他们的价值观,我没有得到任何问题?

所以我不真的搞错我做错了,有人可以帮我吗?非常感谢你:)

+0

分割故障这么多的理由,没有调用堆栈显示?首先,你需要调试你的程序,看看它在哪条线上崩溃...... – neo 2014-12-03 10:37:02

+0

嗯,我只是做了它,它似乎是'AES_cbc_encrypt(aes_input,enc_out,15,&enc_key,iv AES_ENCRYPT)'这一行,这使得我的程序崩溃。我将修改我的帖子以表明它 – Raoul722 2014-12-03 10:39:34

+0

您需要进一步了解该功能。 – neo 2014-12-03 10:41:54

回答

1
unsigned char *aes_key = malloc(32*sizeof(unsigned char)); 
... 
if ((sizeof(aes_key)/sizeof(aes_key[0])) != 8) { 

这是没有得到阵列(32)的大小,而是一个指针的大小unsigned char

同为

const uint64_t encslength = ((sizeof(aes_input)/sizeof(aes_input[0]) + AES_BLOCK_SIZE)/AES_BLOCK_SIZE) * AES_BLOCK_SIZE; 

看看到Question 7.28 of C FAQ

+0

谢谢你的回答。那么这意味着我的测试是无用的,对吗?但我不知道如何正确测试......无论如何,我不认为这是我的段错误的来源 – Raoul722 2014-12-03 10:44:18

+1

您的段错误的来源可能是'const uint64_t encslength =((sizeof(aes_input)/ sizeof(aes_input [ 0])...'因为'aes_input'是一个指针(不是一个数组) – 2014-12-03 10:47:52

+0

那么我在我的代码中用'100'替换了'encslength',我仍然在'AES_cbc_encrypt(aes_input,enc_out,15 ,&enc_key,iv AES_ENCRYPT)'。但是非常感谢您的帮助 – Raoul722 2014-12-03 10:54:18