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

📄 mtestdlg.cpp

📁 对于PC/SC读写器调用的示例程序
💻 CPP
📖 第 1 页 / 共 2 页
字号:

	if (hCardHandle[index]>0)  //enable Button4,5 visible
	{ 
	  pButton4->EnableWindow(TRUE);
	  pButton5->EnableWindow(TRUE);
	}
	else
	{ 
	  pButton4->EnableWindow(FALSE);
	  pButton5->EnableWindow(FALSE);
	}


}

void CMtestDlg::OnOK() 
{
	// TODO: Add extra validation here
   
	OnButton5();		


}

void CMtestDlg::OnClickedOk() 
{
	// TODO: Add your control notification handler code here
	CDialog::OnOK();
	
}


/*
	Card Reset
	0084000008SW9000
	0082000008<EA57415443484441544154696D65434F53>SW9000
	800E000000SW9000
	80E00000073F0100FFF0FFFFSW9000 
	80D401001539F0FA0AFF57415443484441544154696D65434F53SW9000
	80E02D000E383C00F0EF1FFFFF504B43533131SW9000
	//Select ADF 2D00
	00A40000022D00SW9000
	//Create Key File
	80E00000073F0100FFF0FFFFSW9000
	//Add USER_PIN
	80D401010D3AF0EF0133313233343536FFFFSW9000
	//Add SO_PIN
	80D401010D3BF0F00133313233343536FFFFSW9000
	//Create PriKey File 0x11 
	80E00011073D014AF0F0F0FFSW9000
	//Create PubKey File 0x26 
	80E00026073E0100F0F0F0FFSW9000
//*/

void CMtestDlg::OnButton6() 
{
	int rv;
	BYTE dwLenr;
	BYTE pinData[260],respData[260],pSOPINdata[8],pPINData[8];
    BYTE ExtAutKey[16],sourData[50],DEST[50];
    memset(pSOPINdata,0xFF,8);
	memset(pPINData,0xFF,8);
    

	//选择3F00 (MF)
	//00 A4 00 00 02 3F00
	memcpy(pinData,"\x3F\x00",2);
	if ((rv = SendCommand(hCardHandle[index],dwAP[index],0x00,0xA4,0x00,0x00,0x02,pinData,0x00,respData,&dwLenr)) != RV_OK)
	{
		AfxMessageBox("Select MF Failed !");
		return;
	}

	//外部认证流程
	//取8字节随机数
	if ((rv = SendCommand(hCardHandle[index],dwAP[index],0x00,0x84,0x00,0x00,0x00,NULL,0x08,respData,&dwLenr)) != RV_OK)
	{
		AfxMessageBox("Get Random Failed !");
		return;
	}

	//3DES
	memcpy(sourData,respData,8);
	
	memcpy(ExtAutKey,"\x57\x41\x54\x43\x48\x44\x41\x54\x41\x54\x69\x6D\x65\x43\x4F\x53",16);
	TripleDesEncrypt(sourData,DEST,ExtAutKey);

	memcpy(pinData,DEST,8);
	//外部认证
	if ((rv = SendCommand(hCardHandle[index],dwAP[index],0x00,0x82,0x00,0x00,0x08,pinData,0x00,respData,&dwLenr)) != RV_OK)
	{
		AfxMessageBox("EA Failed !");
		return;
	}

	//擦除卡片
	//80 0E 00 00 00
	if ((rv = SendCommand(hCardHandle[index],dwAP[index],0x80,0x0E,0x00,0x00,0x00,pinData,0x00,respData,&dwLenr)) != RV_OK)
	{
		AfxMessageBox("Erase Failed !");
		return;
	}
	
	//MF下创建Key文件
	//80 E0 00 00 07 3F0020FFEFFFFF
	memcpy(pinData,"\x3F\x00\x20\xFF\xF0\xFF\xFF",7);
	if ((rv = SendCommand(hCardHandle[index],dwAP[index],0x80,0xE0,0x00,0x00,0x07,pinData,0x00,respData,&dwLenr)) != RV_OK)
	{
		AfxMessageBox("Create KEY File Failed !");
		return;
	}

	//安装卡片主控密钥
	//80 D4 01 00 15 39F00A0AFF57415443484441544154696D65434F53 
	memcpy(pinData,"\x39\xF0\x0A\x0A\xFF\x57\x41\x54\x43\x48\x44\x41\x54\x41\x54\x69\x6D\x65\x43\x4F\x53",21);
	if ((rv = SendCommand(hCardHandle[index],dwAP[index],0x80,0xD4,0x01,0x00,0x15,pinData,0x00,respData,&dwLenr)) != RV_OK)
	{
		AfxMessageBox("Write MK Failed !");
		return;
	}

	//创建DF 3F01
	//80E02D000E383C00F0EF1FFFFF504B43533131
	memcpy(pinData,"\x38\x3C\x00\xF0\xEF\x1F\xFF\xFF\x50\x4B\x43\x53\x31\x31",0x0E);
	if ((rv = SendCommand(hCardHandle[index],dwAP[index],0x80,0xE0,0x2D,0x00,0x0E,pinData,0x00,respData,&dwLenr)) != RV_OK)
	{
		AfxMessageBox("Create DF Failed !");
		return;
	}
	
	//选择3F01
	//00 A4 00 00 02 2D00
	memcpy(pinData,"\x2D\x00",2);
	if ((rv = SendCommand(hCardHandle[index],dwAP[index],0x00,0xA4,0x00,0x00,0x02,pinData,0x00,respData,&dwLenr)) != RV_OK)
	{
		AfxMessageBox("Select DF Failed !");
		return;
	}

	//3F01创建KEY文件
	//80 E0 00 00 07 3F0100FFEFFFFF
	//80 E0 00 00 07 3F0100FFF0FFFF
	memcpy(pinData,"\x3F\x01\x00\xFF\xF0\xFF\xFF",7);
	if ((rv = SendCommand(hCardHandle[index],dwAP[index],0x80,0xE0,0x00,0x00,0x07,pinData,0x00,respData,&dwLenr)) != RV_OK)
	{
		AfxMessageBox("Create KEY File under DF Failed !");
		return;
	}

    //安装3F01下主控密钥
	//80 D4 01 00 15 39F00A0AFF57415443484441544154696D65434F53 
	memcpy(pinData,"\x39\xF0\x0A\x0A\xFF\x57\x41\x54\x43\x48\x44\x41\x54\x41\x54\x69\x6D\x65\x43\x4F\x53",21);
	if ((rv = SendCommand(hCardHandle[index],dwAP[index],0x80,0xD4,0x01,0x00,0x15,pinData,0x00,respData,&dwLenr)) != RV_OK)
	{
		AfxMessageBox("Write MK File under DF Failed !");
		return;
	}

	//安装PIN 密钥标识00,PIN值313233343536
	//80 D4 01 00 0B 3AF0EFBB33313233343536
	//80 D4 01 01 0D 3AF0EF0133313233343536FFFF
	memcpy(pinData,"\x3A\xF0\xEF\x01\x33\x31\x32\x33\x34\x35\x36\xFF\xFF",0x0D);
	if ((rv = SendCommand(hCardHandle[index],dwAP[index],0x80,0xD4,0x01,0x01,0x0D,pinData,0x00,respData,&dwLenr)) != RV_OK)
	{
		AfxMessageBox("Write PIN Failed !");
		return;
	}

	//安装口令重装密钥 标识00 值为0123456789ABCDEF893ADFCEB3233122
    //80 D4 01 00 15 38F0AAFF330123456789ABCDEF893ADFCEB3233122
	//80D401010D3BF0F00133313233343536FFFF
	memcpy(pinData,"\x3B\xF0\xF0\x01\x33\x31\x32\x33\x34\x35\x36\xFF\xFF",0x0D);
	if ((rv = SendCommand(hCardHandle[index],dwAP[index],0x80,0xD4,0x01,0x01,0x0D,pinData,0x00,respData,&dwLenr)) != RV_OK)
	{
		AfxMessageBox("Write SO PIN Failed !");
		return;
	}

	//建立二进制文件 文件标识0001 长度0x10 读写受PIN控制
    //80E00011073D014AF0F0F0FF
	memcpy(pinData,"\x3D\x01\x4A\xF0\xF0\xF0\xFF",7);
	if ((rv = SendCommand(hCardHandle[index],dwAP[index],0x80,0xE0,0x00,0x11,0x07,pinData,0x00,respData,&dwLenr)) != RV_OK)
	{
		AfxMessageBox("Create Pri File Failed !");
		return;
	}

	//80E00026073E0100F0F0F0FF
	memcpy(pinData,"\x3E\x01\x00\xF0\xF0\xF0\xFF",7);
	if ((rv = SendCommand(hCardHandle[index],dwAP[index],0x80,0xE0,0x00,0x26,0x07,pinData,0x00,respData,&dwLenr)) != RV_OK)
	{
		AfxMessageBox("Create Pub File Failed !");
		return;
	}
	
	AfxMessageBox("发卡完毕");
}

