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

Python生成XOR加密串用C++解密出现冗余乱码问题求助

问题根因

  • C语言中双引号包裹的字符串字面量会自动在末尾追加\0结束符:你定义的加密串字面量共15个有效字节,因此sizeof encryptedMessage实际返回16(15个有效字节+1个自动追加的\0),循环多执行了1次异或操作,末尾的\0也参与了运算。
  • 解密后的输出数组没有手动添加\0结束符:printf打印字符串时会持续读取内存直到遇到\0才终止,因此会输出数组后方的内存垃圾值,就是你看到的末尾乱码。
  • 密钥长度统计逻辑存在隐患:直接用sizeof xorKey计算密钥长度会把密钥末尾自动追加的\0也计入,虽然你当前的逻辑做了减1处理规避了这个问题,但适配性差,后续修改密钥容易出问题。

修复方案

代码修改示例

// 显式指定加密数组长度为15,阻止编译器自动追加的\0被计入有效数据
char encryptedMessage[15] = "\x1c\x20\x3f\x38\x4f\x60\x66\x66\x7b\x7d\x73\x15\x13\x73\x6b";
char xorKey[] = "Hello324234523";
// 解密数组多留1个字节位置存储结束符
char decryptedMessage[sizeof(encryptedMessage) + 1];
// 用strlen取密钥有效长度,自动排除末尾的\0
int keyLen = strlen(xorKey);
int j = 0;
for (int i = 0; i < sizeof encryptedMessage; i++) {
    if (j == keyLen) j = 0;
    decryptedMessage[i] = encryptedMessage[i] ^ xorKey[j];
    j++;
}
// 手动给解密结果添加字符串结束符
decryptedMessage[sizeof(encryptedMessage)] = '\0';
printf("-------------------------\n");
// 用带格式符的方式打印字符串,避免潜在的格式化注入风险
printf("%s", decryptedMessage);

通用适配建议

如果后续加密字符串长度不固定,建议单独定义常量存储加密数据的有效长度,不要依赖sizeof计算字符串字面量的长度,从根源上避免自动追加\0带来的长度统计错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 16:36:00