8位分组密码代码错误排查请求(4+4位交换异或逻辑)
代码错误排查与修正
问题根源
代码中对高4位的处理逻辑完全错误:需求是将高4位拆成两个2位组,分别交换每组内的位,但原代码却把高4位的「高2位组」和「低2位组」整体交换,完全偏离了规则。
以原字符'H'(0x48,二进制01001000)为例:
- 正确处理:高4位
0100拆成01和00两个2位组,分别交换后得到10和00,组合成新的高4位1000(0x8) - 原代码处理:把高4位的低2位
00和高2位01整体交换,得到0001(0x1),直接导致后续加密结果错误
修正后的代码
#include <stdlib.h> #include <string.h> #include <stdio.h> unsigned char* encrypt(const char* text) { int len = strlen(text); unsigned char* encrypted = (unsigned char*) malloc(len * sizeof(unsigned char)); for (int i = 0; i < len; i++) { unsigned char c = text[i]; unsigned char first_half = (c >> 4) & 0x0F; // 提取高4位 unsigned char second_half = c & 0x0F; // 提取低4位 // 拆分高4位为两个独立2位组,分别执行组内位交换 unsigned char high_two = (first_half >> 2) & 0x3; // 高2位组 unsigned char low_two = first_half & 0x3; // 低2位组 // 两位组内交换:ab → ba unsigned char swapped_high = ((high_two & 0x1) << 1) | ((high_two & 0x2) >> 1); unsigned char swapped_low = ((low_two & 0x1) << 1) | ((low_two & 0x2) >> 1); unsigned char swapped_first_half = (swapped_high << 2) | swapped_low; unsigned char xor_result = swapped_first_half ^ second_half; encrypted[i] = (swapped_first_half << 4) | xor_result; } return encrypted; } int main() { unsigned char* e; e = encrypt("Hello world!"); for(int i=0; i < 12;i++) printf("%x ", e[i]); // 现在输出会匹配预期:80 9c 95 95 96 11 bc 96 b9 95 9d 10 free(e); // 释放内存,避免泄漏 }
关键修正说明
- 将高4位拆分为独立的
high_two(高2位组)和low_two(低2位组) - 对每个2位组单独执行位交换:通过位运算把组内的高低位互换(如
01→10) - 组合交换后的两个2位组,得到符合需求的
swapped_first_half - 新增
free(e)修复内存泄漏问题
内容的提问来源于stack exchange,提问作者xoreks
相关产品推荐
相关产品推荐

