You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

AES-128 CBC模式解密输出乱码问题求助

AES-128-CBC加密正常但解密后输出乱码问题

尝试使用AES 128 CBC模式对字符串缓冲区进行加密和解密,选择CBC是因为它支持一次性加密整个数组。加密过程似乎正常,但解密失败,解密后的输出为无法识别的乱码。

测试代码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <openssl/aes.h>

#define AES_KEY_SIZE 128
#define AES_BLOCK_SIZE 16

void encryptMessage(const char *message, size_t messageLen, const unsigned char *key, const unsigned char *iv, unsigned char *ciphertext) {
    AES_KEY aesKey;
    AES_set_encrypt_key(key, AES_KEY_SIZE, &aesKey);

    AES_cbc_encrypt((unsigned char *)message, (unsigned char*)ciphertext, messageLen, &aesKey, (unsigned char *)iv, AES_ENCRYPT);
}

void decryptMessage(const unsigned char *ciphertext, size_t ciphertextLen, const unsigned char *key, const unsigned char *iv, char *decryptedMessage) {
    AES_KEY aesKey;
    AES_set_decrypt_key(key, AES_KEY_SIZE, &aesKey);

    AES_cbc_encrypt(ciphertext, (unsigned char *)decryptedMessage, ciphertextLen, &aesKey, (unsigned char *)iv, AES_DECRYPT);    
    //size_t paddingLen = decryptedMessage[ciphertextLen - 1];
    //decryptedMessage[ciphertextLen - paddingLen] = '\0';
}

int main() {
    const unsigned char key[AES_KEY_SIZE] = "mysecretkey1234";
    const unsigned char iv[AES_BLOCK_SIZE] = "abcdefghijklmnop";

    char message[1024];
    unsigned char ciphertext[1024];
    char decryptedMessage[1024];

    printf("Enter a message: ");
    fgets(message, sizeof(message), stdin);
    message[strcspn(message, "\n")] = '\0';

    size_t messageLen = strlen(message);

    encryptMessage(message, messageLen, key, iv, ciphertext);

    decryptMessage(ciphertext, messageLen, key, iv, decryptedMessage);

    printf("Original Message: %s\n", message);
    printf("Encrypted Message: ");
    for (size_t i = 0; i < messageLen; ++i) {
        printf("%02x", ciphertext[i]);
    }
    printf("\n");

    printf("Decrypted Message: %s\n", decryptedMessage);

    return 0;
}

运行结果

Enter a message: asdadfadfadfa
Original Message: asdadfadfadfa
Encrypted Message: 70bbb018fc29b4a5255938ea7a
Decrypted Message: p???)??*R7?v?%?

官方文档说明

AES_cbc_encrypt encrypts (or decrypts, if enc == AES_DECRYPT) len bytes from in to out. The length must be a multiple of the block size. This function may be called in-place with in equal to out, but otherwise the buffers may not partially overlap. A partial overlap may overwrite input data before it is read.

OPENSSL_EXPORT void AES_cbc_encrypt(const uint8_t *in, uint8_t *out, size_t len, const AES_KEY *key, uint8_t *ivec, const int enc);

已尝试的解决方法

  • 在解密函数中添加空终止符(相关代码已注释),未解决问题
  • 将解密结果从十六进制转ASCII,无效

已查找相关示例但未找到匹配项目需求的内容,希望得到技术帮助。


内容的提问来源于stack exchange,提问作者stan_the_man

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 20:49:49