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