c线性反馈移位寄存器实现产生伪随机数M序列
时间: 2023-12-30 11:03:18 浏览: 93
C线性反馈移位寄存器(C-LFSR)可以用来产生伪随机数序列。这种序列通常称为M序列。
M序列是一个有限长的位序列,可以看作是一个二进制数列。M序列的长度为2^n-1位,其中n为C-LFSR的阶数,也就是寄存器中寄存器单元的个数。M序列的产生是通过C-LFSR的移位寄存器中的各个寄存器单元进行异或运算得到的。
具体实现步骤如下:
1.初始化C-LFSR的各个寄存器单元,可以将它们赋予任意的初始值。
2.通过C-LFSR的移位寄存器中的各个寄存器单元进行异或运算得到一个新的位值。
3.将得到的新位值插入到移位寄存器的最低位,同时将移位寄存器中的各个寄存器单元向右移动一位。
4.重复步骤2-3,直到产生了2^n-1位的M序列。
需要注意的是,C-LFSR的初始状态对于M序列的产生有很大的影响,不同的初始状态会产生不同的M序列。因此,在使用C-LFSR产生M序列时,需要选择一个合适的初始状态,以获得需要的随机性。
相关问题
用c语言实现线性反馈移位寄存器的实现
线性反馈移位寄存器(Linear Feedback Shift Register,LFSR)是一种数字电路,常用于生成伪随机数序列。在C语言中实现LFSR,我们可以使用数组来存储寄存器状态,并通过模运算和异或操作来更新它。下面是一个简单的单级LFSR的实现示例:
```c
#include <stdio.h>
// 定义寄存器长度和反馈函数系数
#define REG_LEN 8 // 寄存器长度
#define POLYNOMIAL (0x7) // 反馈系数,例如1101 = 1*2^3 + 1*2^2 + 0*2^1 + 1*2^0
// LFSR状态数组
unsigned int lfsr_state[REG_LEN];
// 初始化LFSR状态
void init_lfsr() {
for (int i = 0; i < REG_LEN; ++i)
lfsr_state[i] = 1; // 使用全1初始状态
}
// 进行LFSR循环移位并计算新的状态
unsigned int next_lfsr_state() {
unsigned int new_state = lfsr_state[REG_LEN - 1]; // 保存最高位
for (int i = 0; i < REG_LEN - 1; ++i) {
new_state ^= lfsr_state[i];
lfsr_state[i] = lfsr_state[i+1];
}
return new_state;
}
int main() {
init_lfsr();
// 输出前几项序列
for (int i = 0; i < 16; ++i) {
printf("%d ", lfsr_state[0]);
lfsr_state[0] = next_lfsr_state();
}
return 0;
}
```
理解线性反馈移位寄存器的基本构造,编程实现一个简单的线性反馈移位寄存器并用输出序列对给定明文实施逐比特加密
线性反馈移位寄存器(Linear Feedback Shift Register,LFSR)是一种简单的序列发生器,常用于加密算法中。它的基本构造是由若干个触发器和一些异或门构成的,其中一个触发器的输出作为反馈信号,控制序列的产生。
下面是一个简单的 4 位线性反馈移位寄存器的实现:
```python
class LFSR:
def __init__(self, taps, seed):
self.taps = taps
self.state = seed
def shift(self):
feedback = sum([self.state[i] for i in self.taps]) % 2
new_bit = self.state.pop(0)
self.state.append(feedback)
self.state.append(new_bit)
return new_bit
def generate(self, n):
output = []
for i in range(n):
output.append(self.shift())
return output
```
其中,`taps` 是一个数组,表示反馈信号从哪些触发器的输出异或而来;`seed` 是一个长度为 4 的数组,表示初始状态。`shift` 方法实现了一次移位操作,并返回新的输出;`generate` 方法生成给定长度的输出序列。
现在,我们可以用这个 LFSR 实现一个简单的逐比特加密算法。假设明文是一个长度为 8 的二进制字符串,我们可以先将其转换成一个数组,然后将每个比特与 LFSR 的输出异或,得到密文。具体实现如下:
```python
def encrypt(plaintext, lfsr):
plaintext = [int(c) for c in plaintext]
ciphertext = []
for bit in plaintext:
key = lfsr.shift()
ciphertext.append(bit ^ key)
return ''.join([str(c) for c in ciphertext])
```
其中,`lfsr` 是一个 LFSR 对象。对于明文的每个比特,我们都执行一次 LFSR 的移位操作,并将其输出与明文比特异或,得到密文比特。最后将密文比特组成一个二进制字符串,返回即可。
下面是一个完整的示例程序,演示了如何使用 LFSR 对明文进行逐比特加密:
```python
class LFSR:
def __init__(self, taps, seed):
self.taps = taps
self.state = seed
def shift(self):
feedback = sum([self.state[i] for i in self.taps]) % 2
new_bit = self.state.pop(0)
self.state.append(feedback)
self.state.append(new_bit)
return new_bit
def generate(self, n):
output = []
for i in range(n):
output.append(self.shift())
return output
def encrypt(plaintext, lfsr):
plaintext = [int(c) for c in plaintext]
ciphertext = []
for bit in plaintext:
key = lfsr.shift()
ciphertext.append(bit ^ key)
return ''.join([str(c) for c in ciphertext])
if __name__ == '__main__':
taps = [0, 1]
seed = [1, 0, 1, 1]
lfsr = LFSR(taps, seed)
plaintext = '11010011'
ciphertext = encrypt(plaintext, lfsr)
print('Plaintext: ', plaintext)
print('Ciphertext:', ciphertext)
```
输出:
```
Plaintext: 11010011
Ciphertext:01111101
```
可以看到,明文 `11010011` 被加密成了密文 `01111101`。
阅读全文