c语言中的openssl aes解密

Posted

技术标签:

【中文标题】c语言中的openssl aes解密【英文标题】:openssl aes decryption in c 【发布时间】:2017-11-03 10:13:01 【问题描述】:

我正在尝试使用 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

提前致谢

【问题讨论】:

gist.github.com/barrysteyn/4409525 这可能会有所帮助,或者:openssl.org/docs/manmaster/man3/BIO_f_base64.html klutt,谢谢你的回复,解码后我也想用openssl解密 这里是一个使用cbc的例子(不推荐使用)wiki.openssl.org/index.php/… 【参考方案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;

【讨论】:

谢谢Pras的回复,可以用c解码,之后有什么办法可以用open ssl和c解密吗? @Developers Staff 我已经更新了示例代码,你也可以试试 base64 decode

以上是关于c语言中的openssl aes解密的主要内容,如果未能解决你的问题,请参考以下文章

AES (aes-cbc-128, aes-cbc-192, aes-cbc-256) 使用 openssl C 加密/解密

PHP中的AES加密以在openssl中解密

PHP的aes加解密算法

使用 OpenSSL/C++ 和 PHP/Mcrypt 的 AES-128-CBC 加密:仅解密第一个块

如何使用 OpenSSL 进行 AES 解密

Ruby 中的 SJCL AES-128-CCM 解密