什么是LFSR及其重要性

线性反馈移位寄存器(Linear Feedback Shift Register, LFSR)是一种在数字电路和密码学中广泛应用的伪随机数生成器。它通过简单的移位和异或操作产生看似随机的比特序列,具有实现简单、速度快、消耗资源少等优点。

LFSR的核心在于其反馈函数,该函数决定了寄存器中哪些位参与反馈计算。这些参与反馈的位对应的系数(通常为0或1)构成了所谓的”反馈系数表”或”抽头选择”。选择不同的反馈系数会产生完全不同性质的序列,直接影响LFSR的周期长度、随机性质量和安全性。

LFSR的基本工作原理

基本结构

一个n位LFSR由n个D触发器串联组成,每个时钟周期,数据向右移动一位,最右边的位被丢弃,而最左边的位由反馈函数计算得出。反馈函数通常是某些位的异或(XOR)运算。

数学表示

LFSR可以用多项式来表示:

P(x) = x^n + c_{n-1}x^{n-1} + ... + c_1x + c_0

其中c_i ∈ {0,1}表示是否包含第i位作为反馈抽头。当c_i=1时,表示第i位参与反馈计算。

工作流程示例

考虑一个4位LFSR,反馈多项式为P(x) = x^4 + x + 1(即抽头为第4位和第1位):

初始状态: 1001
时钟周期1: 
  - 右移: 0100
  - 反馈: 第4位(1) XOR 第1位(1) = 0
  - 新状态: 0010
时钟周期2:
  - 右移: 0100
  - 反馈: 第4位(0) XOR 第1位(0) = 0
  - 新状态: 0001
时钟周期3:
  - 右移: 0010
  - 反馈: 第4位(0) XOR 第1位(1) = 1
  - 新状态: 1001

可以看到,经过3个周期后回到了初始状态1001,但实际最大周期应该是15(2^4-1),说明这个初始状态不是最大周期状态。

反馈系数表详解

什么是反馈系数表

反馈系数表是一个二进制向量,表示LFSR中哪些位参与反馈计算。对于n位LFSR,系数表通常表示为:

[ c_{n-1}, c_{n-2}, ..., c_1, c_0 ]

其中c_i=1表示第i位(从右向左数,最右边为第0位)参与反馈。

常见LFSR系数表

以下是不同位数LFSR的常用本原多项式(产生最大周期序列的多项式):

位数(n) 本原多项式(十六进制) 二进制系数表(从高到低) 抽头位置
3 0xB 1011 x^3+x+1
4 0x13 10011 x^4+x+1
5 0x25 100101 x^5+x^2+1
6 0x43 1000011 x^6+x+1
7 0x83 10000011 x^7+x+1
8 0x11D 100011101 x^8+x^4+x^3+x^2+1
9 0x211 100010001 x^9+x^4+1
10 0x402 1000000010 x^10+x^3+1
11 0x805 10000000101 x^11+x^2+1
12 0x1053 1000001010011 x^12+x^6+x^4+x+1
13 0x201B 1000000011011 x^13+x^4+x^3+x+1
14 0x402B 10000000101011 x^14+x^5+x^4+x+1
15 0x8003 1000000000000011 x^15+x+1
16 0x1002B 10000000000101011 x^16+x^12+x^3+x+1
17 0x20013 100000000000010011 x^17+x^3+1
18 0x4001D 100000000000011101 x^18+x^7+1
19 0x80027 100000000000100111 x^19+x^5+x^2+x+1
20 0x100009 100000000000001001 x^20+x^3+1

如何解读系数表

以8位LFSR的系数表100011101为例:

  • 最左边的’1’对应x^8(最高次项,总是存在)
  • 从左到右依次对应x^7, x^6, x^5, x^4, x^3, x^2, x^1, x^0
  • 所以系数表表示:x^8 + x^4 + x^3 + x^2 + 1
  • 抽头位置:第8位、第4位、第3位、第2位和第0位(最右边)

选择最优系数的标准

1. 本原多项式(Primitive Polynomial)

核心标准:要产生最大周期序列(2^n - 1),必须使用本原多项式。

数学定义:一个n次多项式P(x)是本原的,当且仅当:

  • P(x)在GF(2)上不可约
  • P(x)能整除x^(2^n-1) - 1
  • P(x)不能整除x^k - 1(对于任何k < 2^n-1)

