【发布时间】:2019-11-19 10:34:51
【问题描述】:
我的目标是解密一个 base64 编码的字符串。
完全运行命令:
openssl enc -base64 -d -aes-128-cbc -iv '{iv}' -K {hex_key} <<< {hex_enc_password}
我想通过 C api 做同样的事情。我知道在 stackoverflow 上有很多类似的问题,但似乎没有什么对我有用,所以我恳请您不要将此标记为重复。
信息:
hex_enc_password是base64编码的
hex_key 是字节串形式的字符串(通过 hexlify())(例如:0x1a,0xc4 -> "1ac4")
我当前的代码:
char* key = "lbzA54tAAg3E/jPxiJc34e==";
unsigned char *hex_key = hexlify(key);
char encrypted[] = {0x3d,0xd2,0x02,0xc3,0xae,0x1e,0xf5,0x7e,0x33,0xc3,0x1d,0x7b,0x1e,0x48,0x73,0x84};
size_t output_length;
unsigned char *hex_enc_password = base64_encode(encrypted, sizeof(encrypted), &output_length);
decrypt(hex_enc_password, strlen(hex_enc_password),hex_key, iv);
char* decrypt(unsigned char *ciphertext, int ciphertext_len, unsigned char *key, unsigned char *iv ) {
int outLen1 = 0; int outLen2 = 0;
unsigned char *outdata = malloc(ciphertext_len+1);
bzero(outdata, ciphertext_len+1);
//setup decryption
EVP_CIPHER_CTX *ctx = EVP_CIPHER_CTX_new();
EVP_DecryptInit(ctx,EVP_aes_128_cbc(),key,iv); //returns 1
EVP_DecryptUpdate(ctx,outdata,&outLen1,ciphertext,ciphertext_len); //returns 1
EVP_DecryptFinal(ctx,outdata + outLen1,&outLen2); //returns 0
return outdata;
}
有什么想法可能是错的吗?
【问题讨论】:
-
@JohnSmith 请不要在标题中包含多余的标签。毕竟,我们有专门的标签。
-
@JohnSmith 标签清楚地表明这个问题是关于 C 的,在标题中再次提及它是多余的。没有人会感到困惑。
-
您的参数数据有误。
strlen(hex_enc_password)对于密文的输入大小肯定是错误的。 AES 加密可以(并且经常)具有嵌入的空八位字节。或者更糟糕的是,它没有,并且您的“大小”计算陷入了过去可用内存的深渊,搜索终止符直到它最终找到一个(如果它找到了)。无论哪种方式,这种大小论点都是完全错误的。我无法告诉您是否设置了其他参数,或者设置得有多糟糕,因为您在这里没有可重现的案例,而且这不是 20 个问题。 -
EVP_DecryptXXXX不期望也不会正确处理 base64 编码的 anything。不是密钥,不是 IV,也不是密文。 -
每当我必须做这样的事情时,我总是(a)编写加密端,(b)编写解密端,然后测试以确保它有效。然后,将 encode-to 和 decode-from 步骤插入中间,然后进行测试以确保它仍然工作。如果这破坏了事情,你知道事情在哪里出轨了;编码/解码。无论如何,很高兴你能处理它!
标签: c encryption openssl