void CMtestDlg::OnButton7() 
{
    int rv;
	int i;
	BYTE dwLenr;
	BYTE pinData[260],respData[260],pSOPINdata[8],pPINData[8];
    BYTE ExtAutKey[16],sourData[50],DEST[50];
	BYTE CLA;
	BYTE INS;
	BYTE P1;
	BYTE P2;
	BYTE LC;
	BYTE LE;
	BYTE LeftKey[8];
	BYTE RightKey[8];
	BYTE TempKey[8];
	BYTE MACData[8];
	BYTE InitData[8];
	BYTE Random[8];

    memset(pSOPINdata,0xFF,8);
	memset(pPINData,0xFF,8); 
	
	//	00A40000023F00 选择3F00
	CLA = 0x00;
	INS = 0xA4;
	P1  = 0x00;
	P2  = 0x00;
	LC  = 0x02;
	LE  = 0x00;
	memcpy(pinData,"\x3F\x00",LC);
	rv = SendCommand(hCardHandle[index],dwAP[index],CLA,INS,P1,P2,LC,pinData,LE,respData,&dwLenr);
    if (rv != RV_OK)
    {
		return;
	}
	
	//	00A40000023F01 选择ADF 3F01

	CLA = 0x00;
	INS = 0xA4;
	P1  = 0x00;
	P2  = 0x00;
	LC  = 0x02;
	LE  = 0x00;
	memcpy(pinData,"\x3F\x01",LC);
	rv = SendCommand(hCardHandle[index],dwAP[index],CLA,INS,P1,P2,LC,pinData,LE,respData,&dwLenr);
    if (rv != RV_OK)
    {
		return;
	}
	//	00A40000020001 选择透明文件 0001
	CLA = 0x00;
	INS = 0xA4;
	P1  = 0x00;
	P2  = 0x00;
	LC  = 0x02;
	LE  = 0x00;
	memcpy(pinData,"\x00\x01",LC);
	rv = SendCommand(hCardHandle[index],dwAP[index],CLA,INS,P1,P2,LC,pinData,LE,respData,&dwLenr);
    if (rv != RV_OK)
    {
		return;
	}

    //	00D60000021234 写透明文件,因为没有校验PIN,所以会返回0x6982,代表没有写权限 
	CLA = 0x00;
	INS = 0xD6;
	P1  = 0x00;
	P2  = 0x00;
	LC  = 0x02;
	LE  = 0x00;
    memcpy(pinData,"\x12\x34",LC);
	rv = SendCommand(hCardHandle[index],dwAP[index],CLA,INS,P1,P2,LC,pinData,LE,respData,&dwLenr);

	//	00B0000010 读透明文件,因为没有校验PIN,所以会返回0x6982,代表没有读权限 
	CLA = 0x00;
	INS = 0xB0;
	P1  = 0x00;
	P2  = 0x00;
	LC  = NULL;
	LE  = 0x10;
	rv = SendCommand(hCardHandle[index],dwAP[index],CLA,INS,P1,P2,LC,pinData,LE,respData,&dwLenr);

	//	0020000006313233343536 校验PIN,校验后可以达到透明文件的读权限
	CLA = 0x00;
	INS = 0x20;
	P1  = 0x00;
	P2  = 0x00;
	LC  = 0x06;
	LE  = 0x00;
	memcpy(pinData,"\x31\x32\x33\x34\x35\x36",LC);
	rv = SendCommand(hCardHandle[index],dwAP[index],CLA,INS,P1,P2,LC,pinData,LE,respData,&dwLenr);
    if (rv != RV_OK)
    {
		return;
	}

    //	00D60000021234 写透明文件,因为已经校验过PIN,所以可以写入数据
	CLA = 0x00;
	INS = 0xD6;
	P1  = 0x00;
	P2  = 0x00;
	LC  = 0x02;
	LE  = 0x00;
    memcpy(pinData,"\x12\x34",LC);
	rv = SendCommand(hCardHandle[index],dwAP[index],CLA,INS,P1,P2,LC,pinData,LE,respData,&dwLenr);
    if (rv != RV_OK)
    {
		return;
	}

    //	00B0000010 读透明文件,因为已经校验过PIN,所以会读出数据
	CLA = 0x00;
	INS = 0xB0;
	P1  = 0x00;
	P2  = 0x00;
	LC  = NULL;
	LE  = 0x10;
	rv = SendCommand(hCardHandle[index],dwAP[index],CLA,INS,P1,P2,LC,pinData,LE,respData,&dwLenr);
    if (rv != RV_OK)
    {
		return;
	}

	//	锁死PIN 做法是连续校验错误的PIN 3次
	//  第一次
	CLA = 0x00;
	INS = 0x20;
	P1  = 0x00;
	P2  = 0x00;
	LC  = 0x06;
	LE  = 0x00;
	memcpy(pinData,"\x31\x32\x33\x34\x35\x30",LC);
	rv = SendCommand(hCardHandle[index],dwAP[index],CLA,INS,P1,P2,LC,pinData,LE,respData,&dwLenr);
    //第二次
	CLA = 0x00;
	INS = 0x20;
	P1  = 0x00;
	P2  = 0x00;
	LC  = 0x06;
	LE  = 0x00;
	memcpy(pinData,"\x31\x32\x33\x34\x35\x30",LC);
	rv = SendCommand(hCardHandle[index],dwAP[index],CLA,INS,P1,P2,LC,pinData,LE,respData,&dwLenr);
    //第三次
	CLA = 0x00;
	INS = 0x20;
	P1  = 0x00;
	P2  = 0x00;
	LC  = 0x06;
	LE  = 0x00;
	memcpy(pinData,"\x31\x32\x33\x34\x35\x30",LC);
	rv = SendCommand(hCardHandle[index],dwAP[index],CLA,INS,P1,P2,LC,pinData,LE,respData,&dwLenr);

    //	0020000006313233343536 校验PIN,此时PIN已经锁死,即使校验正确的PIN也会返回0x6983,表示PIN已锁死
	CLA = 0x00;
	INS = 0x20;
	P1  = 0x00;
	P2  = 0x00;
	LC  = 0x06;
	LE  = 0x00;
	memcpy(pinData,"\x31\x32\x33\x34\x35\x36",LC);
	rv = SendCommand(hCardHandle[index],dwAP[index],CLA,INS,P1,P2,LC,pinData,LE,respData,&dwLenr);

	//	重装PIN流程

	//	805E000006000011112222<RP0123456789ABCDEF893ADFCEB3233122> 重装PIN,将PIN解锁并修改为000011112222,PIN标识不变

	memcpy(LeftKey,"\x01\x23\x45\x67\x89\xAB\xCD\xEF",8);
	memcpy(RightKey,"\x89\x3A\xDF\xCE\xB3\x23\x31\x22",8);
	for (i=0;i<8;i++)
	{
		TempKey[i]=LeftKey[i]^RightKey[i];
	}
	memcpy(InitData,"\x00\x00\x00\x00\x00\x00\x00\x00",8);
    MAC(InitData,(unsigned char *)"\x00\x00\x11\x11\x22\x22",6,MACData,TempKey);
	CLA = 0x80;
	INS = 0x5E;
	P1  = 0x00;
	P2  = 0x00;
	LC  = 0x0A;
	LE  = 0x00;
	memcpy(pinData,"\x00\x00\x11\x11\x22\x22",6);
    memcpy(pinData+6,MACData,4);
	rv = SendCommand(hCardHandle[index],dwAP[index],CLA,INS,P1,P2,LC,pinData,LE,respData,&dwLenr);
    if (rv != RV_OK)
    {
		return;
	}

	//	0020000006000011112222 校验PIN,已经将PIN重装为000011112222
	CLA = 0x00;
	INS = 0x20;
	P1  = 0x00;
	P2  = 0x00;
	LC  = 0x06;
	LE  = 0x00;
	memcpy(pinData,"\x00\x00\x11\x11\x22\x22",LC);
	rv = SendCommand(hCardHandle[index],dwAP[index],CLA,INS,P1,P2,LC,pinData,LE,respData,&dwLenr);
    if (rv != RV_OK)
    {
		return;
	}

	//	更新重装密钥流程,重装密钥是可以更新的,但是更新权限受到3F01下主控的控制,必须外部认证后才能达到更新重装密钥的权限
	//	0084000008 取8字节随机数
	CLA = 0x00;
	INS = 0x84;
	P1  = 0x00;
	P2  = 0x00;
	LC  = NULL;
	LE  = 0x08;
	rv = SendCommand(hCardHandle[index],dwAP[index],CLA,INS,P1,P2,LC,pinData,LE,respData,&dwLenr);
    if (rv != RV_OK)
    {
		return;
	}

	//	0082000008<EA57415443484441544154696D65434F53> ,外部认证
    memcpy(Random,respData,8);
	memcpy(ExtAutKey,"\x57\x41\x54\x43\x48\x44\x41\x54\x41\x54\x69\x6D\x65\x43\x4F\x53",16);
	TripleDesEncrypt(Random,DEST,ExtAutKey);
	memcpy(pinData,DEST,8);
	CLA = 0x00;
	INS = 0x82;
	P1  = 0x00;
	P2  = 0x00;
	LC  = 0x08;
	LE  = 0x00;
	memcpy(pinData,DEST,LC);
	rv = SendCommand(hCardHandle[index],dwAP[index],CLA,INS,P1,P2,LC,pinData,LE,respData,&dwLenr);
    if (rv != RV_OK)
    {
		return;
	}

	//	80D438001000000000000000000000000000000000 更新重装密钥为16字节0
    CLA = 0x80;
	INS = 0xD4;
	P1  = 0x38;
	P2  = 0x00;
	LC  = 0x10;
	LE  = 0x00;
	memcpy(pinData,"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00",LC);
	rv = SendCommand(hCardHandle[index],dwAP[index],CLA,INS,P1,P2,LC,pinData,LE,respData,&dwLenr);
    if (rv != RV_OK)
    {
		return;
	}

	//  测试更新后的重装密钥,首先锁死PIN,再解锁
	//	锁死PIN 做法是连续校验错误的PIN 3次
	//  第一次
	CLA = 0x00;
	INS = 0x20;
	P1  = 0x00;
	P2  = 0x00;
	LC  = 0x06;
	LE  = 0x00;
	memcpy(pinData,"\x31\x32\x33\x34\x35\x30",LC);
	rv = SendCommand(hCardHandle[index],dwAP[index],CLA,INS,P1,P2,LC,pinData,LE,respData,&dwLenr);
    //第二次
	CLA = 0x00;
	INS = 0x20;
	P1  = 0x00;
	P2  = 0x00;
	LC  = 0x06;
	LE  = 0x00;
	memcpy(pinData,"\x31\x32\x33\x34\x35\x30",LC);
	rv = SendCommand(hCardHandle[index],dwAP[index],CLA,INS,P1,P2,LC,pinData,LE,respData,&dwLenr);
    //第三次
	CLA = 0x00;
	INS = 0x20;
	P1  = 0x00;
	P2  = 0x00;
	LC  = 0x06;
	LE  = 0x00;
	memcpy(pinData,"\x31\x32\x33\x34\x35\x30",LC);
	rv = SendCommand(hCardHandle[index],dwAP[index],CLA,INS,P1,P2,LC,pinData,LE,respData,&dwLenr);

    //	重装PIN流程

	//	805E000006000011112222<RP0123456789ABCDEF893ADFCEB3233122> 重装PIN,将PIN解锁并修改为001122001122,PIN标识不变

	memcpy(LeftKey,"\x00\x00\x00\x00\x00\x00\x00\x00",8);
	memcpy(RightKey,"\x00\x00\x00\x00\x00\x00\x00\x00",8);
	for (i=0;i<8;i++)
	{
		TempKey[i]=LeftKey[i]^RightKey[i];
	}
	memcpy(InitData,"\x00\x00\x00\x00\x00\x00\x00\x00",8);
    MAC(InitData,(unsigned char *)"\x00\x11\x22\x00\x11\x22",6,MACData,TempKey);
	CLA = 0x80;
	INS = 0x5E;
	P1  = 0x00;
	P2  = 0x00;
	LC  = 0x0A;
	LE  = 0x00;
	memcpy(pinData,"\x00\x11\x22\x00\x11\x22",6);
    memcpy(pinData+6,MACData,4);
	rv = SendCommand(hCardHandle[index],dwAP[index],CLA,INS,P1,P2,LC,pinData,LE,respData,&dwLenr);
    if (rv != RV_OK)
    {
		return;
	}

	//	0020000006000011112222 校验PIN,已经将PIN重装为001122001122
	CLA = 0x00;
	INS = 0x20;
	P1  = 0x00;
	P2  = 0x00;
	LC  = 0x06;
	LE  = 0x00;
	memcpy(pinData,"\x00\x11\x22\x00\x11\x22",LC);
	rv = SendCommand(hCardHandle[index],dwAP[index],CLA,INS,P1,P2,LC,pinData,LE,respData,&dwLenr);
    if (rv != RV_OK)
    {
		return;
	}
	
	//	修改PIN
	//	805E01000D001122001122FF112233445566
    CLA = 0x80;
	INS = 0x5E;
	P1  = 0x01;
	P2  = 0x00;
	LC  = 0x0D;
	LE  = 0x00;
	memcpy(pinData,"\x00\x11\x22\x00\x11\x22\xFF\x11\x22\x33\x44\x55\x66",LC);
	rv = SendCommand(hCardHandle[index],dwAP[index],CLA,INS,P1,P2,LC,pinData,LE,respData,&dwLenr);
    if (rv != RV_OK)
    {
		return;
	}

	//	0020000006000011112222 校验PIN,已经将PIN修改为112233445566
	CLA = 0x00;
	INS = 0x20;
	P1  = 0x00;
	P2  = 0x00;
	LC  = 0x06;
	LE  = 0x00;
	memcpy(pinData,"\x11\x22\x33\x44\x55\x66",LC);
	rv = SendCommand(hCardHandle[index],dwAP[index],CLA,INS,P1,P2,LC,pinData,LE,respData,&dwLenr);
    if (rv != RV_OK)
    {
		return;
	}

	AfxMessageBox("测试完毕");
}

void CMtestDlg::OnButton8() 
{
    char buf[200];
	unsigned char ii=0;
	cByte=32;
	cch=0;
    
	dwState=0;
	
	lReturn = SCardStatus(hCardHandle[index],
                      NULL,
                      &cch,
                      &dwState,
                      &dwProtocol,
                      bAttr,
                      &cByte);     //get the status of a smart card in a reader
	if ( SCARD_S_SUCCESS != lReturn )
	{

			char data[50];
			data[0]=0;
           
			strcpy(data,"status:");
			sprintf(buf,"%08X \n", dwState);
			strcat(data,buf);
	
	 	    MessageBox(data,"",MB_OK);
	}
	else
	{
            if(bAttr[4] == 0x57 && bAttr[5] == 0x44 && bAttr[6] == 0x28 && bAttr[7] == 0x2A)
			{ 
                AfxMessageBox("此卡片为握奇卡片");
			}
			else
			{
			    AfxMessageBox("此卡片非握奇卡片");
			}

	}
}

⌨️ 快捷键说明

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