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

