理解线性反馈移位寄存器的基本构造,编程实现一个简单的线性反馈移位寄存器并用输出序列对给定明文实施逐比特加密
时间: 2023-08-03 21:03:30 浏览: 94
线性反馈移位寄存器(LFSR):通常由移位寄存器和异或门逻辑组成
5星 · 资源好评率100%
线性反馈移位寄存器(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`。
阅读全文