📄 wdatato.cpp
字号:
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 + -