#include <iostream>
using namespace std;
bool x1[19]={0}; //用于LFSR_1的向量
bool x2[22]={0}; //用于LFSR_2的向量
bool x3[23]={0}; //用于LFSR_3的向量
bool key[64]={0}; //64比特会话密钥
bool zhen[22]={0}; //22比特帧序号
bool y1=x1[0],y2=x2[0],y3=x3[0]; //各线性移存器的反馈量
bool *X1=&x1[0];
bool *Y1=&y1;
bool *X2=&x2[0];
bool *Y2=&y2;
bool *X3=&x3[0];
bool *Y3=&y3;
bool *k=&key[0];
bool *z=&zhen[0];
bool LFSR_1(bool *X1,bool *Y1) //LFSR_1左移
{
y1=x1[18]^x1[17]^x1[16]^x1[13];
for(int i=18;i>0;i--)
x1[i]=x1[i-1];
x1[0]=y1;
}
bool LFSR_2(bool *X2,bool *Y2) //LFSR_2左移
{
y2=x2[21]^x2[20];
for(int i=21;i>0;i--)
x2[i]=x2[i-1];
x2[0]=y2;
}
bool LFSR_3(bool *X3,bool *Y3) //LFSR_3左移
{
y3=x3[22]^x3[21]^x3[20]^x3[7];
for(int i=23;i>0;i--)
x3[i]=x3[i-1];
x3[0]=y3;
}
bool LFSR_1k(bool *X1,bool *Y1,bool *k) //LFSR_1在密钥或帧序号参与下的规则动作
{
y1=x1[18]^x1[17]^x1[16]^x1[13]^*k;
for(int i=18;i>0;i--)
x1[i]=x1[i-1];
x1[0]=y1;
}
bool LFSR_2k(bool *X2,bool *Y2,bool *k) //LFSR_2在密钥或帧序号参与下的规则动作
{
y2=x2[21]^x2[20]^*k;
for(int i=21;i>0;i--)
x2[i]=x2[i-1];
x2[0]=y2;
}
bool LFSR_3k(bool *X3,bool *Y3,bool *k) //LFSR_3在密钥或帧序号参与下的规则动作
{
y3=x3[22]^x3[21]^x3[20]^x3[7]^*k;
for(int i=22;i>0;i--)
x3[i]=x3[i-1];
x3[0]=y3;
}
void zk(bool *X1,bool *X2,bool *X3,bool *Y1,bool *Y2,bool *Y3) //钟控动作规律
{
int a=x1[8]*100+x2[10]*10+x3[10];
switch(a)
{
case 0:
LFSR_1(X1,Y1);
LFSR_2(X2,Y2);
LFSR_3(X3,Y3);
break;
case 1:
LFSR_1(X1,Y1);
LFSR_2(X2,Y2);
break;
case 10:
LFSR_1(X1,Y1);
LFSR_3(X3,Y3);
break;
case 11:
LFSR_2(X2,Y2);
LFSR_3(X3,Y3);
break;
case 100:
LFSR_2(X2,Y2);
LFSR_3(X3,Y3);
break;
case 101:
LFSR_1(X1,Y1);
LFSR_3(X3,Y3);
break;
case 110:
LFSR_1(X1,Y1);
LFSR_2(X2,Y2);
break;
case 111:
LFSR_1(X1,Y1);
LFSR_2(X2,Y2);
LFSR_3(X3,Y3);
break;
}
}
int main()
{
int i=0;
bool y;
z[0]=1; //定义帧序号为1
for(i=0;i<64;i++) //密钥参与的规则动作64次
{
LFSR_1k(X1,Y1,k);
LFSR_2k(X2,Y2,k);
LFSR_3k(X3,Y3,k);
k++;
}
//k=&key[0];
for(i=0;i<22;i++) //帧序号参与的规则动作22次
{
LFSR_1k(X1,Y1,z);
LFSR_2k(X2,Y2,z);
LFSR_3k(X3,Y3,z);
z++;
}
//z=&zhen[0];
for(i=0;i<100;i++) //钟控方式连续动作100次,但不输出乱数
{
zk(X1,X2,X3,Y1,Y2,Y3);
}
for(i=0;i<114;i++) //钟控方式来纳许动作114次,三个移存器最高级寄存器的值模2加后输出,作为乱数
{
zk(X1,X2,X3,Y1,Y2,Y3);
y=x1[18]^x2[21]^x3[22];
cout<<y; //输出乱数,用于对用户手机到基站传送的114比特数据的加密
}
system("pause");
for(i=0;i<100;i++)
{
zk(X1,X2,X3,Y1,Y2,Y3);
}
for(i=0;i<114;i++)
{
zk(X1,X2,X3,Y1,Y2,Y3);
y=x1[18]^x2[21]^x3[22];
cout<<y; //输出乱数,用于对基站到用户手机传送的114比特数据的加密
}
return 0;
}
标签:LFSR,C语言,X2,算法,bool,x3,x2,A5,x1
From: https://blog.csdn.net/Yog_Azathoth/article/details/144704951