⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 wdatato.cpp

📁 压缩程序函数体:十六进制的除法、十进制的除法、二十六进制的除法(表示范围为字符串)、三十六进制的除法、九十六进制的除法
💻 CPP
📖 第 1 页 / 共 2 页
字号:
int  HexToAlphaNum(char *strSource,unsigned char *strDest){
	short sTemp = 0,TempStrLen=0;
	char *pDest = (char *)(strDest+MAX_STRLEN);
	char TempStr[10];
	*pDest = '\0';
	char  tstr[MAX_STRLEN+1];
	strcpy(tstr,strSource);
	long Denominator = 36*36*36*36*36,Reminder;	// 每次转出5个字节(2^32)/16 > 36*36*36*36*36
		// 输入值检查.
		// 数制转换
	do{
		Reminder = HexDivision(tstr,Denominator,tstr);
		if(tstr[0]){	// 不是最后一组
			pDest -= 5;		// 因为是倒序出,所以先将结果认在尾,然后再移动。
			TempStrLen += 5;
			strncpy(pDest,ToAlphaNumStr(Reminder,5),5);
		}
		else {			// 最后一组,不需要前导0
			strcpy(TempStr,ToAlphaNumStr(Reminder,0));
			pDest -= strlen(TempStr);		// 因为是倒序出,所以先将结果认在尾,然后再移动。
			TempStrLen += (short)(strlen(TempStr));
			strncpy(pDest,TempStr,strlen(TempStr));
		}
	}while(tstr[0]);	// 当还有商时,要继续处理,直到商为0
	memmove(strDest,pDest,TempStrLen+1);	// 将结束符出加到最后。
	return ERROR_NOERROR;
}


//==============================================================================
// ASCII码进制的处理(0x20-->0x7f)   相当于96进制
// 取ASCII字符的值
//==============================================================================
unsigned char GetAsciiValue(char AsciiChar){
	return (AsciiChar - 0x20);
}
char ToAsciiChar(unsigned char AsciiValue){
	return ' '+AsciiValue;
}

char *ToAsciiStr(long AsciiValue,unsigned char AsciiNum)
{
	static char AsciiStr[10];
	int i=0;
	ldiv_t tDiv;
	tDiv.quot = AsciiValue;
	do{
		tDiv = ldiv(tDiv.quot,96);
		AsciiStr[i++]=ToAsciiChar((unsigned char)tDiv.rem);
	}while(tDiv.quot);	// 商不为0
	while(i<AsciiNum && i<10) AsciiStr[i++]=ToAsciiChar(0);	// 补位
	AsciiStr[i] = '\0';
	return strrev(AsciiStr);
}

//==============================================================================
// 任意长度九十六进制除法 ,返回余数 
// 输入为九十六进制串,输出为余数
//==============================================================================
long AsciiDivision(char *Numerator/*分子*/,long Denominator/*分母*/,char *Quot/*商*/){
	long TempNum=0;
	ldiv_t tDiv;
	char *tempQuot = Quot;
	while(*Numerator){
		assert(*Numerator>=0x20 && *Numerator<=0x7f);
		TempNum = TempNum * 96 + GetAsciiValue(*Numerator);
		if(TempNum>Denominator) {		// 余数比除数大
			tDiv = ldiv(TempNum,Denominator);
			*tempQuot++ = ToAsciiChar((unsigned char)tDiv.quot);	// 商,因为是26进制,所以不会比Z大
			TempNum = tDiv.rem;								// 余数
		}
		else {
			if(tempQuot != Quot) *tempQuot++ = ' ';	// 若不是头,则补最小值(空格),否则不用补
		}
		Numerator++;
	}
	*tempQuot = '\0';
	return TempNum;
}

//==============================================================================
// 将任意长度的九十六进制串转化为十六进制串
// 输入:strSource -- 源串(为96进制的串)
// strDest   -- 目标串(为16进制的字符串)
// 返回:错误号
//==============================================================================
int  AsciiToHex(char *strSource,unsigned char *strDest){
	short sTemp = 0,TempStrLen=0;
	char *pDest = (char *)(strDest+MAX_STRLEN);
	char TempStr[10];
	*pDest = '\0';
	char  tstr[MAX_STRLEN+1];
	strcpy(tstr,strSource);
	long Denominator = 256*256*256,Reminder;	// 每次转出三个字节
		// 输入值检查
		// 数制转换
	do{
		Reminder = AsciiDivision(tstr,Denominator,tstr);
		if(tstr[0]){	// 不是最后一组
			sprintf(TempStr,"%06X",Reminder);	// 不用ltoa,因为方便前面补0,未直接用pDest缓冲区,是因为结束符会冲掉后面的数据
			pDest -= 6;		// 因为是倒序出,所以先将结果认在尾,然后再移动。
			TempStrLen += 6;
			strncpy(pDest,TempStr,6);
		}
		else {			// 最后一组,不需要前导0
			sprintf(TempStr,"%X",Reminder);	// 不用ltoa,因为方便前面补0,未直接用pDest缓冲区,是因为结束符会冲掉后面的数据
			pDest -= strlen(TempStr);		// 因为是倒序出,所以先将结果认在尾,然后再移动。
			TempStrLen += (short)strlen(TempStr);
			strncpy(pDest,TempStr,strlen(TempStr));
		}
	}while(tstr[0]);	// 当还有商时,要继续处理,直到商为0
	memmove(strDest,pDest,TempStrLen+1);	// 将结束符出加到最后。
	return ERROR_NOERROR;
}

//==============================================================================
// 将任意长度的十六进制数字串转化为九十六进制串
// 输入:strSource -- 源串(为16进制的串)
//       strDest   -- 目标串(为96进制的串)
// 返回:错误号
//==============================================================================
int  HexToAscii(char *strSource,unsigned char *strDest){
	short sTemp = 0,TempStrLen=0;
	char *pDest = (char *)(strDest+MAX_STRLEN);
	char TempStr[10];
	*pDest = '\0';
	char  tstr[MAX_STRLEN+1];
	strcpy(tstr,strSource);
	long Denominator = 96*96*96*96,Reminder;	// 每次转出5个字节(2^32)/16 > 96*96*96*96
		// 输入值检查.
		// 数制转换
	do{
		Reminder = HexDivision(tstr,Denominator,tstr);
		if(tstr[0]){	// 不是最后一组
			pDest -= 4;		// 因为是倒序出,所以先将结果认在尾,然后再移动。
			TempStrLen += 4;
			strncpy(pDest,ToAsciiStr(Reminder,4),4);
		}
		else {			// 最后一组,不需要前导0
			strcpy(TempStr,ToAsciiStr(Reminder,0));
			pDest -= strlen(TempStr);		// 因为是倒序出,所以先将结果认在尾,然后再移动。
			TempStrLen += (short)(strlen(TempStr));
			strncpy(pDest,TempStr,strlen(TempStr));
		}
	}while(tstr[0]);	// 当还有商时,要继续处理,直到商为0
	memmove(strDest,pDest,TempStrLen+1);	// 将结束符出加到最后。
	return ERROR_NOERROR;
}

//==============================================================================
// 格式化数据
// 参数:type   源数据类型(0-数字;1-字母;2-数字+字母;3-ASCII;4-HEX;5-口令;6-用户识别号)
//	     data   要格式化的字符串
//	     len    给定的格式化后的字符串长度
//==============================================================================
void FormatData(BYTE bType, LPSTR sData, DWORD len)
{
	int i,k;
	DWORD clen=strlen(sData);
	if(clen>=len){
		sData[len]='\0';
		return;
	}
	k = len - clen;

	if(bType==0 || bType==4) //HEX数据均右对齐,以0x00(或半字节的0)左补足
	{
		for(i=clen-1; i>=0; i--) sData[k+i] = sData[i];
		for(i=0; i<k; i++) sData[i] = '0';
	}
	if(bType==1 || bType==2 || bType==3) //ASC数据均左对齐,以0x20右补足
	{
		for(i=0; i<k; i++) sData[clen+i] = 0x20;
	}
	if(bType==5) //所有口令均左对齐,以0xFF(或半字节的F)右补足
	{
		for(i=0; i<k; i++) sData[clen+i] = 'F';
	}
	if(bType==6) //用户识别号后补空格
	{
		for(i=0; i<k; i++) sData[clen+i] = ' ';
	}
	sData[len]='\0';
}

//==============================================================================
// RSA解签
// 参数说明:
//    input       输入RSA密文
//    inputLen    输入RSA密文长度
//    output      输出RSA解签结果
//    outputLen   输出RSA解签结果长度
// 返回值:
//   ture ——解签成功
//   false——解签失败
//==============================================================================
bool rsapublicfunc(LPBYTE input, UINT inputLen, LPBYTE rsakey, LPBYTE output, UINT *outputLen) 
{
	if(inputLen > MAX_RSA_MODULUS_LEN) return false;

	DWORD c[MAX_NN_DIGITS], e[MAX_NN_DIGITS], m[MAX_NN_DIGITS],	n[MAX_NN_DIGITS];
	UINT eDigits, nDigits;

	RSA_PUBLIC_KEY publicKey = {
	1024,
	{0x9B,0x9E,0xC6,0x74,0x65,0x5A,0xBC,0xBA,0xC6,0xB0,0x5D,0x3C,
	 0x24,0x3C,0x90,0x59,0x7D,0x5B,0x6D,0x03,0x7B,0xAD,0x9A,0xB4,
	 0x58,0xFE,0x80,0x22,0xEC,0xF0,0xAB,0x84,0xF9,0x07,0x84,0x91,
	 0xE2,0x08,0xA6,0x9B,0xED,0xD7,0x45,0xC9,0xDD,0xBF,0xF8,0x7A,
	 0x8B,0xE1,0x17,0xCD,0x3D,0xD3,0x6F,0xB2,0x59,0x0C,0x0E,0x47,
	 0x0B,0x8E,0x83,0xC5,0x0F,0xAF,0xD8,0x21,0x0C,0xD1,0x0B,0xB4,
	 0x24,0x8D,0x66,0xAC,0x93,0xA3,0xE4,0x61,0xEF,0x26,0x50,0x1C,
	 0x30,0xED,0x73,0xF1,0x92,0xD8,0x2C,0xC6,0x38,0xD4,0x6D,0x81,
     0x48,0x2B,0xCC,0x42,0xF8,0x60,0x61,0xAD,0x8D,0x7F,0x8D,0x6D,
	 0x87,0xBF,0x7D,0x1C,0x61,0x2B,0xC0,0x42,0x47,0xDB,0xDD,0xC9,
	 0x3F,0x07,0x23,0xE1,0x3D,0xDA,0xDB,0x85},
	{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
	 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
	 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
	 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
	 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
	 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
	 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
	 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
	 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
	 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
	 0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x01}
	};

	memcpy(publicKey.modulus,rsakey+2,128);

	/* decode the required RSA function input data */
	NN_Decode(m, MAX_NN_DIGITS, input, inputLen);
	NN_Decode(n, MAX_NN_DIGITS, publicKey.modulus, MAX_RSA_MODULUS_LEN);
	NN_Decode(e, MAX_NN_DIGITS, publicKey.publicExponent, MAX_RSA_MODULUS_LEN);

	nDigits = NN_Digits(n, MAX_NN_DIGITS);
	eDigits = NN_Digits(e, MAX_NN_DIGITS);

	if(NN_Cmp(m, n, nDigits) >= 0)
		return false;

	*outputLen = (publicKey.bits + 7) / 8;

	/* Compute c = m^e mod n.  To perform actual RSA calc.*/
	NN_ModExp (c, m, e, eDigits, n, nDigits);

	/* encode output to standard form */
	NN_Encode (output, *outputLen, c, nDigits);

	/* Clear sensitive information. */
	memset((POINTER)c, 0, sizeof(c));
	memset((POINTER)m, 0, sizeof(m));

	return true;
}

