// Convert the 32-bit binary into the decimal float getFloat32(std::string binary) { int HexNumber = binary2Hex(binary); bool negative = !!(HexNumber & 0x80000000); int exponent = (HexNumber & 0x7f800000) >> 23; int sign = negative ? -1 : 1; // Subtract 127 from the exponent exponent -= 127; // Convert the mantissa into decimal using the // last 23 bits int power = -1; float total = 0.0; for ( int i = 0; i < 23; i++ ) { int c = binary[ i + 9 ] - '0'; total += (float) c * (float) pow( 2.0, power ); power--; } total += 1.0; float value = sign * (float) pow( 2.0, exponent ) * total; return value; }
/* *DES加密 *输入:plainText 16位明文(16进制), key 16位密钥(16进制) *输出:加密后的结果 解密后的结果 16位明文(16进制) */ void deDES(char* ciperText,char* key,char* result){ printf("解密数据开始!\n"); char* dataL=(char*) malloc(32*sizeof(char));//数据左半部分 char* dataR=(char*) malloc(32*sizeof(char));//数据右半部分 char* dataL_cp=(char*) malloc(32*sizeof(char));//数据左半部分拷贝 char* dataR_cp=(char*) malloc(32*sizeof(char));//数据右半部分拷贝 char* data_48=(char*) malloc(48*sizeof(char));//48位中间数据 char* data_64=(char*) malloc(64*sizeof(char));//64位初始数据初始置换后数据 char* data_64_I=(char*) malloc(64*sizeof(char));//64位初始数据 //16个48位密钥空间 char** keys =(char**) malloc(16*sizeof(char*)); for(int i=0;i<16;i++){ *(keys+i) = (char*) malloc(48*sizeof(char)); } //得到16个48位密钥 gen_key(key,keys); //16进制明文转换成2进制 hex2Binary(ciperText,16,data_64_I); //初始置换 init_pmt(data_64_I,data_64); strCopy(data_64,dataL,32); strCopy(data_64+32,dataR,32); //轮变换,循环16轮 for(int rc=1;rc<=16;rc++){ //printf("第%d轮数据:",rc); //扩展置换E pmt_E(dataR,data_48); strCopy(dataL,dataL_cp,32); strCopy(dataR,dataL,32); //异或 for(int i = 0 ;i < 48;i++){ data_48[i] = data_48[i]^keys[16-rc][i]; } //S盒置换/选择 pmt_S(data_48,dataR_cp); //P置换 pmt_P(dataR_cp,dataR); //异或 for(int i = 0 ;i < 32;i++){ dataR[i] = dataL_cp[i]^dataR[i]; } binary2Hex(dataL,32);//打印左半部分 printf(" "); binary2Hex(dataR,32);//打印右半部分 printf("\n"); } //32位互换 strCopy(dataR,data_64_I,32); strCopy(dataL,data_64_I+32,32); //逆初始置换 init_pmt_reverse(data_64_I,data_64); printf("明文为: "); binary2Hex(data_64,result,64); free(data_64); free(dataL); free(dataR); free(dataL_cp); free(dataR_cp); free(data_48); free(data_64_I); free(keys); }