重要性:非本原多项式产生的序列周期远小于2^n-1,可能只有2^n-1的一个真因子。

2. 最小抽头数原则

原则:在满足本原多项式的前提下,选择抽头数最少的系数表。

原因:

  • 硬件实现更简单(异或门输入更少)
  • 功耗更低
  • 速度更快

示例:

  • 8位LFSR:100011101(抽头数4)优于101110111(抽头数6)
  • 16位LFSR:10000000000101011(抽头数4)优于100000000000001111(抽头数5)

3. 平衡性(Balance)

标准:序列中1的个数应该等于0的个数(或非常接近)。

验证方法:对于本原多项式,全零状态是唯一无效状态,因此序列中1的个数为2^(n-1),0的个数为2^(n-1)-1,基本平衡。

4. 游程特性

标准:序列中应该有适当分布的连续0和连续1。

理想分布:

  • 长度为k的0游程有2^(k-2)个(k=1到n-1)
  • 长度为k的1游程有2^(k-2)个(k=1到n-1)
  • 长度为n的1游程有1个
  • 长度为n的0游程不存在(因为全零状态无效)

5. 自相关特性

标准:序列的自相关函数应该接近于δ函数。

数学表达:

R(τ) = Σ_{i=0}^{N-1} a_i ⊕ a_{i+τ}

对于理想LFSR序列,当τ≠0时,R(τ)应该接近N/2。

短周期陷阱及其避免方法

什么是短周期陷阱

短周期陷阱是指LFSR在某些初始状态下,序列周期远小于理论最大周期(2^n-1)的现象。这通常由以下原因造成:

  1. 使用非本原多项式:周期是2^n-1的真因子
  2. 初始状态选择不当:即使使用本原多项式,某些初始状态可能产生短周期
  3. 反馈系数配置错误:硬件实现时的接线错误

常见短周期陷阱示例

陷阱1:非本原多项式

# 错误示例:使用非本原多项式 x^4 + x^3 + 1
# 系数表: 10011 (二进制)
# 实际周期: 5(而不是15)

def lfsr_wrong(seed, taps):
    state = seed
    period = 0
    while True:
        # 计算反馈位
        feedback = 0
        for tap in taps:
            feedback ^= (state >> tap) & 1
        # 移位
        state = ((state >> 1) | (feedback << 3)) & 0xF
        period += 1
        if state == seed:
            break
    return period

# 测试
print(lfsr_wrong(0b1000, [3, 0]))  # 周期=5,不是15

陷阱2:全零状态

# 危险:如果初始状态为全0,LFSR将永远停留在全0状态
# 即使使用本原多项式,全0状态也是无效的

def lfsr_safe(seed, taps, n):
    if seed == 0:
        raise ValueError("初始状态不能为全0")
    state = seed
    period = 0
    seen = set()
    while state not in seen:
        seen.add(state)
        feedback = 0
        for tap in taps:
            feedback ^= (state >> tap) & 1
        state = ((state >> 1) | (feedback << (n-1))) & ((1 << n) - 1)
        period += 1
        if period > (1 << n):  # 防止无限循环
            raise RuntimeError("可能陷入短周期")
    return period, seen

陷阱3:硬件接线错误

# 模拟硬件接线错误:抽头位置错误
def lfsr_with_error(seed, correct_taps, error_taps, n):
    state = seed
    period = 0
    seen = set()
    while state not in seen:
        seen.add(state)
        # 正确反馈
        correct_feedback = 0
        for tap in correct_taps:
            correct_feedback ^= (state >> tap) & 1
        # 错误反馈(模拟硬件错误)
        error_feedback = 0
        for tap in error_taps:
            error_feedback ^= (state >> tap) & 1
        # 使用错误反馈
        state = ((state >> 1) | (error_feedback << (n-1))) & ((1 << n) - 1)
        period += 1
        if period > (1 << n):
            break
    return period

# 测试:8位LFSR,正确抽头[7,4,3,2,0],错误抽头[7,4,3,2,1]
# 正确周期应为255,错误周期可能远小于此
print("正确周期:", lfsr_with_error(0x80, [7,4,3,2,0], [7,4,3,2,1], 8))

避免短周期陷阱的方法

方法1:严格验证本原多项式

import numpy as np

