unsigned char KEY_CalcMAC_2(unsigned char *pucInData, unsigned short uiInLen, unsigned char *pucOutMAC) { unsigned char ucResult; unsigned char aucHexData[8], aucAscData[17]; unsigned char *pucPtr; unsigned short uiI, uiJ, uiLen; pucPtr = pucInData; KEY_DumpData("初始数据:\n", pucPtr, uiInLen); memset(aucHexData, 0, sizeof(aucHexData)); for(uiI = 0; uiI < uiInLen; uiI += 8) { uiLen = min(8, pucInData+uiInLen-pucPtr); for(uiJ = 0; uiJ < uiLen; uiJ++) { aucHexData[uiJ] ^= *(pucPtr+uiJ); } pucPtr += 8; } memset(aucAscData, 0, sizeof(aucAscData)); hex_asc(aucAscData, aucHexData, 16); aucAscData[16] = 0; memset(aucHexData, 0, sizeof(aucHexData)); ucResult = Encrypt8ByteSingleKey_47(KEYARRAY_GOLDENCARDSH, KEYINDEX_GOLDENCARDSH_MAK, aucAscData, aucHexData); KEY_DumpData("DES加密后数据:\n", aucHexData, 8); if(!ucResult) { for(uiI = 0; uiI < 8; uiI++) aucHexData[uiI] ^= aucAscData[8+uiI]; ucResult = Encrypt8ByteSingleKey_47(KEYARRAY_GOLDENCARDSH, KEYINDEX_GOLDENCARDSH_MAK, aucHexData, aucHexData); KEY_DumpData("再次DES加密后数据:\n", aucHexData, 8); } if(!ucResult) { memset(aucAscData, 0, sizeof(aucAscData)); hex_asc(aucAscData, aucHexData, 16); KEY_DumpData("最后转换16位后数据:\n", aucAscData, 16); } if(!ucResult) memcpy(pucOutMAC, aucAscData, 8); return ucResult; }
int main(int argc, char * argv[]) { int opt; while((opt = getopt(argc,argv,"c:d:f:w:i:o:")) != EOF) { switch(opt) { case 'c': CoverThreshold = atof(optarg); break; case 'd': DiscardThreshold = atof(optarg); break; case 'f': FThreshold = atof(optarg); break; case 'w': WThreshold = atof(optarg); break; case 'i': memcpy(ReadFileName,optarg,strlen(optarg)); ReadFileName[strlen(optarg)] = '\0'; break; case 'o': memcpy(WriteFileName,optarg,strlen(optarg)); WriteFileName[strlen(optarg)] = '\0'; break; } } /*if(argc == 2) WThreshold = atof(argv[1]); if(argc == 3) { WThreshold = atof(argv[1]); FThreshold = atof(argv[2]); } if(argc == 4) { WThreshold = atof(argv[1]); FThreshold = atof(argv[2]); DiscardThreshold = atof(argv[3]); }*/ //initialize the queue MQueue = (Queue *)malloc(sizeof(Queue)); MQueue->QnodeNum = 0; MQueue->StartQnode = (Qnode *)malloc(sizeof(Qnode)); MQueue->EndQnode = (Qnode *)malloc(sizeof(Qnode)); // MQueue->StartQnode->NextQnode = MQueue->EndQnode;//recording the relationship of the virsital start node and the virtual end node initially MQueue->EndQnode->PreviousQnode = MQueue->StartQnode; // MQueue->StartQnode->PreviousQnode = NULL;//no former node to the virtual start node MQueue->EndQnode->NextQnode = NULL;//node latter node to the virtual end node MQueue->StartQnode->QTnode = NULL;//NULL in the virtual start node MQueue->EndQnode->QTnode = NULL;//NULL in the virtual end node //judge m and n char str[10000]; get_size(m); UsedTransactionNum = m; TransactionArray = (Transaction *)malloc(m*sizeof(Transaction)); FILE * fr = fopen(ReadFileName,"r"); for( int i = 0; i < m; i ++) {//transfer each line of the data into a Transaction, we regard that there are no more than 20000 letters each line fgets(str,10000,fr); make_transaction(TransactionArray,i,str); } fclose(fr); //till now, all the data in the file has been read into the memory //initial the structure of the Tree Tree * MTree; MTree = (Tree *)malloc(sizeof(MTree)); MTree->TnodeNum = 0; MTree->Root = (Tnode *)malloc(sizeof(Tnode)); MTree->Root->TTransactionNum = m; MTree->Root->TTransaction = (Transaction *)malloc(MTree->Root->TTransactionNum * sizeof(Transaction));//allocate memory for the Transaction in the root for( int i = 0; i < MTree->Root->TTransactionNum; i ++) { MTree->Root->TTransaction[i].ItemArray = TransactionArray[i].ItemArray;//copy all the elements in the TransactionArray into the MTree MTree->Root->TTransaction[i].PacketNum = TransactionArray[i].PacketNum; } MTree->Root->ChildTnodeArray = NULL; MTree->Root->ChildTnodeNum = 0; MTree->Root->FatherTnode = NULL; MTree->Root->NextTnode = NULL; MTree->Root->PreviousTnode = NULL; MTree->Root->TItem = 0; MTree->Root->TLevel = 0; MTree->Root->TSerialNum = 0; en_queue(MTree->Root); //while(MQueue->QnodeNum) //{ //make_split(MTree,de_queue()); //} int ThisLevelNum = 0; int LastTnodeLevel = 0; // the level of last Tnode, it is used for judging whether the level has changed int TillLastLevelFinishedNum = 0; int TillThisLevelFinishedNum = 0; //the below code is to input all the data into a file FILE * fw = fopen(WriteFileName,"w"); Tnode * TmpTnode; //en_queue(MTree->Root); if( WThreshold < ((float)2)/MTree->Root->TTransactionNum) WThreshold = ((float)2)/MTree->Root->TTransactionNum - 0.01; while(MQueue->QnodeNum) { TmpTnode = de_queue(); //fprintf(fw,"TSerialNum:%d UsedTransactionNum: %d ", TmpTnode->TSerialNum, UsedTransactionNum); //if(TmpTnode->TSerialNum > 30) // fprintf(fw,"Father %d ", TmpTnode->FatherTnode->TSerialNum); // fprintf(stderr,"A\n"); make_split(MTree,TmpTnode);// all the push are done inside make_split //fprintf(fw,"AUsedTNum: %d children;: %d\n",UsedTransactionNum,TmpTnode->ChildTnodeNum); // fprintf(stderr,"%d\n",UsedTransactionNum); // fprintf(stderr,"%d\n",MTree->Root->TTransactionNum); // fprintf(stderr,"%f\n",CoverThreshold); // if(MQueue->QnodeNum == 0) // fprintf(fw,"reach end\n"); if((float)UsedTransactionNum / MTree->Root->TTransactionNum < CoverThreshold) { // fprintf(stderr,"B\n"); while(MQueue->QnodeNum) { TmpTnode = de_queue(); fprintf(fw," Numof-Tran:%5d \n",TmpTnode->TTransactionNum); for( int i = 0; i < TmpTnode->TLevel; i ++) fprintf(fw,"(@%d %d)%s %c ",TmpTnode->TItem[i].PacketSeqNum, TmpTnode->TItem[i].ByteSeqNum,TmpTnode->TItem[i].Pload,hex_asc(TmpTnode->TItem[i].Pload)==10?160:hex_asc(TmpTnode->TItem[i].Pload)); fprintf(fw,"\n"); } break; } if(TmpTnode->ChildTnodeNum) continue; fprintf(fw,"Numof-Tran:%5d \n",TmpTnode->TTransactionNum); for( int i = 0; i < TmpTnode->TLevel; i ++) fprintf(fw,"(@%d %d)%s %c ",TmpTnode->TItem[i].PacketSeqNum, TmpTnode->TItem[i].ByteSeqNum,TmpTnode->TItem[i].Pload, hex_asc(TmpTnode->TItem[i].Pload)==10?160:hex_asc(TmpTnode->TItem[i].Pload)); fprintf(fw,"\n"); } //fprintf(fw,"TnodeNum: %d\n",MTree->TnodeNum); fprintf(fw,"\n\n%.4f%% of all the Transactions are covered by this feature\n", 100 * (float)UsedTransactionNum / MTree->Root->TTransactionNum); fprintf(fw,"Parameter: \n FThreshold: %.2f;\n WThreshold: %.2f;\n DiscardThreshold: %.2f;\n CoverThreshold: %.2f;\n",FThreshold, WThreshold, DiscardThreshold, CoverThreshold); fclose(fw); fprintf(stdout,"success!\n"); return 0; }