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

📄 smartcarddlg.cpp

📁 智能卡密钥加密
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// smartcardDlg.cpp : implementation file
//

#include "stdafx.h"
#include "smartcard.h"
#include "smartcardDlg.h"
#include "dcic32.h"
#include "HDSSSE32.h"
#include "SSSE32.h"
#include "cpu.h"
#include "des.h"
#include "SendCmd.h"


#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CAboutDlg dialog used for App About


class CAboutDlg : public CDialog
{
public:
	CAboutDlg();
	
	// Dialog Data
	//{{AFX_DATA(CAboutDlg)
	enum { IDD = IDD_ABOUTBOX };
	//}}AFX_DATA
	
	// ClassWizard generated virtual function overrides
	//{{AFX_VIRTUAL(CAboutDlg)
protected:
	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
	//}}AFX_VIRTUAL
	
	// Implementation
protected:
	//{{AFX_MSG(CAboutDlg)
	//}}AFX_MSG
	DECLARE_MESSAGE_MAP()
};

CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
	//{{AFX_DATA_INIT(CAboutDlg)
	//}}AFX_DATA_INIT
}

void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CAboutDlg)
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
//{{AFX_MSG_MAP(CAboutDlg)
// No message handlers
//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CSmartcardDlg dialog

CSmartcardDlg::CSmartcardDlg(CWnd* pParent /*=NULL*/)
: CDialog(CSmartcardDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CSmartcardDlg)
	m_reader = _T("");
	m_name = _T("");
	m_sex = _T("");
	m_date = _T("");
	m_id = _T("");
	m_cardno = _T("");
	m_pcno = _T("");
	//}}AFX_DATA_INIT
	// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CSmartcardDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CSmartcardDlg)
	DDX_Control(pDX, IDC_COMBO2, m_readercnt);
	DDX_CBString(pDX, IDC_COMBO2, m_reader);
	DDX_Text(pDX, IDC_EDIT1, m_name);
	DDX_Text(pDX, IDC_EDIT2, m_sex);
	DDX_Text(pDX, IDC_EDIT6, m_date);
	DDX_Text(pDX, IDC_EDIT5, m_id);
	DDX_Text(pDX, IDC_EDIT3, m_cardno);
	DDX_Text(pDX, IDC_EDIT4, m_pcno);
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CSmartcardDlg, CDialog)
//{{AFX_MSG_MAP(CSmartcardDlg)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_BUTTON1, OnButton1)
ON_BN_CLICKED(IDC_BUTTON3, OnButton3)
ON_BN_CLICKED(IDC_BUTTON2, OnButton2)
ON_BN_CLICKED(IDC_BUTTON4, OnButton4)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CSmartcardDlg message handlers

BOOL CSmartcardDlg::OnInitDialog()
{
	CDialog::OnInitDialog();
	
	// Add "About..." menu item to system menu.
	
	// IDM_ABOUTBOX must be in the system command range.
	ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
	ASSERT(IDM_ABOUTBOX < 0xF000);
	
	CMenu* pSysMenu = GetSystemMenu(FALSE);
	if (pSysMenu != NULL)
	{
		CString strAboutMenu;
		strAboutMenu.LoadString(IDS_ABOUTBOX);
		if (!strAboutMenu.IsEmpty())
		{
			pSysMenu->AppendMenu(MF_SEPARATOR);
			pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
		}
	}
	
	// Set the icon for this dialog.  The framework does this automatically
	//  when the application's main window is not a dialog
	SetIcon(m_hIcon, TRUE);			// Set big icon
	SetIcon(m_hIcon, FALSE);		// Set small icon
	
	// TODO: Add extra initialization here
	
	return TRUE;  // return TRUE  unless you set the focus to a control
}

void CSmartcardDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
	if ((nID & 0xFFF0) == IDM_ABOUTBOX)
	{
		CAboutDlg dlgAbout;
		dlgAbout.DoModal();
	}
	else
	{
		CDialog::OnSysCommand(nID, lParam);
	}
}

// If you add a minimize button to your dialog, you will need the code below
//  to draw the icon.  For MFC applications using the document/view model,
//  this is automatically done for you by the framework.

