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

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); // 释放内存,避免泄漏
}

关键修正说明

  1. 将高4位拆分为独立的high_two(高2位组)和low_two(低2位组)
  2. 对每个2位组单独执行位交换:通过位运算把组内的高低位互换(如01→10)
  3. 组合交换后的两个2位组,得到符合需求的swapped_first_half
  4. 新增free(e)修复内存泄漏问题

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 15:25:36