openssl aes在c中解密

时间:2017-11-03 10:13:01

标签: c openssl aes

我正在尝试使用php和c创建openssl aes加密/解密。我能够使用php和openssl加密文本,这将输出base64字符串中的加密字符串。我试图将这个base64编码的字符串传递给c程序,使用c中的openssl对其进行解码。

int decrypt(unsigned char *ciphertext,
            int ciphertext_len,
            unsigned char  *key,
            unsigned char *iv,
            unsigned char *plaintext)
{
    EVP_CIPHER_CTX *ctx;

    int len;

    int plaintext_len;

    /* Create and initialise the context */
    if(!(ctx = EVP_CIPHER_CTX_new())) handleErrors();

    if(1 != EVP_DecryptInit_ex(ctx, EVP_aes_256_cbc(), NULL, key, iv))
        handleErrors();

    if(1 != EVP_DecryptUpdate(ctx, plaintext, &len, ciphertext, ciphertext_len))
        handleErrors();
    plaintext_len = len;


    if(1 != EVP_DecryptFinal_ex(ctx, plaintext + len, &len)) handleErrors();
    plaintext_len += len;

    /* Clean up */
    EVP_CIPHER_CTX_free(ctx);

    return plaintext_len;
}

有没有方法可以在c中使用openssl解密base64字符串?我可以使用类似

的命令行解密它
openssl enc -aes-256-cbc -d -in file.encrypted -nosalt -nopad -K 31323334353637383132333435363738 -iv 31323334353637383132333435363738

提前致谢

1 个答案:

答案 0 :(得分:1)

您正在直接处理base64编码数据。 首先,您需要对数据进行base64解码以获取实际的加密数据。然后,您将应用AES解密来获取解密数据

BIO *b64, *bmem;
buffer = (char *)malloc(datalength);
b64 = BIO_new(BIO_f_base64());
if(b64 == NULL)
{

    return NULL;
}
BIO_set_flags(b64, BIO_FLAGS_BASE64_NO_NL);  
bmem = BIO_new_mem_buf(input, length);
if(bmem == NULL)
{
    return NULL;
}
bmem = BIO_push(b64, bmem);
if(bmem == NULL)
{
    return NULL;
}

ret = BIO_read(bmem, buffer, length);
if(ret == 0)
{
    return NULL;
}
BIO_free_all(bmem);
return buffer;