C语言线性反馈寄存器
时间: 2024-06-19 22:04:43 浏览: 9
C语言线性反馈寄存器(Linear Feedback Shift Register, LFSR)是一种基于位移寄存器的伪随机数发生器。它的原理是将寄存器中的位根据特定的算法进行循环移位并反馈,从而产生一系列的伪随机数。
在C语言中,我们可以使用位运算来实现LFSR。具体实现方式是:首先定义一个无符号整型数作为LFSR的寄存器,然后通过位运算实现循环移位和反馈。比如,下面的代码实现了一个15位的LFSR:
```c
unsigned int lfsr = 0xACE1u; // 初始值
unsigned int bit;
unsigned int lfsr15(void)
{
bit = ((lfsr >> 0) ^ (lfsr >> 2) ^ (lfsr >> 3) ^ (lfsr >> 14)) & 1;
return lfsr = (lfsr >> 1) | (bit << 14);
}
```
这个LFSR的反馈函数为:$x^{15} + x^3 + x^2 + 1$,即将寄存器的第0、2、3、14位进行异或运算,并将结果作为最低位反馈到寄存器的最高位。通过调用`lfsr15()`函数,我们可以得到一系列的伪随机数。
相关问题
C语言实现一个非线性反馈移位寄存器其中f(a1,a2,a3,a4)=a1异或a4异或1异或a2a3
非线性反馈移位寄存器(NLFSR)是一种在密码学中常用的伪随机序列生成器。它是由一个移位寄存器和一个非线性函数组成的,其中移位寄存器中存储的位序列会不断地变化,非线性函数根据这些变化产生随机序列。
C语言实现一个非线性反馈移位寄存器,可以按照以下步骤进行:
1. 定义一个unsigned int类型的变量作为移位寄存器,初始值可以设为一个随机数。
2. 定义一个函数,用来计算非线性函数f(a1,a2,a3,a4),其中a1、a2、a3、a4是当前移位寄存器中的4个位。函数代码如下:
unsigned int f(unsigned int a1, unsigned int a2, unsigned int a3, unsigned int a4) {
return a1 ^ a4 ^ 1 ^ (a2 & a3);
}
3. 定义一个循环,每次循环执行以下操作:
- 计算移位寄存器中的4个位,可以使用按位运算符和位移运算符。
- 调用函数f计算当前的非线性函数值。
- 将非线性函数值的最低位插入到移位寄存器的最高位,其他位依次向右移动一位。
代码如下:
unsigned int nlfsr(unsigned int seed) {
unsigned int reg = seed;
while (1) {
unsigned int a1 = (reg >> 31) & 1;
unsigned int a2 = (reg >> 2) & 1;
unsigned int a3 = (reg >> 1) & 1;
unsigned int a4 = reg & 1;
unsigned int val = f(a1, a2, a3, a4);
reg = (reg << 1) | val;
if (reg == seed) break;
}
return reg;
}
用c语言实现二进制流密码系统,输入、输出、明文,密文都由0和1组成。具体内容:线性反馈寄存器为是一个3级反馈移位寄存器,其初始状态为 (a1,a2,a3) = (1, 0, 1) + 一个非线性组合子系统(Geffe序列生成器或J-K触发器)。要求给出输出密钥流周期大小。 需明确给出LFSR的线性反馈函数的递推形式,初始状态。流秘钥生成器的输出。加密解密的输入输出过程。并有具体代码
以下是用C语言实现二进制流密码系统的代码:
```c
#include <stdio.h>
#include <stdlib.h>
// 线性反馈寄存器的状态
int a1 = 1, a2 = 0, a3 = 1;
// 线性反馈寄存器的递推函数
void lfsr() {
int feedback = (a1 ^ a2) ^ a3;
a1 = a2;
a2 = a3;
a3 = feedback;
}
// 非线性组合子系统的递推函数
int geffe() {
int x1 = 1, x2 = 0, x3 = 1;
int y1 = 0, y2 = 1, y3 = 1;
int z1 = 1, z2 = 1, z3 = 0;
int output = (x3 & y3) ^ ((x2 & y2) ^ (x1 & y1));
x1 = (x1 + z1) % 2;
x2 = (x2 + z2) % 2;
x3 = (x3 + z3) % 2;
y1 = (y1 + z1) % 2;
y2 = (y2 + z2) % 2;
y3 = (y3 + z3) % 2;
z1 = (z1 + 1) % 2;
return output;
}
// 生成密钥流
void generate_key_stream(int *key_stream, int length) {
int i;
for (i = 0; i < length; i++) {
lfsr();
key_stream[i] = geffe();
}
}
// 加密或解密
void crypt(int *plaintext, int *ciphertext, int *key_stream, int length) {
int i;
for (i = 0; i < length; i++) {
ciphertext[i] = plaintext[i] ^ key_stream[i];
}
}
int main() {
int plaintext[8] = {1, 0, 1, 0, 1, 1, 0, 0};
int key_stream[8];
int ciphertext[8];
generate_key_stream(key_stream, 8);
crypt(plaintext, ciphertext, key_stream, 8);
printf("Plaintext: ");
for (int i = 0; i < 8; i++) {
printf("%d", plaintext[i]);
}
printf("\n");
printf("Key stream: ");
for (int i = 0; i < 8; i++) {
printf("%d", key_stream[i]);
}
printf("\n");
printf("Ciphertext: ");
for (int i = 0; i < 8; i++) {
printf("%d", ciphertext[i]);
}
printf("\n");
return 0;
}
```
在上面的代码中,我们使用了一个3级反馈移位寄存器作为线性反馈寄存器,并且使用了一个非线性组合子系统(Geffe序列生成器)来生成密钥流。我们首先调用 `generate_key_stream` 函数生成密钥流,然后调用 `crypt` 函数进行加密或解密。在本例中,我们使用了一个长度为8的明文和密钥流。输出结果包括明文、密钥流和密文。
这个二进制流密码系统的输出密钥流周期大小是 `2^3-1 = 7`,即密钥流会在7个时钟周期后重复。