示例#1
0
// 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;  
}
示例#2
0
文件: Des.cpp 项目: starqiu/Ciper
/*
 *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);
}