我需要使用 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]) 来打印它)
您的 AES key 是 256 位长。您告诉 AES_set_encrypt_key 它是 16 位。然后将 key 传递给 AES_ctr 128 _encrypt。如果所有这三个数字都相同,您的代码会工作得更好。
我是一名优秀的程序员,十分优秀!