⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lfsrdsr.cpp

📁 密码学中用于加密用的LFSR和DSR移位代码
💻 CPP
字号:

#include<stdio.h>
unsigned char jgcs[1]={0x30}; //结构常数序列为0x30,即[Cn,Cn-1,...,C1]为[00110000]
unsigned char zt[9];//状态
#define N 30
//LFSR进动一拍,反馈函数为x3+x4
unsigned char *LFSR_go(unsigned char *pzt,unsigned char *pjg,int n)
//pzt[]为状态数组,pjg[]为结构常数数组,n为状态字节数 
{
	unsigned char t=0;
	int c=0,i;
	for (i=0;i<n;i++)
		t^=(pzt[i]&pjg[i]);
	t^=((t<<1)^(t<<2)^(t<<3)^(t<<4)^(t<<5)^(t<<6)^(t<<7));
	//实现反馈函数的计算,产生反馈值,放在t的最高位
	if (t&0x80)
		c=1;
	for (i=n-1;i>=0;i--)
	{
		t=pzt[i];
		pzt[i]=((t<<1)|c)&0xff;
		c=(t&0x80)?1:0;
	}
	return (pzt);
}
//DSR进动一拍
unsigned char *DSR_go(unsigned char *pzt,unsigned char *pjg,int n)//n为状态字节数 
{
	unsigned char t;
	int c=0,i;
	for (i=n-1;i>=0;i--)
	{
		t=pzt[i];
		pzt[i]=((t<<1)|c)&0xff;
		c=(t&0x80)?1:0;
	}
	if (c)
		for (i=0;i<n;i++)
			pzt[i]^=pjg[i];
		return (pzt);
}

void main()
{
	int i;
	int m;
	
	printf("请输入寄存器所占的字节数\n");
	scanf("%d",&m);
	printf("请输入初态(输入的数小于16进制的FF)\n");
	for(i=0;i<m;i++)
	{
		scanf("%x",&zt[i]);
	}
	printf("LFSR进动后结果 \n");
	for (i=0;i<N;i++) 
	{
		zt[0]&0x80?printf("1 "):printf("0 ");	

		LFSR_go(zt,jgcs,m);
	}
	
	

	printf("\n\n请输入寄存器所占的字节数\n");
	scanf("%d",&m);
	printf("请输入初态(输入的数小于16进制的FF)\n");
	for(i=0;i<m;i++)
	{
		scanf("%x",&zt[i]);
	}
	printf("\nDSR进动后结果 \n");
	for(i=0;i<N;i++)
	{
		zt[0]&0x80?printf("1 "):printf("0 ");
		DSR_go(zt,jgcs,m);
	}
	printf("\n");

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -