我找到了一些演示(Wiki,github),但它们不起作用。并运行我编写的代码打击,请参考上述链接中的代码获得Segmentation fault(core dumped)
int main(int argc, char *argv[]){
char *ciphertext;
char *key;
char *iv;
char *plaintext;
key = "AES256-GCM-KEY-1234567890abcdefg";
iv = "8a9cef0205a3";
ciphertext = "uatBMo8k7EAnDQuNK4CHASJerQZpCWv86PGditzdYnQV9uqotQ==";
plaintext = "";
decrypt(ciphertext, NULL, 0, NULL, key, iv, plaintext);
return 0;
}
int decrypt(unsigned char *ciphertext, unsigned char *aad, int aad_len, unsigned char *tag, unsigned char *key, unsigned char *iv, unsigned char *plaintext){
EVP_CIPHER_CTX *ctx;
int len, ret;
ctx = EVP_CIPHER_CTX_new();
EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_GCM_SET_IVLEN,strlen(iv),NULL);
EVP_DecryptInit_ex(ctx, NULL, NULL, key, iv);
EVP_DecryptUpdate(ctx,plaintext, &len, ciphertext, strlen(ciphertext));//"segmentation fault"
ret = EVP_DecryptFinal_ex(ctx, plaintext, &len);
EVP_CIPHER_CTX_free(ctx);
printf(ret > 0 ? "success!n" : "failed!n");
return 0;
}
我很困惑,如何使用此API在没有身份验证的情况下解密?
您需要将内存分配给指针(全部)
key = malloc(sizeof(*key) * strlen("AES256-GCM-KEY-1234567890abcdefg") + 1);
您应该使用这些标志(如果是编译器)来编译您的主体:-W -Wall -Wextra
它会告诉您您的指针是非初始化的