LFSR

c语言中实现LFSR;

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define DIGIT 34
void conversion(unsigned long long num,int* arr) {
	for (int i = 0; i < DIGIT; ++i) {
		arr[DIGIT - 1 - i] = num%2;
		num /= 2;
	}
}
void lfsr(int* arr1,int* arr2,int* target) {
	int x;
	for (int i = 0; i < DIGIT; ++i) {
		target[i] = arr1[3];
		x = ((arr1[0] * arr2[0] + arr1[1] 
			* arr2[1] + arr1[2] * arr2[2]
			+ arr1[3] * arr2[3]) % 2);
		int y = DIGIT-1;
		for (; y > 0;--y) {
			arr1[y] = arr1[y - 1];
		}
		arr1[0] = x;
	}
}
void J_K(int* J, int* K, int* key) {
	if ((J[0] == 0 && K[0] == 0) || (J[0] == 1 && K[0] == 1)) {
		key[0] = J[0];
	}
	else if (J[0] == 1 && K[0] == 0) {
		key[0] = 1;
	}
	else {
		key[0] = 0;
	}
	for (int i = 1; i < DIGIT; ++i) {
		if (J[i] == 0 && K[i] == 0) {
			key[i] = key[i - 1];
		}
		else if (J[i] == 0 && K[i] == 1) {
			key[i] = 0;
		}
		else if (J[i] == 1 && K[i] == 0) {
			key[i] = 1;
		}
		else {
			key[i] = key[i - 1] ^ 1;
		}
	}
}
void ead(int* arr1, int* arr2, int* arr3) {
	for (int i = 0; i < DIGIT; ++i) {
		arr3[i] = arr1[i] ^ arr2[i];
	}
}

void B_D(int* arr) {
	unsigned long long result = 0;
	for (int i = 0; i < DIGIT; ++i) {
		result += arr[i] * pow(2, DIGIT - 1 - i);
	}
	printf(" 学号:");
	printf("%llu\n", result);
}
int main() {
	unsigned long long snum = 16100101116;
	int arr[1024] = { 0 };
	conversion(snum, arr);
	printf(" 原码:");
	for (int i = 0; i < DIGIT; ++i) {
		printf("%d", arr[i]);
	}
	printf("\n");
	int J[DIGIT] = { 0 };
	int K[DIGIT] = { 0 };
	int key[DIGIT] = { 0 };
	int cry[DIGIT] = { 0 };
	int arr0[1024] = { 1,0,1,0 };
	int arr1[1024] = { 0,1,0,1 };
	int arr2[1024] = { 1,1,0,0 };
	lfsr(arr0, arr1, J);
	lfsr(arr0, arr2, K);
	J_K(J, K, key);
	printf("J序列:");
	for (int i = 0; i < DIGIT; ++i) {
		printf("%d", J[i]);
	}
	printf("\n");
	printf("K序列:");
	for (int i = 0; i < DIGIT; ++i) {
		printf("%d", K[i]);
	}
	printf("\n");
	printf(" 密钥:");
	for (int i = 0; i < DIGIT; ++i) {
		printf("%d", key[i]);
	}
	printf("\n");
	ead(arr, key, cry);
	printf(" 密文:");
	for (int i = 0; i < DIGIT; ++i) {
		printf("%d", cry[i]);
	}
	printf("\n");
	ead(key, cry, cry);
	printf(" 原码:");
	for (int i = 0; i < DIGIT; ++i) {
		printf("%d", cry[i]);
	}
	printf("\n");
	B_D(cry);
	system("pause");
	return 0;
}

猜你喜欢

转载自blog.csdn.net/Lange_Taylor/article/details/89260073