def is_primitive_poly(poly, n):
    """
    验证多项式是否为本原多项式
    poly: 多项式系数列表,从高次到低次
    n: 多项式次数
    """
    # 检查最高位是否为1
    if poly[0] != 1:
        return False
    
    # 检查是否能整除 x^(2^n-1) - 1
    # 这里使用简化验证:检查周期是否为2^n-1
    max_period = (1 << n) - 1
    
    # 测试所有可能的非零初始状态
    for seed in range(1, 1 << n):
        state = seed
        period = 0
        while True:
            # 计算反馈
            feedback = 0
            for i in range(1, n+1):
                if poly[i] == 1:
                    feedback ^= (state >> (n-i)) & 1
            # 移位
            state = ((state >> 1) | (feedback << (n-1))) & ((1 << n) - 1)
            period += 1
            if state == seed:
                break
            if period > max_period:
                return False
        
        if period != max_period:
            return False
    
    return True

# 测试
poly_8bit = [1,0,0,0,1,1,1,0,1]  # x^8 + x^4 + x^3 + x^2 + 1
print(f"是否为本原多项式: {is_primitive_poly(poly_8bit, 8)}")

方法2:初始状态检测与处理

def lfsr_with_zero_detection(seed, taps, n):
    """
    带全零检测的LFSR实现
    """
    if seed == 0:
        # 自动选择非零初始状态
        seed = 1 << (n-1)  # 选择最高位为1
        print(f"警告: 初始状态为全0,已自动调整为{seed:0{n}b}")
    
    state = seed
    period = 0
    seen = set()
    
    while state not in seen:
        seen.add(state)
        # 计算反馈
        feedback = 0
        for tap in taps:
            feedback ^= (state >> tap) & 1
        # 移位
        state = ((state >> 1) | (feedback << (n-1))) & ((1 << n) - 1)
        period += 1
        
        # 检查是否陷入全零
        if state == 0:
            raise RuntimeError("LFSR陷入全零状态,可能是反馈配置错误")
        
        if period > (1 << n):
            raise RuntimeError("周期超过理论最大值,可能存在短周期")
    
    return period, seen

# 测试
try:
    period, states = lfsr_with_zero_detection(0, [7,4,3,2,0], 8)
    print(f"周期: {period}")
except RuntimeError as e:
    print(f"错误: {e}")

方法3:周期测试算法

def find_lfsr_period(seed, taps, n, max_search=1000000):
    """
    查找LFSR的实际周期
    """
    state = seed
    seen = {}
    period = 0
    
    while period < max_search:
        if state in seen:
            # 找到重复状态
            first_occurrence = seen[state]
            pre_period = first_occurrence
            cycle_length = period - first_occurrence
            return pre_period, cycle_length
        
        seen[state] = period
        
        # 计算反馈
        feedback = 0
        for tap in taps:
            feedback ^= (state >> tap) & 1
        # 移位
        state = ((state >> 1) | (feedback << (n-1))) & ((1 << n) - 1)
        period += 1
    
    return None, None  # 未找到周期

# 测试不同抽头组合
def test_tap_combinations(n, max_search=100000):
    """
    测试所有可能的抽头组合,找出本原多项式
    """
    primitive_polys = []
    max_period = (1 << n) - 1
    
    # 生成所有可能的抽头组合(排除全0和仅最高位)
    for mask in range(1, (1 << n)):
        # 构建抽头列表
        taps = []
        for i in range(n):
            if mask & (1 << i):
                taps.append(i)
        
        # 必须包含最高位(第n-1位)
        if (n-1) not in taps:
            continue
        
        # 测试周期
        pre_period, cycle_length = find_lfsr_period(1 << (n-1), taps, n, max_search)
        
        if cycle_length == max_period:
            primitive_polys.append(taps)
    
    return primitive_polys

# 测试4位LFSR的所有本原多项式
if __name__ == "__main__":
    n = 4
    primitives = test_tap_combinations(n)
    print(f"{n}位LFSR的本原多项式抽头组合:")
    for taps in primitives:
        # 转换为多项式表示
        poly_str = "x^" + str(n)
        for i in range(n-1, -1, -1):
            if i in taps and i != n-1:
                poly_str += " + x^" + str(i)
        print(f"抽头{taps}: {poly_str}")

实际应用案例分析

案例1:通信系统中的扰码器

