C语言加解密程序仅返回前40字符问题排查求助
排查C语言加密解密程序的40字符限制问题
聚焦你怀疑的hex_to_str函数,这类十六进制与字符串互转的函数很容易因长度处理逻辑出错导致截断,以下是核心排查方向和解决思路:
常见问题点
- 硬编码固定长度缓冲区:检查函数内部是否写死了类似
char buf[41];的固定数组,哪怕外部传入更大的缓冲区,内部小缓冲区会直接截断内容。 - 长度计算逻辑错误:十六进制串转原字符串时,有效长度是十六进制串的1/2。如果函数错误地将原字符串长度直接作为十六进制串的处理上限,或者反过来计算,会导致处理到40字符时停止(比如默认只处理80位十六进制字符,对应40个原字符)。
- 字符串结束符遗漏:转换后未手动添加
\0,当缓冲区超过40字符时,内存中的垃圾数据会让字符串看起来只返回前40字符,实际是后续内容未正确终止。 - 调用参数传递错误:调用
hex_to_str时,传入的目标缓冲区长度仍为40,哪怕你调整了输入缓冲区,输出缓冲区未同步放大也会导致截断。
具体排查步骤
- 打印长度做对比:在
hex_to_str入口打印输入十六进制串的长度,转换后打印输出字符串的长度,验证是否符合预期(比如输入81位十六进制字符,输出应是41个原字符)。 - 替换硬编码长度:把函数内固定长度的数组定义,改成动态传入的参数。比如修改函数签名为:
确保void hex_to_str(const char* hex, char* str, size_t str_len)str_len足够容纳转换后的内容(至少是十六进制串长度的1/2 +1,预留结束符位置)。 - 强制添加结束符:转换完成后,手动在
str[转换后的有效长度] = '\0';,避免字符串越界或截断。 - 检查全链路缓冲区:加密时生成的十六进制串缓冲区、解密时传入的原字符串缓冲区,都要同步调整到足够尺寸。比如要支持100字符输入,十六进制串缓冲区至少201字节(100*2 +1),解密缓冲区至少101字节。
错误示例与修正
比如这种硬编码长度的错误实现:
void hex_to_str(const char* hex, char* str) { char buf[41]; // 硬编码仅支持40字符+结束符 int i; for(i=0; i<40; i++) { // 转换逻辑 buf[i] = ...; } buf[40] = '\0'; strcpy(str, buf); // 直接截断到40字符 }
修正为动态处理长度的版本:
void hex_to_str(const char* hex, char* str, size_t max_str_len) { size_t hex_len = strlen(hex); // 十六进制串长度需为偶数,否则忽略最后一个字符 if(hex_len % 2 != 0) hex_len--; size_t max_convert_len = hex_len / 2; // 避免超出目标缓冲区大小,预留结束符位置 if(max_convert_len >= max_str_len) max_convert_len = max_str_len - 1; for(size_t i=0; i<max_convert_len; i++) { char hex_byte[3] = {hex[2*i], hex[2*i+1], '\0'}; str[i] = strtol(hex_byte, NULL, 16); } str[max_convert_len] = '\0'; }
另外别忘了检查加密函数是否也存在硬编码长度限制,比如加密时只处理前40字符,导致生成的十六进制串只有80位,解密自然只能得到40字符。
内容的提问来源于stack exchange,提问作者Kiến Nguyễn
相关产品推荐
相关产品推荐

