Java智能卡 技术_java智能卡APDU学习笔记
因項目需要,利用APDU通信協(xié)議在ME手機(jī)端和卡端進(jìn)行通訊。在實踐的過程中遇到一些問題,先記錄如下。
APDU協(xié)議,即是智能卡與讀寫器間的應(yīng)用層協(xié)議,在ISO7816-4[7]中定義了該協(xié)議的結(jié)構(gòu)格式。APDU數(shù)據(jù)有兩種結(jié)構(gòu),讀寫器使用的APDU結(jié)構(gòu)為命令A(yù)PDU,C-APDU(Command APDU),智能卡方面使用的APDU結(jié)構(gòu)為響應(yīng)APDU,R-APDU(Reponse APDU)。
命令A(yù)PDU
必選部分:CLA, INS, P1, P2
可選部分:LC, 數(shù)據(jù)段, LE
CLA確定APDU的類別,INS確定要執(zhí)行的指令,P1和P2是參數(shù)。
LC確定數(shù)據(jù)段的長度,數(shù)據(jù)段是發(fā)送到智能卡上的數(shù)據(jù),LE確定讀寫器期待智能卡響應(yīng)的字節(jié)數(shù)。
響應(yīng)APDU
可選部分:數(shù)據(jù)段
必選部分:SW1, SW2
數(shù)據(jù)段的長度由命令A(yù)PDU的LE確定。
SW1和SW2是狀態(tài)字。
卡側(cè)APDU編程實踐
JAVACARD有一系列APDU處理的方法可以調(diào)用,詳情可以查看相應(yīng)的說明文檔。先簡單記錄下我在實踐過程中遇到的一些問題,及相應(yīng)的答案。
在處理一個APDU命令前,首先要調(diào)用getBuffer命令取得APDU緩沖區(qū)數(shù)組的引用,通過該數(shù)組的引用,即可訪問APDU緩沖區(qū)數(shù)組的內(nèi)容。
public voidprocess(APDU apdu) {byte[] buffer =apdu.getBuffer();switch(buffer[ISO7816.OFFSET_INS]) {
}
}
首先要注意兩點,第一:其中取得緩沖數(shù)組的引用給buffer時,注意buffer需在方法中定義,即定義為局部數(shù)組。第二:此時獲得的buffer數(shù)組中僅僅包含APDU的命令頭,即CLA, INS, P1, P2,P3,不包括后續(xù)的數(shù)據(jù)(即P3后的數(shù)據(jù))。如需接受完整的APDU指令,需要利用
byte buffer[]=apdu.getBuffer();short bytesRead=apdu.setIncomingAndReceive();
注意apdu.setIncomingAndReceive()返回數(shù)據(jù)長度,為命令頭后面的數(shù)據(jù)長度,即LC的值。
總結(jié)
以上是生活随笔為你收集整理的Java智能卡 技术_java智能卡APDU学习笔记的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 网页中嵌入JavaScript+事件触发
- 下一篇: java反序列化异常接不到_由Java对