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