void CSmartcardDlg::OnPaint() 
{
	if (IsIconic())
	{
		CPaintDC dc(this); // device context for painting
		
		SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
		
		// Center icon in client rectangle
		int cxIcon = GetSystemMetrics(SM_CXICON);
		int cyIcon = GetSystemMetrics(SM_CYICON);
		CRect rect;
		GetClientRect(&rect);
		int x = (rect.Width() - cxIcon + 1) / 2;
		int y = (rect.Height() - cyIcon + 1) / 2;
		
		// Draw the icon
		dc.DrawIcon(x, y, m_hIcon);
	}
	else
	{
		CDialog::OnPaint();
	}
}

// The system calls this to obtain the cursor to display while the user drags
//  the minimized window.
HCURSOR CSmartcardDlg::OnQueryDragIcon()
{
	return (HCURSOR) m_hIcon;
}

void CSmartcardDlg::OnButton1() 
{
	// TODO: Add your control notification handler code here
	char dev_Name[10] = {'A','U','T','O'};
	
	int nIndex = m_readercnt.GetCurSel(); //GetCurSel() 函数:用以得到用户选中下拉列表框中数据的索引值.返回的值是重0开始的,如果没有选择任何选项将会返回-1
	m_readercnt.GetLBText(nIndex,m_reader); //其原型为void GetLBText( int nIndex, CString&rString ).nIndex为列表框中数据的索引值,rString 为字符串,其作用就是把索引号为nIndex的数据放到rString变量中.与其对应的GetLBTextLen(intnIndex)函数就是得到索引号为nIndex中数据的长度
	
	//判断读卡器类型
	if(m_reader=="德卡")
	{
		theApp.m_readerType=1;
	}
	
	else if(m_reader=="明华")
	{
		theApp.m_readerType=2;
	}
	
	else if(m_reader=="华大")
	{
		theApp.m_readerType=3;
	}
	
	
	//打开读卡器
	if(theApp.m_readerType == 1)
	{
		theApp.icdev = IC_InitComm(100);
		
		if (int(theApp.icdev) >0)
		{
			AfxMessageBox("打开德卡读卡器成功!");
		}
		
		else
		{
			AfxMessageBox("打开德卡读卡器失败!");
		}
		
	}
	else if(theApp.m_readerType == 2)
	{
		theApp.HandleReader1 = ICC_Reader_Open(dev_Name);
		
		if(theApp.HandleReader1 > 0)
		{
			AfxMessageBox("打开明华读卡器成功!");
		}
		
		else
		{
			AfxMessageBox("打开明华读卡器失败!");
		}
		
	}
	else if(theApp.m_readerType == 3)
	{
		theApp.HandleReader2 = icc_reader_Open(dev_Name);
		
		if(theApp.HandleReader2 >= 0)
		{
			AfxMessageBox("打开华大读卡器成功!");
		}
		
		else
		{
			AfxMessageBox("打开华大读卡器失败!");
		}
		
		
	}
	else
	{
		AfxMessageBox("未找到读卡器!"); 
	}
	
	
	
}

void CSmartcardDlg::OnButton3() 
{
	// TODO: Add your control notification handler code here
	int st;
	
	if(theApp.m_readerType == 1)
	{
		st = IC_ExitComm(theApp.icdev);
		
		if(st == 0)
		{
			AfxMessageBox("关闭德卡读卡器成功!"); 
		}
		else
		{
			AfxMessageBox("关闭德卡读卡器失败!"); 
		}
	}
	else if(theApp.m_readerType == 2)
	{
		if(theApp.HandleReader1 > 0)
		{
			ICC_Reader_Close(theApp.HandleReader1);
			
			AfxMessageBox("关闭明华读卡器成功!"); 
		}
		else
		{
			AfxMessageBox("关闭明华读卡器失败!"); 
		}
		
	}
	else if(theApp.m_readerType == 3)
	{
		if(theApp.HandleReader2 >= 0)
		{
			icc_reader_Close(theApp.HandleReader2);
			
			AfxMessageBox("关闭华大读卡器成功!"); 
		}
		else
		{
			AfxMessageBox("关闭华大读卡器失败!"); 
		}
	}
	
}

void CSmartcardDlg::OnButton2() 
{
	// TODO: Add your control notification handler code here
	int st;
	unsigned char resp[512];
	unsigned char resplen;
	unsigned char cmd[260];
	unsigned char name[20];                    //姓名            
	unsigned char sex[5];                      //性别
	unsigned char id[20];                      //身份证号
	unsigned char date[10];                    //发卡日期
	unsigned char date_asc[20];
	unsigned char card_num[20];                //医疗证号
    unsigned char pc_num[20];                  //电脑号
	unsigned int cmdlen;
	unsigned int sw1sw2;
	WORD SW1SW2;
	long ST;
	long resplength;
	
	UpdateData(TRUE);
	
	if(theApp.m_readerType == 1)                       //选择的是德卡读卡器
	{
		//选择主卡座(用户卡)
		st = IC_InitType(theApp.icdev, CardSet_User);
		if (st < 0)
		{
			AfxMessageBox("选择卡座类型失败");
		}
		
		//卡片复位(用户卡)
		st=IC_CpuReset(theApp.icdev, &resplen, resp);
		if (st < 0)
		{
			AfxMessageBox("卡复位失败");
		} 
		
		//============================读数据====================================
		//选文件MF (用户卡)
		cmdlen = 0x07;
		memcpy(cmd, "\x00\xA4\x00\x00\x02\x3f\x00", cmdlen);
		sw1sw2 = SendCmd(theApp.icdev, CardSet_User, cmd,cmdlen, resp, &resplen);
		if (sw1sw2 != 0x9000)
		{
			AfxMessageBox("选择文件MF失败");
		}
		
		//选文件DDF1(用户卡)
		cmdlen = 0x07;
		memcpy(cmd, "\x00\xA4\x00\x00\x02\xdd\xf1", cmdlen);
		sw1sw2 = SendCmd(theApp.icdev, CardSet_User, cmd,cmdlen, resp, &resplen);
		if (sw1sw2 != 0x9000)
		{
			AfxMessageBox("选择文件DDF1失败");
		}
		
		//选文件EF05
		cmdlen = 0x07;
		memcpy(cmd, "\x00\xA4\x00\x00\x02\xEF\x05", cmdlen);
		sw1sw2 = SendCmd(theApp.icdev, CardSet_User, cmd,cmdlen, resp, &resplen);
		
		if (sw1sw2 != 0x9000)
		{
			AfxMessageBox("选择文件EF06失败");
		}
		
		//读记录 DDF1.EF05.05(用户卡)      发卡日期
		cmdlen = 0x05;
		memcpy(cmd, "\x00\xB2\x05\x04\x06", cmdlen);
		sw1sw2 = SendCmd(theApp.icdev, CardSet_User, cmd,cmdlen, resp, &resplen);
		
		if (sw1sw2 != 0x9000)
		{
			AfxMessageBox("读取发卡日期失败");
		}
		
		else
		{
			//获得读出的数据
			memcpy(date,resp+2,resplen-2);
			
			HexToAscii(date,date_asc,resplen-2);
			
			date_asc[(resplen-2)*2] = 0x00;
			
			m_date.Format("%s",date_asc);
		}
		
		//选文件MF (用户卡)
		cmdlen = 0x07;
		memcpy(cmd, "\x00\xA4\x00\x00\x02\x3f\x00", cmdlen);
		sw1sw2 = SendCmd(theApp.icdev, CardSet_User, cmd,cmdlen, resp, &resplen);
		if (sw1sw2 != 0x9000)
		{
			AfxMessageBox("选择文件MF失败");
		}
		
		//选文件DDF1(用户卡)
		cmdlen = 0x07;
		memcpy(cmd, "\x00\xA4\x00\x00\x02\xdd\xf1", cmdlen);
		sw1sw2 = SendCmd(theApp.icdev, CardSet_User, cmd,cmdlen, resp, &resplen);
		if (sw1sw2 != 0x9000)
		{
			AfxMessageBox("选择文件DDF1失败");
		}
		
		//选文件EF06
		cmdlen = 0x07;
		memcpy(cmd, "\x00\xA4\x00\x00\x02\xEF\x06", cmdlen);
		sw1sw2 = SendCmd(theApp.icdev, CardSet_User, cmd,cmdlen, resp, &resplen);
		
		if (sw1sw2 != 0x9000)
		{
			AfxMessageBox("选择文件EF06失败");
		}
		
		//读记录 DDF1.EF06.02(用户卡)      姓名
		cmdlen = 0x05;
		memcpy(cmd, "\x00\xB2\x02\x04\x20", cmdlen);
		sw1sw2 = SendCmd(theApp.icdev, CardSet_User, cmd,cmdlen, resp, &resplen);
		
		if(sw1sw2 != 0x9000)
		{
			AfxMessageBox("读取姓名失败");
		}
        else
		{
			memcpy(name,resp+2,resplen-2);
			
			name[resplen-2] = 0x00;
			
			m_name.Format("%s",name);
		}
		
		
		//读记录 DDF1.EF06.03(用户卡)      性别
		cmdlen = 0x05;
		memcpy(cmd, "\x00\xB2\x03\x04\x03", cmdlen);
		sw1sw2 = SendCmd(theApp.icdev, CardSet_User, cmd,cmdlen, resp, &resplen);
		
		if (sw1sw2 != 0x9000)
		{
			AfxMessageBox("读取姓名失败");
		}
		else
		{
			memcpy(sex,resp+2,resplen-2);
			
			if(sex[0x00] == 0x31)
			{
				m_sex.Format("%s","男");			
			}
			
			else if(sex[0x00] == 0x32)
			{
				m_sex.Format("%s","女");
			}
		}
		
		//读记录 DDF1.EF06.01(用户卡)      公民身份号码
		cmdlen = 0x05;
		memcpy(cmd, "\x00\xB2\x01\x04\x14", cmdlen);
		sw1sw2 = SendCmd(theApp.icdev, CardSet_User, cmd,cmdlen, resp, &resplen);
		
		if (sw1sw2 != 0x9000)
		{
			AfxMessageBox("读取身份证号失败");
		}
		
		else
		{
			//获得读出的数据
			memcpy(id,resp+2,resplen-2);
			
			id[resplen-2] = 0x00;
			
			m_id.Format("%s",id);
		}
		
		//============================读数据====================================
		//选文件MF (用户卡)
		cmdlen = 0x07;
		memcpy(cmd, "\x00\xA4\x00\x00\x02\x3f\x00", cmdlen);
		sw1sw2 = SendCmd(theApp.icdev, CardSet_User, cmd,cmdlen, resp, &resplen);
		if (sw1sw2 != 0x9000)
		{
			AfxMessageBox("选择文件MF失败");
		}
		
		//选文件DDF1(用户卡)
		cmdlen = 0x07;
		memcpy(cmd, "\x00\xA4\x00\x00\x02\xdd\xf1", cmdlen);
		sw1sw2 = SendCmd(theApp.icdev, CardSet_User, cmd,cmdlen, resp, &resplen);
		if (sw1sw2 != 0x9000)
		{
			AfxMessageBox("选择文件DDF1失败");
		}
		
		//用户卡校验密码 (用户卡)
		cmdlen = 0x08;
		memcpy(cmd, "\x00\x20\x00\x00\x03\x12\x34\x56", cmdlen);
		sw1sw2 = SendCmd(theApp.icdev, CardSet_User, cmd,cmdlen, resp, &resplen);
		if (sw1sw2 != 0x9000)
		{
			switch(sw1sw2) 
			{
			case 0x63c3:
				AfxMessageBox("还有三次重新输入密码机会");
				break;
			case 0x63c2:
				AfxMessageBox("还有二次重新输入密码机会");
				break;
			case 0x63c1:
				AfxMessageBox("还有一次重新输入密码机会");
				break;
			case 0x63c0:
				AfxMessageBox("再输入错误认证会导致锁定");
				break;
			default:
				AfxMessageBox("认证锁定");
			}
		}
		
		//选文件DF04
		cmdlen = 0x07;
		memcpy(cmd, "\x00\xA4\x00\x00\x02\xDF\x04", cmdlen);
		sw1sw2 = SendCmd(theApp.icdev, CardSet_User, cmd,cmdlen, resp, &resplen);
		
		if (sw1sw2 != 0x9000)
		{
			AfxMessageBox("选择文件DF04失败");
		}
		
		//选文件EF05
		cmdlen = 0x07;
		memcpy(cmd, "\x00\xA4\x00\x00\x02\xEF\x05", cmdlen);
		sw1sw2 = SendCmd(theApp.icdev, CardSet_User, cmd,cmdlen, resp, &resplen);
		
		if (sw1sw2 != 0x9000)
		{
			AfxMessageBox("选择文件EF05失败");
		}
		

⌨️ 快捷键说明

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