我的目标是解密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;
}


任何想法可能有什么问题吗?

最佳答案

我终于得到它的工作。
如以上注释中所述,base64中不应编码任何内容。使用-base64调用命令行二进制文件仅会使openssl对其进行解码,然后再继续。废话不多说,就跳过。

除此以外的所有内容均应与上述相同。

10-06 09:15
查看更多