AES_ctr128_encrypt()“分段错误”(OpenSSL)

时间:2011-08-13 15:48:40

标签: c cryptography openssl aes

我需要使用openssl解密C中的一些cypherd文本(aes 128 ctr)编程,因为我正在使用的库版本不支持EVP,因为我需要使用AES_ctr128_encrypt(),但是我得到了分段错,这是我正在使用的代码:

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

int chartoint(char car);
char * extochar(char * in, int inLen);

struct ctr_state { 
    unsigned char ivec[16];   
    unsigned int num; 
    unsigned char ecount[16]; 
}; 

void init_ctr(struct ctr_state *state, const unsigned char iv[16]){
    state->num = 0; 
    memset(state->ecount, 0, 16); 
    memcpy(state->ivec, iv, 16);
} 

void main(){
    unsigned char * cypher = extochar("874d6191b620e3261bef6864990db6ce",32);
    unsigned char * key = extochar("2b7e151628aed2a6abf7158809cf4f3c",32);
    unsigned char * iv = extochar("f0f1f2f3f4f5f6f7f8f9fafbfcfdfeff",32);
    unsigned char out[256]; //more than needed
    AES_KEY aes_key;
    int msg_len = 16;
    struct ctr_state status; 

    if (!AES_set_encrypt_key(key, 16, &aes_key)){
        printf("key error"); 
        exit(-1);
    }

    init_ctr(&status, iv);

    AES_ctr128_encrypt(cypher, out, msg_len, &aes_key, status.ivec, status.ecount, &status.num);
//expected plaintext: "6bc1bee22e409f96e93d7e117393172a"
}

分段故障是在构造AES_ctr128_encrypt(),最后一个,而我期待“6bc1bee22e409f96e93d7e117393172a”作为明文(使用printf(“%02x”,var [i])来打印它)

1 个答案:

答案 0 :(得分:2)

您的AES密钥长度 256 。你告诉AES_set_encrypt_key它是 16 位。然后将密钥传递给AES_ctr 128 _encrypt。如果所有这三个数字都相同,那么你的代码会更好。