用c语言实现二进制流密码系统,输入、输出、明文,密文都由0和1组成。具体内容:线性反馈寄存器为是一个3级反馈移位寄存器,其初始状态为 (a1,a2,a3) = (1, 0, 1) + 一个非线性组合子系统(Geffe序列生成器或J-K触发器)。要求给出输出密钥流周期大小。 需明确给出LFSR的线性反馈函数的递推形式,初始状态。流秘钥生成器的输出。加密解密的输入输出过程。并有具体代码
时间: 2023-06-20 08:09:45 浏览: 86
简单的线性反馈移位寄存器(LFSR)C语言实现
5星 · 资源好评率100%
以下是用C语言实现二进制流密码系统的示例代码,采用3级反馈移位寄存器(LFSR)和非线性组合子系统(Geffe序列生成器)实现:
```c
#include <stdio.h>
#include <stdlib.h>
#define LFSR_SIZE 3
int lfsr[LFSR_SIZE] = {1, 0, 1}; // 初始状态为 (a1,a2,a3) = (1, 0, 1)
int geffe[3] = {0, 0, 0}; // 非线性组合子系统初始状态为0
// LFSR 的线性反馈函数递推形式为 a1 = a3, a2 = a1, a3 = a2 XOR a3
void lfsr_shift() {
int a1 = lfsr[2];
int a2 = lfsr[0];
int a3 = lfsr[1] ^ lfsr[2];
lfsr[0] = a1;
lfsr[1] = a2;
lfsr[2] = a3;
}
// Geffe 序列生成器,非线性组合子系统为 a1 AND b1 XOR a2 AND b2 XOR a3 AND b3
void geffe_shift() {
int a1 = lfsr[0];
int a2 = lfsr[1];
int a3 = lfsr[2];
int b1 = geffe[2];
int b2 = b1 ^ geffe[1];
int b3 = b2 ^ geffe[0];
geffe[0] = a1 & b1 ^ a2 & b2 ^ a3 & b3;
geffe[1] = b1;
geffe[2] = b2;
}
// 生成指定长度的密钥流
void generate_key_stream(int *key_stream, int length) {
for (int i = 0; i < length; i++) {
geffe_shift();
key_stream[i] = geffe[0];
}
}
// 加密或解密
void crypt(int *input, int *output, int *key_stream, int length) {
for (int i = 0; i < length; i++) {
output[i] = input[i] ^ key_stream[i];
}
}
int main() {
int length = 16; // 输入输出明文、密文、密钥流的长度
int input[length], output[length], key_stream[length];
// 输入明文
printf("请输入明文(0或1):\n");
for (int i = 0; i < length; i++) {
scanf("%d", &input[i]);
}
// 生成密钥流并加密
generate_key_stream(key_stream, length);
crypt(input, output, key_stream, length);
// 输出密钥流和密文
printf("密钥流:");
for (int i = 0; i < length; i++) {
printf("%d", key_stream[i]);
}
printf("\n密文:");
for (int i = 0; i < length; i++) {
printf("%d", output[i]);
}
printf("\n");
// 解密
crypt(output, input, key_stream, length);
// 输出解密后的明文
printf("解密后的明文:");
for (int i = 0; i < length; i++) {
printf("%d", input[i]);
}
printf("\n");
return 0;
}
```
示例中采用了长度为16的输入输出明文、密文、密钥流,可以根据实际需求修改。运行程序后,输入明文(0或1),程序会自动生成密钥流并加密,输出密钥流和密文,然后解密并输出解密后的明文。
阅读全文