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

C++ LFSR流异或加密仅首字符计算正确故障排查

问题定位
  • 核心错误1:LFSR反馈位计算逻辑错误
    当前计算bit2的代码没有对结果取最低位,导致bit2是32位的随机整数值,而非预期的单个0/1反馈比特。不仅会导致存入key2的密钥字节完全不符合需求,同时错误的反馈位左移后会破坏state的LFSR迭代逻辑,后续生成的所有状态都是错误的。
  • 核心错误2:密钥字节生成逻辑不符合需求
    需求明确要求foo函数取生成序列的最左侧元素作为密钥字节,但当前代码直接把反馈位(截断为8位)作为密钥字节存储,完全没有按规则取LFSR输出序列的8位组合成密钥字节。
  • 潜在错误:迭代终止逻辑不合理
    当前循环仅迭代15次就停止,最多只能生成15个有效密钥字节,若加密消息长度超过15,后续密钥会使用vector初始化的默认0值,导致加密错误。
修复方案

第一步:修正反馈位计算逻辑

在bit2计算的末尾添加& 1,确保每次只得到单个0/1的反馈比特:

bit2 = ((state >> 31) ^ (state >> 30) ^ (state >> 29) ^ (state >> 25) ^ state) & 1;

第二步:修正密钥字节生成逻辑

按照需求,每收集8个LFSR输出的比特,拼接为一个8位的密钥字节存入key2,修改后的foo函数参考实现:

std::vector<char> foo(std::vector<char>& key2) {
    uint32_t state = 0b1111111111111111111111111111111;
    uint32_t start_state2{ state };
    uint32_t key_idx = 0;
    const int KEY_LEN = key2.size();
    
    while (key_idx < KEY_LEN && state != start_state2) {
        // 生成8个比特拼成1个密钥字节
        char key_byte = 0;
        for (int bit_idx = 7; bit_idx >=0; bit_idx--) {
            uint32_t bit = ((state >> 31) ^ (state >> 30) ^ (state >> 29) ^ (state >> 25) ^ state) & 1;
            key_byte |= (bit << bit_idx);
            // LFSR移位更新状态
            state = (state >> 1) | (bit << 31);
        }
        key2[key_idx] = key_byte;
        std::cout << std::bitset<8>(key2[key_idx]) << " ";
        std::cout << std::bitset<32>(state) << std::endl;
        key_idx++;
    }

    std::cout << "Generated key count: " << key_idx << std::endl;
    return key2;
}

第三步:可选优化

若编译器默认char为有符号类型,可将key2的类型改为std::vector<unsigned char>,避免符号扩展导致的bitset取值异常。

修复后生成的密钥流就是符合LFSR规则的预期值,异或加密后的所有字符结果都会符合预期。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 06:36:04