关于非线性组合模型Geffe的分割攻击实现

Posted 甘薯Yam

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于非线性组合模型Geffe的分割攻击实现相关的知识,希望对你有一定的参考价值。

密码学学完序列密码后要做关于Geffe的攻击。。。
看来看去就分割攻击比较好写但是这个LFSR2的级数太高了好像写的有点问题
不管了,快期未考试了

非线性组合模型 G e f f e Geffe Geffe分割攻击

一、非线性组合模型 G e f f e Geffe Geffe​​​发生器的基本介绍

G e f f e Geffe Geffe发生器是1973年 G e f f e Geffe Geffe​设计的一个密钥流生成器,具体描述如下:

如图所示, G e f f e Geffe Geffe发生器使用了3个 L F S R LFSR LFSR​​移位寄存器他们以非线性方式组合,其中, L F S R 1 LFSR1 LFSR1 L F S R 3 LFSR3 LFSR3作为复合器的输入, L F S R 2 LFSR2 LFSR2​作为控制复合器。

其中,三个 L F S R LFSR LFSR​的反馈多项式分别为:

f 1 ( x ) = x 20 ⊕ x 3 ⊕ 1 f_1(x)=x^20\\oplus x^3\\oplus 1 f1(x)=x20x31

f 2 ( x ) = x 39 ⊕ x 4 ⊕ 1 f_2(x)=x^39\\oplus x^4\\oplus 1 f2(x)=x39x41

f 3 ( x ) = x 17 ⊕ x 3 ⊕ 1 f_3(x)=x^17\\oplus x^3\\oplus 1 f3(x)=x17x31

非线性组合函数 F F F为:
g ( x 1 , x 2 , x 3 ) = x 1 x 2 ⊕ ( x 2 ⊕ 1 ) x 3 = x 1 , x 2 = 1 x 3 , x 2 = 0 g(x_1,x_2,x_3)=x_1x_2\\oplus(x_2\\oplus1)x_3= \\begincases x_1,\\quad x_2=1\\\\ x_3,\\quad x_2=0 \\endcases g(x1,x2,x3)=x1x2(x21)x3=x1,x2=1x3,x2=0

二、非线性组合模型 G e f f e Geffe Geffe的初始化过程

(1)密钥 K = ( k 63 , … , k 0 ) K=(k_63,…,k_0) K=(k63,,k0)按照如下方式填充:

先将密钥重复链接,得到76比特密钥 K ’ K’ K

K ’ = ( k 11 , … , k 1 , k 0 , k 63 , … , k 0 ) K’=(k_11,…, k_1,k_0,k_63,…,k_0) K=(k11,,k1,k0,k63,,k0)​​

K ’ K’ K由低位到高位按照从右到左的顺序依次填入 L F S R 1 LFSR1 LFSR1 L F S R 2 LFSR2 LFSR2 L F S R 3 LFSR3 LFSR3

2)按照密钥流生成方式空转100个时刻

将此时 L F S R LFSR LFSR​的内部状态做为密钥流生成的初态。

三、非线性组合模型 G e f f e Geffe Geffe​分割攻击流程

1.穷举 L F S R 2 LFSR2 LFSR2的初态
2.获得关于 L F S R 1 LFSR1 LFSR1 L F S R 3 LFSR3 LFSR3初态的线性方程;
3.解方程得到初态
4.根据前100个时刻的乱数,验证初态是否正确

四、分割攻击具体实现代码及注释

1.定义密钥流 K K K​的值并将 K K K​填充到三个 L F S R LFSR LFSR​​的初态中
	string K="1010010010000101010100101010110101101100100111001011010001110011";//K为初始密钥
	string s1,s2,s3;//s1,s2,s3中分别为LFSR1 2 3的初始填充
	s1="11001011010001110011";
	s2="100100001010101001010101101011011001001";
	s3="01000111001110100";
2.将 L F S R LFSR LFSR​空转100个时刻并记录下产生的密钥流
void LFSR_f1(int l_xunhuan,string chutai)//LFSR1的实现代码,其中l_xunhuan为循环轮数,chutai为LFSR的初态
	bitset<20>f1(chutai);//初态赋值 
	//cout<<f1.to_string();
	for(int i=1;i<=l_xunhuan;i++)//移位寄存
		int j=f1[0]^f1[17] ;
		len_f1++;
		//string s_out = f1.to_string();
		f1_out += '0'+j;
		f1.operator>>=(1);
		f1[19]=j;
	


void LFSR_f2(int l_xunhuan,string chutai)//LFSR2的实现代码,其中l_xunhuan为循环轮数,chutai为LFSR的初态
	bitset<39>f2(chutai);//初态赋值 
	//cout<<f2.to_string();
	for(int i=1;i<=l_xunhuan;i++)//移位寄存
		int j=f2[0]^f2[35] ;
		len_f2++;
		//string s_out = f2.to_string();
		f2_out += '0'+j;
		f2.operator>>=(1);
		f2[38]=j;
	


void LFSR_f3(int l_xunhuan,string chutai)//LFSR2的实现代码,其中l_xunhuan为循环轮数,chutai为LFSR的初态
	bitset<17>f3(chutai);//初态赋值 
	//cout<<f3.to_string();
	for(int i=1;i<=l_xunhuan;i++)//移位寄存
		int j=f3[0]^f3[14] ;
		len_f3++;
		//cout<<i<<endl;
		//cout<<"f3_out--->"<<f3_out<<endl;
		//string s_out = f3.to_string();
		f3_out += j+'0' ;
		f3.operator>>=(1);
		f3[16]=j;
	


//此为主函数的调用语句
	LFSR_f1(100,s1);
	LFSR_f2(100,s2);
	LFSR_f3(100,s3);
3.根据 L F S R 2 LFSR2 LFSR2​的值来决定最后输出密钥流的每一位取 L F S R 1 LFSR1 LFSR1还是取 L F S R 3 LFSR3 LFSR3​​的值
	string f0_out;//为最终输出密钥流
	for(int i=0;i<100;i++)
		if(f2_out[i]=='1') f0_out+=f1_out[i];
		else f0_out+=f3_out[i];
	
4.枚举 L F S R 2 LFSR2 LFSR2的初态
	int cnt =0;
	int x_len = 1<<39; 
	for(int i=0;i<x_len;i++)
        //中间流程由后面具体解释
    
5.根据 L F S R 2 LFSR2 LFSR2​的初态,推算出 L F S R 1 LFSR1 LFSR1​和 L F S R 3 LFSR3 LFSR3​的初态
	int cnt =0;
	int x_len = 1<<39; 
	for(int i=0;i<x_len;i关于数学建模——入门

「深度学习一遍过」必修18:基于pytorch的语义分割模型实现

机器学习:线性回归——理论与代码实现(基于正规方程与梯度下降)

机器学习技法-神经网路(NNet)

机器学习经典算法源码分析系列-- 线性回归

机器学习之回归模型-一元线性回归理论与最小二乘法实现