/*
	
	d:输入状态差分的最大汉明重量
*/
void offLine_table_construct_v3(u32 d){
	//创建输出流
	//建立输出文件
	string part="Grain_(l,d)_(";
	string curr_DIR=DIR_REDUCE_V3+part+int_2_string(KSLen_Reduced)+","+int_2_string(d)+")"+
		FILE_SUFFIX+WITH_PREFIX+"_KSD_"+int_2_string(MAX_KSD)+"_HM_"+int_2_string(MAX_KSD_HM)
		+"_N_"+int_2_string(STATE_NUM)+"\\";
	//建立目录,如果不存在则自动建立目录
	char *tag;
	for(tag=(char*)curr_DIR.c_str();*tag;tag++){
		if(*tag=='\\'){
			char buf[1024],path[1024];
			strcpy(buf,curr_DIR.c_str());
			buf[strlen(curr_DIR.c_str())-strlen(tag)+1]=NULL;
			strcpy(path,buf);
			if(access(path,6)==-1)
				mkdir(path);
		}
	}
	for(int i=1;i<=d;i++){
		//枚举所有输入差分的汉明重量为i的差分   
		u32 state_Len=STATE_REDUCE-SP;		//总的状态数 减去sampling resistance的大小
		cout<<"Grain reduce--开始处理输入差分汉明重量为:"<<i<<"的情况."<<endl;
		double time[4]={0};
		start_cal();
		combination_for_search_grain_reduce_v3(state_Len,i,curr_DIR);
		end_cal(time);
		cout<<"Grain reduce--输入差分汉明重量为:"<<i<<"的情况已经处理完毕."<<endl;
		printf("Time: %d hours, %d minutes, %f seconds.\n\n", (int)time[0],(int)time[1],time[2]);	
	}
}
bool online_attack(){
	//random select a key and IV and run the initial phase
	ECRYPT_ctx_reduce* ctx_reduce=new ECRYPT_ctx_reduce;
	u8* key_R=new u8[4]();
	u8* IV_R=new u8[3]();
	for(int i=0;i<4;i++){
		key_R[i]= rc4();
	}
	for(int i=0;i<3;i++){
		IV_R[i]= rc4();
	}
	ECRYPT_keysetup_reduce(ctx_reduce,key_R,32,24);
	ECRYPT_ivsetup_reduce(ctx_reduce,IV_R);
	//initial phase complete, start to collect sets A and B
	start_cal();
	double time[4]={0};
	bool res=collect_sets(ctx_reduce,1,12);
	end_cal(time);
	printf("Time: %d hours, %d minutes, %f seconds.\n\n", (int)time[0],(int)time[1],time[2]);
	//测试时刻和保存的内部状态,以及输出的密钥流是否对得上

	delete [] key_R;
	delete [] IV_R;
	//delete ctx_reduce;

	return res;
}
Exemple #3
0
static QState uiMenuCalibrateTemperatureStart(struct UI *me)
{
	switch (Q_SIG(me)) {
	case Q_ENTRY_SIG:
		QActive_armX(&me->super, 1, 1);
		return Q_HANDLED();
	case Q_TIMEOUT1_SIG:
		if (start_cal(me)) {
			return Q_TRAN(uiMenuCalibrateTemperatureStarted);
		} else {
			me->temperatureWaits ++;
			Q_ASSERT( me->temperatureWaits < 10 );
			return Q_TRAN(uiMenuCalibrateTemperatureStart);
		}
	}
	return Q_SUPER(uiMenuCalibrateDeferExit);
}
//测试调用一次genOutput_diff_imp_grain_reduce_v1函数需要多长时间 NCA-1.0
//以及每次枚举随机状态的个数和输出差分个数之间的差距
void test_time_genOutput_v1(){
	u32 d=4;
	u32 k=1;
	for(;k<=d;k++){
		u32 *v=new u32[k+1]();
		//进行10次实验
		double time[4]={0};
		start_cal();
		for(int j=0;j<10;j++){
			for(int i=0;i<k;i++){
				v[i]=(rc4() % STATE_REDUCE) +1;
			}
			v[k]=STATE_REDUCE+1;
			genOutput_diff_imp_grain_reduce_v1(k,v,d);
		}
		end_cal(time);
		printf("输入差分的汉明重量:%d, 每一个差分枚举的状态个数为:%d.\n",k,STATE_NUM*k);
		printf("Time: %d hours, %d minutes, %f seconds.\n\n", (int)time[0],(int)time[1],time[2]);	
		delete [] v;
	}
}
//测试genOutput_diff_imp_grain_reduce函数需要多长时间 NCA-3.0
void test_time_genOutput_v3(){
	u32 d=4;
	u32 k=1;
	//针对不同重量的输入差分
	for(;k<=d;k++){
		u32 *v=new u32[k+1]();
		//进行10次实验
		double time[4]={0};
		u32 state_Len=STATE_REDUCE-SP;		//总的状态数 减去sampling resistance的大小
		start_cal();
		for(int j=0;j<10;j++){
			for(int i=0;i<k;i++){
				v[i]=(rc4() % state_Len) +1;
			}
			v[k]=state_Len+1;
			genOutput_diff_imp_grain_reduce_v3(k,v,"");
		}
		end_cal(time);
		printf("输入差分的汉明重量:%d, 每一个差分枚举的状态个数为:%d.\n",k,STATE_NUM*k);
		printf("Time: %d hours, %d minutes, %f seconds.\n\n", (int)time[0],(int)time[1],time[2]);	
		delete [] v;
	}
}