场景:在光纤通信中,使用LFSR作为扰码器来白化数据,避免长连0或长连1。

需求:

  • 周期长(至少覆盖一个数据包)
  • 实现简单
  • 无短周期问题

解决方案:

class CommunicationScrambler:
    def __init__(self, polynomial, seed=0x1):
        """
        通信扰码器
        polynomial: 多项式表示,如0x11D (8位)
        """
        self.n = polynomial.bit_length() - 1
        self.taps = []
        # 解析多项式
        for i in range(self.n+1):
            if (polynomial >> i) & 1:
                if i != self.n:  # 最高位总是1
                    self.taps.append(i)
        
        # 确保初始状态非零
        self.state = seed if seed != 0 else 1
        
        # 验证周期
        self.max_period = (1 << self.n) - 1
        
    def scramble(self, data):
        """
        扰码操作
        data: 输入比特流(整数表示)
        """
        result = 0
        for i in range(self.n):
            # 生成LFSR序列
            feedback = 0
            for tap in self.taps:
                feedback ^= (self.state >> tap) & 1
            
            # 输出位(通常取最低位)
            output_bit = self.state & 1
            
            # 更新状态
            self.state = ((self.state >> 1) | (feedback << (self.n-1))) & ((1 << self.n) - 1)
            
            # 异或扰码
            data_bit = (data >> i) & 1
            result |= (data_bit ^ output_bit) << i
        
        return result
    
    def get_period(self):
        """获取实际周期"""
        return find_lfsr_period(1 << (self.n-1), self.taps, self.n)[1]

# 使用示例
scrambler = CommunicationScrambler(0x11D)  # 8位本原多项式
print(f"扰码器周期: {scrambler.get_period()}")  # 应为255

案例2:密码学中的流密码

场景:在轻量级密码系统中使用LFSR生成密钥流。

安全要求:

  • 周期必须足够长(至少128位)
  • 不能有短周期
  • 统计特性良好

解决方案:使用多个LFSR组合(非线性组合生成器)

import hashlib

