【问题标题】:AES_ctr128_encrypt() "Segmentation fault" (OpenSSL)AES_ctr128_encrypt() "分段错误" (OpenSSL)
【发布时间】:2011-08-13 15:48:40
【问题描述】:

我需要使用 openssl 在 C 中解密一些密码文本(aes 128 ctr)编程,因为我使用的库版本不支持 aes 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]) 来打印它)

【问题讨论】:

    标签: c cryptography openssl aes


    【解决方案1】:

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

    【讨论】:

    • 不,使用 128 位的密钥并没有太大的改进 [like: unsigned char key_big[128]; memset(key_big,0,128); if (!AES_set_encrypt_key(key_big, 128, &aes_key))printf("error");] 它总是 printf 错误
    • AES_set_encrypt_key 的返回值是多少?
    • 其实我想这16个是字节,相当于128位。
    • 传递给 AES_set_encrypt_key 的参数是位。他通过了 16,但没有 16 位 AES 密钥。
    • @David Schwartzyou 是对的! “AES_set_encrypt_key”与 128 作为 arg 一起工作正常,真正的错误是“!”在 if 语句中,现在测试向量可以正常工作了!非常感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-10
    • 2017-06-27
    • 2019-05-11
    • 1970-01-01
    • 2016-02-03
    • 1970-01-01
    相关资源
    最近更新 更多