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
相关产品推荐
相关产品推荐