class LFSRStreamCipher:
    def __init__(self, key, iv, lfsr_configs):
        """
        多LFSR组合流密码
        key: 主密钥
        iv: 初始化向量
        lfsr_configs: 多个LFSR配置列表
        """
        self.lfsrs = []
        self.key = key
        self.iv = iv
        
        # 初始化每个LFSR
        for config in lfsr_configs:
            n = config['n']
            taps = config['taps']
            # 从key和iv派生初始状态
            seed = self._derive_seed(key, iv, n)
            self.lfsrs.append({
                'state': seed,
                'taps': taps,
                'n': n
            })
    
    def _derive_seed(self, key, iv, n):
        """从key和iv派生LFSR初始状态"""
        # 使用哈希确保随机性
        h = hashlib.sha256(key + iv + str(n).encode()).digest()
        # 取前n位
        seed = int.from_bytes(h[: (n+7)//8], 'big') & ((1 << n) - 1)
        # 确保非零
        if seed == 0:
            seed = 1
        return seed
    
    def next_byte(self):
        """生成下一个密钥流字节"""
        result = 0
        for bit_pos in range(8):
            # 每个LFSR输出一位
            lfsr_outputs = []
            for lfsr in self.lfsrs:
                # 计算反馈
                feedback = 0
                for tap in lfsr['taps']:
                    feedback ^= (lfsr['state'] >> tap) & 1
                # 输出最低位
                output = lfsr['state'] & 1
                lfsr_outputs.append(output)
                # 更新状态
                lfsr['state'] = ((lfsr['state'] >> 1) | (feedback << (lfsr['n']-1))) & ((1 << lfsr['n']) - 1)
            
            # 非线性组合(示例:奇偶校验)
            combined = sum(lfsr_outputs) % 2
            result |= (combined << bit_pos)
        
        return result
    
    def encrypt(self, plaintext):
        """加密/解密"""
        ciphertext = bytearray()
        for byte in plaintext:
            keystream_byte = self.next_byte()
            ciphertext.append(byte ^ keystream_byte)
        return bytes(ciphertext)

# 使用示例
lfsr_configs = [
    {'n': 17, 'taps': [14, 0]},  # x^17 + x^14 + 1
    {'n': 19, 'taps': [18, 5, 2, 1, 0]},  # x^19 + x^18 + x^5 + x^2 + x + 1
    {'n': 23, 'taps': [18, 0]},  # x^23 + x^18 + 1
]

cipher = LFSRStreamCipher(b'key12345', b'iv67890', lfsr_configs)
plaintext = b"Hello, World!"
ciphertext = cipher.encrypt(plaintext)
print(f"密文: {ciphertext.hex()}")

案例3:测试与验证系统

场景:在芯片测试中使用LFSR生成测试向量。

需求:

  • 覆盖所有可能状态(2^n-1)
  • 无重复
  • 快速生成

解决方案:

class LFSRTestVectorGenerator:
    def __init__(self, n, taps, seed=1):
        self.n = n
        self.taps = taps
        self.state = seed
        self.max_period = (1 << n) - 1
        self.generated = 0
        
    def has_next(self):
        """是否还有下一个向量"""
        return self.generated < self.max_period
    
    def next(self):
        """生成下一个测试向量"""
        if not self.has_next():
            return None
        
        # 当前状态就是测试向量
        vector = self.state
        
        # 计算反馈
        feedback = 0
        for tap in self.taps:
            feedback ^= (self.state >> tap) & 1
        
        # 更新状态
        self.state = ((self.state >> 1) | (feedback << (self.n-1))) & ((1 << self.n) - 1)
        self.generated += 1
        
        return vector
    
    def generate_all(self):
        """生成所有测试向量"""
        vectors = []
        while self.has_next():
            vectors.append(self.next())
        return vectors

# 使用示例
n = 8
taps = [7,4,3,2,0]  # x^8 + x^4 + x^3 + x^2 + 1
generator = LFSRTestVectorGenerator(n, taps)

print(f"生成所有{2**n-1}个测试向量:")
vectors = generator.generate_all()
print(f"前10个向量: {[f'{v:08b}' for v in vectors[:10]]}")
print(f"最后一个向量: {vectors[-1]:08b}")

最佳实践总结

1. 系数选择清单

  • [ ] 验证本原性:使用已知的本原多项式表或数学验证
  • [ ] 最小抽头:在本原多项式中选择抽头数最少的
  • [ ] 避免全零:确保初始状态非零
  • [ ] 周期测试:在实际硬件上测试周期
  • [ ] 文档记录:记录所选多项式和初始状态

2. 硬件实现注意事项

# 硬件描述语言示例(Verilog风格注释)
"""
module lfsr #(
    parameter N = 8,
    parameter [N:0] TAPS = 8'b100011101  // x^8 + x^4 + x^3 + x^2 + 1
)(
    input clk,
    input rst,
    input enable,
    output reg [N-1:0] out
);

reg [N-1:0] state;
wire feedback;

// 反馈计算
assign feedback = ^ (state & TAPS[N-1:0]);

always @(posedge clk or posedge rst) begin
    if (rst) begin
        state <= 8'h80;  // 非零初始状态
    end else if (enable) begin
        state <= {feedback, state[N-1:1]};
    end
end

assign out = state;

endmodule
"""

3. 软件实现最佳实践

class LFSROptimized:
    """优化的LFSR实现"""
    
    # 预计算的本原多项式表
    PRIMITIVE_POLYS = {
        8: 0x11D,   # x^8 + x^4 + x^3 + x^2 + 1
        16: 0x1002B, # x^16 + x^12 + x^3 + x + 1
        32: 0x1000000AF, # x^32 + x^28 + x^27 + x^26 + x^25 + x^23 + x^22 + x^20 + x^18 + x^17 + x^16 + x^15 + x^11 + x^10 + x^9 + x^8 + x^3 + 1
    }
    
    def __init__(self, n, seed=None):
        if n not in self.PRIMITIVE_POLYS:
            raise ValueError(f"不支持的位数{n},请使用预定义的本原多项式")
        
        self.n = n
        self.poly = self.PRIMITIVE_POLYS[n]
        self.taps = self._parse_taps(self.poly, n)
        
        # 初始化状态
        if seed is None:
            seed = 1 << (n-1)  # 默认:最高位为1
        elif seed == 0:
            raise ValueError("初始状态不能为0")
        
        self.state = seed & ((1 << n) - 1)
        
        # 预计算掩码
        self.mask = (1 << n) - 1
    
    def _parse_taps(self, poly, n):
        """从多项式解析抽头位置"""
        taps = []
        for i in range(n):
            if (poly >> i) & 1:
                if i != n:  # 最高位总是1
                    taps.append(i)
        return taps
    
    def next(self):
        """生成下一个值(优化版本)"""
        # 使用位运算优化
        feedback = 0
        for tap in self.taps:
            feedback ^= (self.state >> tap) & 1
        
        # 移位并更新
        self.state = ((self.state >> 1) | (feedback << (self.n-1))) & self.mask
        return self.state
    
    def next_batch(self, count):
        """批量生成"""
        return [self.next() for _ in range(count)]

# 性能测试
import time

def performance_test():
    n = 32
    lfsr = LFSROptimized(n)
    
    start = time.time()
    for _ in range(1000000):
        lfsr.next()
    end = time.time()
    
    print(f"生成100万个{n}位随机数耗时: {end-start:.3f}秒")
    print(f"每秒操作数: {1000000/(end-start):.0f}")

if __name__ == "__main__":
    performance_test()

故障排除指南

问题1:周期远小于预期

可能原因:

  1. 使用了非本原多项式
  2. 初始状态为全0
  3. 抽头配置错误

排查步骤:

def diagnose_lfsr(n, taps, seed):
    """诊断LFSR问题"""
    print(f"诊断LFSR: n={n}, taps={taps}, seed={seed:0{n}b}")
    
    # 检查1:初始状态
    if seed == 0:
        print("❌ 错误:初始状态为全0")
        return
    
    # 检查2:抽头包含最高位
    if (n-1) not in taps:
        print("❌ 错误:抽头不包含最高位")
        return
    
    # 检查3:计算周期
    period, states = lfsr_with_zero_detection(seed, taps, n)
    max_period = (1 << n) - 1
    
    print(f"实际周期: {period}")
    print(f"理论最大周期: {max_period}")
    
    if period == max_period:
        print("✅ 周期正常")
    else:
        print(f"❌ 周期异常,是最大周期的{max_period//period}分之一")
        # 检查是否为本原多项式
        if period == max_period // 3:
            print("  可能原因:使用了3阶多项式")
        elif period == max_period // 5:
            print("  可能原因:使用了5阶多项式")

# 测试
diagnose_lfsr(4, [3,0], 0b1000)  # 正常
diagnose_lfsr(4, [3,2,0], 0b1000)  # 可能异常

问题2:序列统计特性差

可能原因:

  1. 抽头选择不当
  2. 测试序列长度不足

验证方法:

def analyze_sequence_quality(states):
    """分析序列质量"""
    seq = [(s & 1) for s in states]  # 取最低位
    
    # 1. 平衡性
    ones = sum(seq)
    zeros = len(seq) - ones
    balance_ratio = abs(ones - zeros) / len(seq)
    
    # 2. 游程分布
    runs = []
    current_run = 1
    for i in range(1, len(seq)):
        if seq[i] == seq[i-1]:
            current_run += 1
        else:
            runs.append(current_run)
            current_run = 1
    
    # 3. 自相关
    autocorr = []
    for lag in range(1, 10):
        diff = sum(seq[i] ^ seq[i+lag] for i in range(len(seq)-lag))
        autocorr.append(diff / (len(seq)-lag))
    
    print(f"平衡性: {balance_ratio:.4f} (应<0.1)")
    print(f"平均游程长度: {np.mean(runs):.2f}")
    print(f"自相关(滞后1-9): {[f'{x:.3f}' for x in autocorr]}")
    
    return balance_ratio < 0.1

# 测试
_, states = lfsr_with_zero_detection(0x80, [7,4,3,2,0], 8)
analyze_sequence_quality(list(states))

总结

选择最优LFSR反馈系数是确保系统性能和安全性的关键。核心要点:

  1. 必须使用本原多项式:这是获得最大周期的唯一途径
  2. 优先选择最少抽头:简化硬件实现,降低功耗
  3. 严格避免全零状态:这是最常见的短周期陷阱
  4. 充分测试验证:在实际硬件上验证周期和统计特性
  5. 文档化配置:记录所有参数以便后续维护

通过遵循这些原则和提供的代码示例,您可以避免短周期陷阱,构建可靠、高效的LFSR系统。记住,一个配置不当的LFSR可能比没有LFSR更糟糕,因为它会产生看似随机但实际可预测的序列。