//==============================================================================
// BCD码转换成十六进制字符串
// 参数说明:
//    len   要转换的BCD码字节数
//	  bcd   要转换的BCD码,如0xa1,0x68,0xfe
//	  hex   转换成的十六进制字符串,如"a168fe"
//==============================================================================
void Bcd2Hex(DWORD* len, LPBYTE bcd, LPSTR hex) 
{
   BYTE chb;
   DWORD clen=2*(*len)+1;
   BYTE *tmp=new BYTE[clen];
   for(DWORD i=0;i<2*(*len);i++){
	   if(i%2) chb=bcd[i/2]&0x0f;
	   else    chb=bcd[i/2]>>4;
	   if(chb<=9) chb+='0';
	   else       chb=chb-10+'a';
	   tmp[i]=chb;
   }
   tmp[clen-1]='\0';
   strcpy(hex,(char*)tmp);
   delete tmp;
   *len=clen-1;
}

//==============================================================================
// 十六进制字符串转换成BCD码
// 参数说明:   
//    hex   要转换的十六进制字符串,如"a168fe"
//	  len   转换得到的BCD码字节数
//	  bcd   转换得到的BCD码,如0xa1,0x68,0xfe
//==============================================================================
void Hex2Bcd(LPSTR hex, DWORD* len, LPBYTE bcd) 
{
   BYTE bcdb;
   DWORD chlen=strlen(hex);
   char str[8912]="0";
   if(chlen%2){
	   strcat(str,hex);
	   strcpy(hex,str);
	   chlen++;
   }

   *len=chlen/2;
   for(DWORD i=0;i<chlen;i++){
	   if(hex[i]>='0' && hex[i]<='9'){
		  bcdb=hex[i]-'0';
	   }
	   else if(hex[i]>='a' && hex[i]<='f'){
		  bcdb=hex[i]-'a'+10;
	   }
	   else{
		  bcdb=hex[i]-'A'+10;
	   }
	   bcd[i/2]=bcdb+(bcd[i/2]<<4);
   }
   bcd[*len]='\0';
}

//==============================================================================
// BCD码转换为十进制数
// 参数说明:
//    bcd   要转换的bcd码
//    len   要转换的bcd码的字节数
// 返回值: 转换后的十进制数
//==============================================================================
DWORD64 Bcd2Int(LPBYTE bcd, DWORD len) 
{
	DWORD64 itemp=0;
	for(DWORD i=0; i<len; i++)
		itemp=(itemp<<8)+bcd[i];
	return itemp;
}

//==============================================================================
// 十六进制字符串转换为十进制数
// 参数说明:
//    hex   要转换的十六进制字符串
// 返回值: 转换后的十进制数
//==============================================================================
DWORD64 Str2Int(LPSTR hex) 
{
	DWORD len;
	unsigned char btmp[64];

	Hex2Bcd(hex,&len,btmp);
	return Bcd2Int(btmp,len);
}

//==============================================================================
// 按照pkcs#1格式组装数据
//EM=00||BT||PS||00||D
//BT=01
//PS=FF
//D=||30||XX(LEN(M)+0D)||30||09||06||05||2B||0E||03||02||1A||05||00||04||LEN(M)||M;
//==============================================================================
int GetRSAData_Sign_P1(unsigned char *indata,unsigned int indatalen,unsigned char *outdata)
{
	//组装数据
	if(indatalen > 117) return -1;
	memcpy(outdata+(128-indatalen),indata,indatalen);


	return 0;
}
int GetRSAData_Crypt_P1(unsigned char *indata,unsigned int indatalen,unsigned char *outdata)
{
	//组装数据
	if(indatalen > 117) return -1;
	memcpy(outdata+(128-indatalen),indata,indatalen);

	int i = 128-indatalen;
	outdata[i] = 0x00;
	i--;
	while(i>2)
	{
		outdata[i] = (rand()%0x100);
		i--;
	}
	outdata[1] = 0x02;
	outdata[0] = 0x00;

	return 0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -