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

📄 sdfunc.cpp

📁 基于ppc的PKI_SD的一个小模块
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	unsigned char Data[512];
	unsigned long bRLen;
	char ch1,ch2;
	Data[0]=0x85;
	Data[1]=0;
	bRLen=RemoteCallForUserData((byte *)Data,2);
	if(bRLen==0)
	{
		nResult = 0x00F1;	
	}
	else
	{
		if(Data[0]==0x84&&Data[1]==0x83)
		{		
			sResult=_T("E部分为:");
			for( int i = 0; i < 3 ; i ++)
			{
				SDFunc::CharToAsc(Data[i+2],ch1,ch2);
				SDFunc::AppendChar((WCHAR)ch1,sResult);
				SDFunc::AppendChar((WCHAR)ch2,sResult);
			}
			sResult+=_T("\nN部分为:");
			for( int i = 0; i < 0x80 ; i ++)
			{
				SDFunc::CharToAsc(Data[i+5],ch1,ch2);
				SDFunc::AppendChar((WCHAR)ch1,sResult);
				SDFunc::AppendChar((WCHAR)ch2,sResult);
			}
			nResult=0;
		}
		else if(0==(Data[0]&0xf0))
		{
			nResult=*((unsigned short*)(&Data[2]));
		}
		else
		{
			nResult=0xFFFF;
		}		
	}
	return nResult;
}


unsigned short SDFunc::SPPubKeyEncrypt(CString strData,CString &sResult)			//SP公钥加密
{
	unsigned short nResult;
	unsigned char Data[512];
	unsigned long bRLen;
	int len;
	char ch1,ch2;
	Data[0]=0x86;
	
	SDFunc::CStringToHex(strData,&Data[2],len);
	Data[1]=len;
	if(128!=Data[1])      
	{
		nResult=0x00F7;
		return nResult;
	}

	bRLen=RemoteCallForUserData((byte *)Data,len+2);
	if(bRLen==0)
	{
		nResult =0x00F1;	
	}
	else
	{
		if(128!=Data[1])      
		{
			nResult=0x00FC;
			return nResult;
		}

		if(Data[0]==0x86)
		{
			for( int i = 0; i < Data[1] ; i ++)
			{
				SDFunc::CharToAsc(Data[i+2],ch1,ch2);
				SDFunc::AppendChar((WCHAR)ch1,sResult);
				SDFunc::AppendChar((WCHAR)ch2,sResult);
			}
			nResult=0;
		}
		else if(0==(Data[0]&0xf0))
		{
			nResult=*((unsigned short*)(&Data[2]));
		}
		else
		{
			nResult=0xFFFF;
		}
		
	}
	return nResult;
}

// 私钥加密
unsigned short SDFunc::PriKeyEncrypt(CString strData,CString &sResult)
{
	unsigned short nResult;
	unsigned char Data[512];
	unsigned long bRLen;
	int len;
	Data[0]=0x87;
	
	SDFunc::CStringToHex(strData,&Data[2],len);
	Data[1]=len;
	if(128!=Data[1])      
	{
		nResult=0x00F7;
		return nResult;
	}

	bRLen=RemoteCallForUserData((byte *)Data,len+2);

	if(bRLen==0)
	{
		nResult = 0x00F1;	
	}
	else
	{
		if(Data[0]==0x87&&Data[2]==0x90&&Data[3]==0x00)
		{		
			sResult=_T("表示开始加密运算");	
			nResult=0;
			
		}
		else if(0==(Data[0]&0xf0))
		{
			nResult=*((unsigned short*)(&Data[2]));
		}
		else
		{
			nResult=0xFFFF;
		}		
	}
	return nResult;;
}

// 签名口令校验


// 取私钥加密结果
unsigned short SDFunc::GetPriKeyEnResult(CString &sResult)
{
	unsigned short nResult;
	unsigned char Data[512];
	unsigned long bRLen;
	char ch1,ch2;

	Data[0]=0x88;
	Data[1]=0;
	bRLen=RemoteCallForUserData((byte *)Data,2);
	if(bRLen==0)
	{
		nResult = 0x00F1;	
	}
	else
	{
		if(128!=Data[1])      
		{
			nResult=0x00F8;
			return nResult;
		}

		if(Data[0]==0x88)
		{
			for( int i = 0; i < Data[1] ; i ++)
			{
				SDFunc::CharToAsc(Data[i+2],ch1,ch2);
				SDFunc::AppendChar((WCHAR)ch1,sResult);
				SDFunc::AppendChar((WCHAR)ch2,sResult);
			}
			nResult=0;
			
		}
		else if(0==(Data[0]&0xf0))
		{
			nResult=*((unsigned short*)(&Data[2]));
		}
		else
		{
			nResult=0xFFFF;
		}
		
	}
	return nResult;
}

// “挑战码方式”动态口令的生成

//Note: 动态口令的长度和8字节的挑战码之间以空格作为分隔符
unsigned short SDFunc::GenChaCodePw(CString strData,CString &sResult)		
{
	CString strPwLen;
	unsigned short nResult;
	unsigned char Data[512];
	unsigned long bRLen;
	int len;
	strPwLen=strData.Left(strData.Find(' '));
	SDFunc::CStringToHex(strPwLen,&Data[2],len);
	strData=strData.Right(strData.Find(' '));
	Data[0]=0x8A;	
	SDFunc::CStringToHex(strData,&Data[2],len);
	Data[1]=++len;
	if(8!=Data[1])      
	{
		nResult=0x00F9;
		return nResult;
	}

	bRLen=RemoteCallForUserData((byte *)Data,len+2);
	if(bRLen==0)
	{
		nResult = 0x00F1;	
	}
	else
	{
		if(Data[0]==0x8A)
		{
			for( int i = 0; i < Data[1] ; i ++)
			{	
				SDFunc::AppendChar((WCHAR)Data[i+2],sResult);
			}
			nResult=0;
		}
		else if(0==(Data[0]&0xf0))
		{
			nResult=*((unsigned short*)(&Data[2]));
		}
		else
		{
			nResult=0xFFFF;
		}
		
	}
	return nResult;	
}

// 导入SP公钥
//只要输入公钥的N部分就可以
unsigned short SDFunc::WriteSPPubKey(CString strData,CString &sResult)
{
	unsigned short nResult=0xFFFF;
	unsigned char Data[512];
	unsigned long bRLen;
	int len;	
	Data[0]=0x8B;
	Data[2]=0x01;
	Data[3]=0x00;
	Data[4]=0x01;
	SDFunc::CStringToHex(strData,&Data[5],len);
	if(0x80!=len)
	{
		nResult=0x00FA;
	}
	Data[1]=0x83;
	bRLen=RemoteCallForUserData((byte *)Data,0x85);
	if(bRLen==0)
	{
		nResult =0x00F1;	
	}
	else
	{
		if(Data[0]==0x8B&&0==Data[1])
		{
			sResult=_T("导入成功");	
			nResult=0;

		}
		else if(0==(Data[0]&0xf0))
		{
			nResult=*((unsigned short*)(&Data[2]));
		}
		else
		{
			nResult=0xFFFF;
		}
		
	}
	return nResult;
}

// 签名口令修改
// Note:旧口令和新口令之间以空格作为分隔符,先输入旧口令再输入新口令
unsigned short SDFunc::ChangePw(CString strData,CString &sResult)
{
	CString sOldPw,sNewPw;
	unsigned short nResult=0xFFFF;
	unsigned char Data[512];
	unsigned long bRLen;
	int len1,len2;
	sOldPw=strData.Left(strData.Find(' '));
	for(len1=0;len1<(sOldPw.GetLength()/2);len1++)
	{
		Data[len1+2]=(char)sOldPw.GetAt(2*len1+1);
	}

	sNewPw=strData.Right(strData.Find(' '));
	for(len2=0;len2<(sNewPw.GetLength()/2);len2++)
	{
		Data[len1+len2+2]=(char)sNewPw.GetAt(2*len2+1);
	}
	
	Data[1]=len1+len2;
	Data[0]=0x8D;
	bRLen=RemoteCallForUserData((byte *)Data,Data[1]+2);
	if(bRLen==0)
	{
		nResult = 0x00F1;	
	}
	else
	{
		if(Data[0]==0x8D&&0==Data[1])
		{
			sResult=_T("口令修改成功");	
			nResult=0;
		}
		else if(0==(Data[0]&0xf0))
		{
			nResult=*((unsigned short*)(&Data[2]));
		}
		else
		{
			nResult=0xFFFF;
		}
		
	}
	return nResult;
}

// 签名口令解锁
//Note :解锁口令和新口令之间以空格作为分隔符,并且先输入解锁口令再输入新口令
unsigned short SDFunc::UnlockPw(CString strData,CString &sResult)
{
	CString sUnlockPw,sNewPw;
	unsigned short nResult;
	unsigned char Data[512];
	unsigned long bRLen;
	int len1,len2;
	Data[0]=0x8E;
	sUnlockPw=strData.Left(strData.Find(' '));
	for(len1=0;len1<(sUnlockPw.GetLength()/2);len1++)
	{
		Data[len1+2]=(char)sUnlockPw.GetAt(2*len1+1);
	}

	sNewPw=strData.Right(strData.Find(' '));
	for(len2=0;len2<(sNewPw.GetLength()/2);len2++)
	{
		Data[len1+len2+2]=(char)sNewPw.GetAt(2*len2+1);
	}
	
	Data[1]=len1+len2;
	
	bRLen=RemoteCallForUserData((byte *)Data,Data[1]+2);
	if(bRLen==0)
	{
		nResult = 0x00F1;	
	}
	else
	{
		if(Data[0]==0x8E&&0==Data[1])
		{
			sResult=_T("口令修改成功");	
			nResult=0;
		}
		else if(0==(Data[0]&0xf0))
		{
			nResult=*((unsigned short*)(&Data[2]));
		}
		else
		{
			nResult=0xFFFF;
		}
		
	}
	return nResult;
}

// 获得卡片数据
unsigned short SDFunc::GetSDData(CString &sResult)
{
	unsigned short nResult=0xFFFF;
	unsigned char Data[512];
	unsigned long bRLen;
	char ch1,ch2;
	Data[0]=0x8F;
	Data[1]=0;
	bRLen=RemoteCallForUserData((byte *)Data,2);
	if(bRLen==0)
	{
		nResult =0x00F1;	
	}
	else
	{
		if(Data[0]==0x84&&Data[1]==0x20)
		{		
			sResult=_T("卡片CID(16字节)为:");
			for( int i = 0; i < 16 ; i ++)
			{
				SDFunc::CharToAsc(Data[i+2],ch1,ch2);
				SDFunc::AppendChar((WCHAR)ch1,sResult);
				SDFunc::AppendChar((WCHAR)ch2,sResult);
			}
			sResult+=_T("\n16字节3DES密钥(动态口令专用密钥)为:");
			for( int i = 0; i < 16 ; i ++)
			{
				SDFunc::CharToAsc(Data[i+5],ch1,ch2);
				SDFunc::AppendChar((WCHAR)ch1,sResult);
				SDFunc::AppendChar((WCHAR)ch2,sResult);
			}
			nResult=0;
		}
		else if(0==(Data[0]&0xf0))
		{
			nResult=*((unsigned short*)(&Data[2]));
		}
		else
		{
			nResult=0xFFFF;
		}		
	}
	return nResult;
}

// “事件同步方式”动态口令的生成

⌨️ 快捷键说明

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