/* 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; }
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; } }