使用VB呼叫WinScard.DLL執行二代金融卡Smart Card command |
|
sockman
一般會員 發表:24 回覆:29 積分:10 註冊:2003-03-17 發送簡訊給我 |
在使用VB呼叫使用Windows的WinScard.DLL Library時請先安裝Windows Smart Card ToolKit其中範例中附有scardapi.bas及scardErr.bas二個Module將其inclure至VB的專案中!若是想以BCB來呼叫使用的話必須先以BCB的implib.exe這個tool先將Winscard.DLL產生的.Lib檔include進來即可! 在VB使用上需要將command轉換為Smart Card之APDU Command,轉譯的Function如下! Public Function APDUTransmit(ByRef bytCMDarray() As Byte, ByVal CMDLen As Long, ByVal phCard As Long) As SCARD_T1_RESPONSE
Dim retValue As Long
Dim recPCI As SCARD_IO_REQUEST
Dim retBuf(0 To 254) As Byte
Dim retBufLen As Long
Dim i As Integer
retBufLen = 254
recPCI.dwProtocol = SCARD_PROTOCOL_T1
recPCI.dbPciLength = Len(recPCI)
retValue = SCardTransmit(phCard, recPCI, bytCMDarray(0), CMDLen, recPCI, retBuf(0), retBufLen)
If retValue <> 0 Then
Exit Function
End If
If retBufLen = 2 Then
ReDim APDUTransmit.bytRData(retBufLen) As Byte
APDUTransmit.SW1 = retBuf(0)
APDUTransmit.SW2 = retBuf(1)
APDUTransmit.bytRDataLen = 0
Else
ReDim APDUTransmit.bytRData(retBufLen - 3)
APDUTransmit.bytRDataLen = retBufLen - 2
For i = 0 To retBufLen - 2 - 1
APDUTransmit.bytRData(i) = retBuf(i)
Next
APDUTransmit.SW1 = retBuf(i)
APDUTransmit.SW2 = retBuf(i 1)
End If
APDUTransmit.bytRetValue = retValue
End Function 接下來介紹如何連結卡機及Smart Card並讀取二代金融卡卡片序號 1.首先開啟Smart Card Service 在Global定義Smart Card context及handle
Dim ScardContext As Long
Dim phCard1 As Long Private Sub Form_Load() Dim retValue As Long retValue = SCardEstablishContext(SCARD_SCOPE_USER, lngNull, lngNull, ScardContext)
If retValue <> 0 Then
MsgBox "智慧卡元件啟動失敗, 程式將關閉", vbCritical, "智慧卡服務錯誤"
Exit Sub
End If
End Sub 2.取得目前卡機名稱 Private Sub Form_Load()
Dim retValue As Long
Dim lstReaders As String
Dim lngReaderLen As Long
Dim ReaderCnt As Integer
Dim ReaderArry() As String
Dim hContext As Long
Dim i As Integer
'取得Reader Name
lstReaders = String(256, vbNullChar)
lngReaderLen = Len(String(256, vbNullChar))
retValue = SCardListReadersA(hContext, vbNullChar, lstReaders, lngReaderLen)
ReaderArry = ParseMultistring(lstReaders, ReaderCnt)
If (ReaderCnt = 0) Then
MsgBox "no reader is available", vbExclamation, "error"
End If
For i = 0 To ReaderCnt - 1
ComboReader1.List(i) = ReaderArry(i)
Next End Sub 3.將卡機名稱存入ini File中 Private Sub cmdOK_Click()
Dim ret As Long ret = WritePrivateProfileString("Reader", "ICC", ComboReader1.Text, App.Path & "\Setup.ini")
End Sub 4.與卡片連線 Privite Sub Command1_Click()
Dim retData As SCARD_T1_RESPONSE
Dim retValue As Long
Dim ret As Long ret = GetPrivateProfileString("Reader", "ICC", App.Path & "\" & "Setup.ini", DataBuffer, Len(DataBuffer), App.Path & "\" & "Setup.ini")
ICCReader = Left$(DataBuffer, ret)
retValue = SCardConnectA(ScardContext, ICCReader, SCARD_SHARE_SHARED, SCARD_PROTOCOL_T1, phCard1, Activepro)
If retValue <> 0 Then
StatusBar1.Panels(2).Text = "子卡連線失敗"
Exit Sub
End If
End Sub 與卡片連線後取得Handle為phCard1 5.讀取卡片序號 Privite Sub Command2_Click() Dim retData As SCARD_T1_RESPONSE
Dim retValue As Long
Dim ret As Long 'Get Chip ID
retData = GetCID(phCard1)
If retData.SW1 <> &H90 Then
StatusBar1.Panels(2).Text = "Get CID 錯誤"
MsgBox "Get CID Fail!", vbCritical, "警告"
Exit Sub
End If
ReDim bytSNR(retData.bytRDataLen - 1) As Byte
For i = 0 To retData.bytRDataLen - 1
bytSNR(i) = retData.bytRData(i)
Next End Sub Public Function GetCID(ByVal phCard As Long) As SCARD_T1_RESPONSE Dim bytArray(4) As Byte
Dim bytArrayLen As Long
Dim T1_response As SCARD_T1_RESPONSE
bytArrayLen = 5
bytArray(0) = &H0
bytArray(1) = &HB0
bytArray(2) = &H0
bytArray(3) = &H4
bytArray(4) = &H8
T1_response = APDUTransmit(bytArray, bytArrayLen, phCard)
GetCID = T1_response
End Function 當執行GetCID回應的Smart Card T1 Response之SW1及SW2為 &H9000時即為成功
並將結果存入bytSNR Array中,其中二代金融卡的命令需參閱二代晶片金融卡規
格囉! 以上是簡單的使用WinScard.DLL執行對二代晶片金融卡讀取序號範例!
|
bio
一般會員 發表:42 回覆:36 積分:20 註冊:2003-03-05 發送簡訊給我 |
|
sockman
一般會員 發表:24 回覆:29 積分:10 註冊:2003-03-17 發送簡訊給我 |
|
orson
中階會員 發表:5 回覆:135 積分:58 註冊:2002-07-11 發送簡訊給我 |
|
sockman
一般會員 發表:24 回覆:29 積分:10 註冊:2003-03-17 發送簡訊給我 |
|
shing.net
中階會員 發表:207 回覆:124 積分:66 註冊:2002-03-16 發送簡訊給我 |
請問若使用Delphi開發,應該如何實做?
謝謝
引言: 在使用VB呼叫使用Windows的WinScard.DLL Library時請先安裝Windows Smart Card ToolKit其中範例中附有scardapi.bas及scardErr.bas二個Module將其inclure至VB的專案中!若是想以BCB來呼叫使用的話必須先以BCB的implib.exe這個tool先將Winscard.DLL產生的.Lib檔include進來即可! 在VB使用上需要將command轉換為Smart Card之APDU Command,轉譯的Function如下!Public Function APDUTransmit(ByRef bytCMDarray() As Byte, ByVal CMDLen As Long, ByVal phCard As Long) As SCARD_T1_RESPONSE Dim retValue As Long Dim recPCI As SCARD_IO_REQUEST Dim retBuf(0 To 254) As Byte Dim retBufLen As Long Dim i As Integer retBufLen = 254 recPCI.dwProtocol = SCARD_PROTOCOL_T1 recPCI.dbPciLength = Len(recPCI) retValue = SCardTransmit(phCard, recPCI, bytCMDarray(0), CMDLen, recPCI, retBuf(0), retBufLen) If retValue <> 0 Then Exit Function End If If retBufLen = 2 Then ReDim APDUTransmit.bytRData(retBufLen) As Byte APDUTransmit.SW1 = retBuf(0) APDUTransmit.SW2 = retBuf(1) APDUTransmit.bytRDataLen = 0 Else ReDim APDUTransmit.bytRData(retBufLen - 3) APDUTransmit.bytRDataLen = retBufLen - 2 For i = 0 To retBufLen - 2 - 1 APDUTransmit.bytRData(i) = retBuf(i) Next APDUTransmit.SW1 = retBuf(i) APDUTransmit.SW2 = retBuf(i 1) End If APDUTransmit.bytRetValue = retValue End Function 接下來介紹如何連結卡機及Smart Card並讀取二代金融卡卡片序號 1.首先開啟Smart Card Service 在Global定義Smart Card context及handle Dim ScardContext As Long Dim phCard1 As Long Private Sub Form_Load() Dim retValue As Long retValue = SCardEstablishContext(SCARD_SCOPE_USER, lngNull, lngNull, ScardContext) If retValue <> 0 Then MsgBox "智慧卡元件啟動失敗, 程式將關閉", vbCritical, "智慧卡服務錯誤" Exit Sub End If End Sub 2.取得目前卡機名稱 Private Sub Form_Load() Dim retValue As Long Dim lstReaders As String Dim lngReaderLen As Long Dim ReaderCnt As Integer Dim ReaderArry() As String Dim hContext As Long Dim i As Integer '取得Reader Name lstReaders = String(256, vbNullChar) lngReaderLen = Len(String(256, vbNullChar)) retValue = SCardListReadersA(hContext, vbNullChar, lstReaders, lngReaderLen) ReaderArry = ParseMultistring(lstReaders, ReaderCnt) If (ReaderCnt = 0) Then MsgBox "no reader is available", vbExclamation, "error" End If For i = 0 To ReaderCnt - 1 ComboReader1.List(i) = ReaderArry(i) Next End Sub 3.將卡機名稱存入ini File中 Private Sub cmdOK_Click() Dim ret As Long ret = WritePrivateProfileString("Reader", "ICC", ComboReader1.Text, App.Path & "\Setup.ini") End Sub 4.與卡片連線 Privite Sub Command1_Click() Dim retData As SCARD_T1_RESPONSE Dim retValue As Long Dim ret As Long ret = GetPrivateProfileString("Reader", "ICC", App.Path & "\" & "Setup.ini", DataBuffer, Len(DataBuffer), App.Path & "\" & "Setup.ini") ICCReader = Left$(DataBuffer, ret) retValue = SCardConnectA(ScardContext, ICCReader, SCARD_SHARE_SHARED, SCARD_PROTOCOL_T1, phCard1, Activepro) If retValue <> 0 Then StatusBar1.Panels(2).Text = "子卡連線失敗" Exit Sub End If End Sub 與卡片連線後取得Handle為phCard1 5.讀取卡片序號 Privite Sub Command2_Click() Dim retData As SCARD_T1_RESPONSE Dim retValue As Long Dim ret As Long 'Get Chip ID retData = GetCID(phCard1) If retData.SW1 <> &H90 Then StatusBar1.Panels(2).Text = "Get CID 錯誤" MsgBox "Get CID Fail!", vbCritical, "警告" Exit Sub End If ReDim bytSNR(retData.bytRDataLen - 1) As Byte For i = 0 To retData.bytRDataLen - 1 bytSNR(i) = retData.bytRData(i) Next End Sub Public Function GetCID(ByVal phCard As Long) As SCARD_T1_RESPONSE Dim bytArray(4) As Byte Dim bytArrayLen As Long Dim T1_response As SCARD_T1_RESPONSE bytArrayLen = 5 bytArray(0) = &H0 bytArray(1) = &HB0 bytArray(2) = &H0 bytArray(3) = &H4 bytArray(4) = &H8 T1_response = APDUTransmit(bytArray, bytArrayLen, phCard) GetCID = T1_response End Function當執行GetCID回應的Smart Card T1 Response之SW1及SW2為 &H9000時即為成功 並將結果存入bytSNR Array中,其中二代金融卡的命令需參閱二代晶片金融卡規 格囉! 以上是簡單的使用WinScard.DLL執行對二代晶片金融卡讀取序號範例! |
sockman
一般會員 發表:24 回覆:29 積分:10 註冊:2003-03-17 發送簡訊給我 |
|
SFIC
一般會員 發表:0 回覆:2 積分:0 註冊:2005-04-15 發送簡訊給我 |
|
sockman
一般會員 發表:24 回覆:29 積分:10 註冊:2003-03-17 發送簡訊給我 |
引言: 拜讀sockman 之文章獲益良多! 1.若為COMBO卡則有錯誤(2/18 orson 的回應可能是在講這種信用卡與金融卡合一之COMBO卡) 2.FISCII Command Set 要去哪裡找? 謝謝!1. Combo卡也有分Protocal T=0 和 T=1的..要先知道是它是T=0還是T=1的卡片 這個時候FISCII和信用卡部分都是以Applet的形式存在於卡片中,因此若要 使用FISCII的部分時要先Select FISCII Applet 2. 金資中心有在賣它的Spec吧請參考http://www.fisc.com.tw,但是好像只限認証過的廠商,但是簡單的一些Select EF,Select DF,Read...etc的command和ISO7816的大部分都相同! FISCII大部分的一些Command我己寫在此範例中的ActiveX Component了 http://delphi.ktop.com.tw/topic.php?TOPIC_ID=67092 |
SFIC
一般會員 發表:0 回覆:2 積分:0 註冊:2005-04-15 發送簡訊給我 |
|
orson
中階會員 發表:5 回覆:135 積分:58 註冊:2002-07-11 發送簡訊給我 |
引言: 拜讀sockman 之文章獲益良多! 1.若為COMBO卡則有錯誤(2/18 orson 的回應可能是在講這種信用卡與金融卡合一之COMBO卡) 2.FISCII Command Set 要去哪裡找? 謝謝!沒錯 我說的是combo card。所以在應用層,你沒有先做Select File的話,保證不行。 在EMV的規格裡面有提到,我記得FISC的規格也有提到。 這是我是用DELPHI直接操作PC/SC(改國外的元件),的時候,玩出來的。 金融卡的卡號,我記得有兩個地方有紀錄。是TEXT,其中一個應該是user field 1。 很久沒完了,忘光了。 Orson |
sockman
一般會員 發表:24 回覆:29 積分:10 註冊:2003-03-17 發送簡訊給我 |
引言:1.其實我最熟的部分也只有金融卡部分,再來就是SLE4442這類的Memory card了..其餘的CPU卡我也都不熟,因為畢竟卡片太多了,其實還有Open Platform等等的卡片各家作的都不一樣!信用卡的部分的話您可能必須要取得文件,不管是VISA還是Master它的資料都是以Template中tag的方式儲存,也就是說Select信用卡的Applet之後讀出來的file都是以Template包tag的方式儲存!下次我再弄個範例上來好了!因為手邊現在沒卡片! 2.二代金融卡的帳號是放在EF 1001這個檔案中Record 3,讀出來的應為16 byte的資料其帳號以ASCII方式儲存,例如帳號為1234..則存31323334引言:1.我想發展的是將晶片卡之金融卡帳號或信用卡卡號讀出,現除了sockman所教的單純金融卡會了以外其餘皆不知如何著手,不知是否能賜教! 2.按上述程式所讀出之8 bytes HEX碼又如何轉成一般之金融卡帳號? 3.sockman建議之文章範例之前便已拜讀,依其價值若該元件要販賣一點都不為過;我曾花了點時間在網路(國內外)搜尋晶片卡之參考,就屬您之文章最實用。不過因目前之需求較簡單,所以可能的話還是直接寫這部分之控制程式便足夠了。引言:恕刪 |
shing.net
中階會員 發表:207 回覆:124 積分:66 註冊:2002-03-16 發送簡訊給我 |
|
sockman
一般會員 發表:24 回覆:29 積分:10 註冊:2003-03-17 發送簡訊給我 |
|
sockman
一般會員 發表:24 回覆:29 積分:10 註冊:2003-03-17 發送簡訊給我 |
>
>您好.我有下載了範例.那是銀行的卡資訊讀取.
>但是我讀自然人憑證他說1001FULL
>請問有"讀自然人憑證的序號基本資料"範例嗎??
>我找好久試好久都不行.拜託幫我謝謝 回答一下很多人問的問題! 你必須要取得中華電信的API..裡面有包含自然人憑證的APDU command
但是不是完全都有我不能確定因為它有所謂的標準版,
所以要讀取序號必須要知道它的Command怎麼下的
因為它是RSA加密法的卡片,它具有憑證及資料加密的功能
不過API要至內政部自然人憑證中心下載..很麻煩..還要註冊及簽保密合約
相關網址請參考 http://moica.nat.gov.tw/html/cover05_02.htm
使用.Net對自然人憑證的應用範例 http://www.flaginfo.com.tw/runpc/download/200410/129P210.txt
此範例並未使用APDU Command因此不需要使用中華電信的API 發表人 - sockman 於 2005/05/16 09:54:54
|
raincaller
一般會員 發表:0 回覆:2 積分:0 註冊:2005-01-22 發送簡訊給我 |
引言: 不知大家有沒有用java寫的範例可以參考 包括自然人憑證與sockman大大拋磚引玉的二代金融卡讀卡程式 > >您好.我有下載了範例.那是銀行的卡資訊讀取. >但是我讀自然人憑證他說1001FULL >請問有"讀自然人憑證的序號基本資料"範例嗎?? >我找好久試好久都不行.拜託幫我謝謝 回答一下很多人問的問題! 你必須要取得中華電信的API..裡面有包含自然人憑證的APDU command 但是不是完全都有我不能確定因為它有所謂的標準版, 所以要讀取序號必須要知道它的Command怎麼下的 因為它是RSA加密法的卡片,它具有憑證及資料加密的功能 不過API要至內政部自然人憑證中心下載..很麻煩..還要註冊及簽保密合約 相關網址請參考 http://moica.nat.gov.tw/html/cover05_02.htm 使用.Net對自然人憑證的應用範例 http://www.flaginfo.com.tw/runpc/download/200410/129P210.txt 此範例並未使用APDU Command因此不需要使用中華電信的API 發表人 - sockman 於 2005/05/16 09:54:54 |
raincaller
一般會員 發表:0 回覆:2 積分:0 註冊:2005-01-22 發送簡訊給我 |
引言:引言: 不知大家有沒有用java寫的範例可以參考 包括自然人憑證與sockman大大拋磚引玉的二代金融卡讀卡程式 > >您好.我有下載了範例.那是銀行的卡資訊讀取. >但是我讀自然人憑證他說1001FULL >請問有"讀自然人憑證的序號基本資料"範例嗎?? >我找好久試好久都不行.拜託幫我謝謝 回答一下很多人問的問題! 你必須要取得中華電信的API..裡面有包含自然人憑證的APDU command 但是不是完全都有我不能確定因為它有所謂的標準版, 所以要讀取序號必須要知道它的Command怎麼下的 因為它是RSA加密法的卡片,它具有憑證及資料加密的功能 不過API要至內政部自然人憑證中心下載..很麻煩..還要註冊及簽保密合約 相關網址請參考 http://moica.nat.gov.tw/html/cover05_02.htm 使用.Net對自然人憑證的應用範例 http://www.flaginfo.com.tw/runpc/download/200410/129P210.txt 此範例並未使用APDU Command因此不需要使用中華電信的API 發表人 - sockman 於 2005/05/16 09:54:54 |
akira
一般會員 發表:7 回覆:4 積分:2 註冊:2003-08-19 發送簡訊給我 |
|
cxg
中階會員 發表:116 回覆:192 積分:76 註冊:2004-02-12 發送簡訊給我 |
|
sockman
一般會員 發表:24 回覆:29 積分:10 註冊:2003-03-17 發送簡訊給我 |
引言: sockman 您好,我在使用SCardConnectA时老是返回错误代码(80100069) The smart card has been removed, so that further communication is not possible.请问这是什么原因呢?你是不是使用SLE4428的Memory Card呢? 如果連不上那你可能要改Card Type.. 可以先用ScardConnect時參數下SCARD_SHARD_DIRECT 再用ScardControl,參數下IOCTL_SMARTCARD_SET_CARD_TYPE 再用ScardDisconnect中斷連線,接下來再connect一次 用ScardConnect時參數下SCARD_SHARE_EXCLUSIVE和SCARD_PROTOCOL_RAW 如果成功接下來你就可以使用ScardTransmit下APDU了! |
1234
一般會員 發表:1 回覆:2 積分:0 註冊:2002-06-03 發送簡訊給我 |
各位高手好,弟找了7816-4的規格書苦讀了四天,結果拿中國信託的晶片卡(金融卡 信用卡)來測試,居然連Select MF都無法成功!請問您:
1.這可能是什麼原因呢?
2.是否大部分的卡都符合7816的規格?
3.如果是因為combo卡的關係,請問要Select FISCII Applet時,FISCII的AID是多少呢?(我們公司並非金資會員,買不到Spec)
4.以上只是弟學習過程中測試失敗而產生的疑問。事實上,弟的專案需要的功能只是「在CPU卡上建立一個檔案,儲存會員資料,並且可以修改或刪除。」請問,在卡上建立一個檔案(DF或EF)的相關指令是哪幾道呢? 拜託各位高手賜教了,謝謝!
|
orson
中階會員 發表:5 回覆:135 積分:58 註冊:2002-07-11 發送簡訊給我 |
A000000172950001
引言: 各位高手好,弟找了7816-4的規格書苦讀了四天,結果拿中國信託的晶片卡(金融卡 信用卡)來測試,居然連Select MF都無法成功!請問您: 1.這可能是什麼原因呢? 2.是否大部分的卡都符合7816的規格? 3.如果是因為combo卡的關係,請問要Select FISCII Applet時,FISCII的AID是多少呢?(我們公司並非金資會員,買不到Spec) 4.以上只是弟學習過程中測試失敗而產生的疑問。事實上,弟的專案需要的功能只是「在CPU卡上建立一個檔案,儲存會員資料,並且可以修改或刪除。」請問,在卡上建立一個檔案(DF或EF)的相關指令是哪幾道呢? 拜託各位高手賜教了,謝謝!Orson |
1234
一般會員 發表:1 回覆:2 積分:0 註冊:2002-06-03 發送簡訊給我 |
|
mrbig
一般會員 發表:0 回覆:1 積分:0 註冊:2004-12-09 發送簡訊給我 |
http://www.taconet.com.tw/DerYuChang/index.htm
可以到上面這個網站看看,有介紹到如何讀取二代金融卡的一些APDU指令, 連自然人憑證、I-Cash卡都有,不過不包含所有的指令。 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |