- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我必须读取 MASTERCARD、VISA、VISA ELECTRON 等的主帐号 (PAN)。我写了这段代码,但它不起作用有人可以帮助我吗?
import java.util.List;
import javax.smartcardio.ATR;
import javax.smartcardio.Card;
import javax.smartcardio.CardChannel;
import javax.smartcardio.CardException;
import javax.smartcardio.CardTerminal;
import javax.smartcardio.CommandAPDU;
import javax.smartcardio.ResponseAPDU;
import javax.smartcardio.TerminalFactory;
public class LetturaSmartCard {
public static void main(String[] args) throws CardException {
// stampo lista lettori
TerminalFactory factory = TerminalFactory.getDefault();
List<CardTerminal> terminals = factory.terminals().list();
System.out.println("Lista lettori smart card collegati: " + terminals);
// prendo il primo lettore
CardTerminal terminal = terminals.get(0);
System.out.println("Lettore utilizzato: " + terminal);
//stabilisco connessione con la carta
Card card = terminal.connect("*");
// System.out.println(card.getProtocol());
System.out.println("\n\nCarta inserita: " + card);
CardChannel channel = card.getBasicChannel();
ATR atr = card.getATR();
byte[] ATR = atr.getBytes();
byte[] TuttaCarta;
System.out.println("ATR della carta: " + LetturaSmartCard.bytesToHex(ATR));
//------------------------------------lettura---------------------------
byte[] selectVpay = {(byte) 0x00, (byte) 0xA4, (byte) 0x04, (byte) 0x00, (byte) 0x07, (byte) 0xA0, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x03, (byte) 0x20, (byte) 0x20, (byte) 0x00};
byte[] selectMastercard = {(byte) 0x00, (byte) 0xA4, (byte) 0x04, (byte) 0x00, (byte) 0x07, (byte) 0xA0, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x04, (byte) 0x10, (byte) 0x10, (byte) 0x00};
byte[] selectVisaElectron = {(byte) 0x00, (byte) 0xA4, (byte) 0x04, (byte) 0x00, (byte) 0x07, (byte) 0xA0, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x03, (byte) 0x20, (byte) 0x10, (byte) 0x00};
byte[] bo = {(byte) 0x00, (byte) 0xB2, (byte) 0x00, (byte) 0x03, (byte) 0x60};
byte[] selectMaestro = {(byte) 0x00, (byte) 0xA4, (byte) 0x04, (byte) 0x00, (byte) 0x07, (byte) 0xA0, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x04, (byte) 0x30, (byte) 0x60, (byte) 0x00};
byte[] getProcessingOptions = {(byte) 0x80, (byte) 0xA8, (byte) 0x00, (byte) 0x00, (byte) 0x02, (byte) 0x83, (byte) 0x00, (byte) 0x00};
byte[] readRecord = {(byte) 0x00, (byte) 0xB2, (byte) 0x01, (byte) 0x0C, (byte) 0x00};
byte[] lettura = {(byte) 0x00, (byte) 0xB0, (byte) 0x60, (byte) 0x10, (byte) 0x00};
ResponseAPDU r = null;
CommandAPDU capdu = new CommandAPDU(selectMastercard);
r = card.getBasicChannel().transmit(capdu);
TuttaCarta = r.getBytes();
System.out.println(LetturaSmartCard.bytesToHex(TuttaCarta));
capdu = new CommandAPDU(getProcessingOptions);
r = card.getBasicChannel().transmit(capdu);
TuttaCarta = r.getBytes();
System.out.println(LetturaSmartCard.bytesToHex(TuttaCarta));
capdu = new CommandAPDU(readRecord);
r = card.getBasicChannel().transmit(capdu);
TuttaCarta = r.getBytes();
System.out.println(LetturaSmartCard.bytesToHex(TuttaCarta));
//----------------------------------------------------------------------
// disconnect
card.disconnect(false);
}
public static String bytesToHex(byte[] bytes) {
StringBuilder sb = new StringBuilder(bytes.length * 2);
for (int i = 0; i < bytes.length; i++) {
sb.append(String.format("%02x", bytes[i]));
}
return sb.toString();
}
}
我不知道为什么它不起作用我的答案是
Lista lettori smart card collegati: [PC/SC terminal OMNIKEY CardMan 3x21 0]
Lettore utilizzato: PC/SC terminal OMNIKEY CardMan 3x21 0
Carta inserita: PC/SC card in OMNIKEY CardMan 3x21 0, protocol T=0, state OK
ATR della carta: 3b6800000073c84013009000
6f2d8407a0000000041010a522500a4d4153544552434152448701015f2d086974656e66726573bf0c059f4d020b0a9000
771282023900940c1002030118010200180404009000
**6985**
6985
是我在期望 PAN 时收到的错误。我做错了什么?
最佳答案
这个错误说明卡上没有这个记录。使用您的 READ RECORD 命令
00 B2 01 0C 00
您正在尝试使用 SFI 1 读取文件的记录 1。但是,您在响应 GET PROCESSING OPTIONS 命令时收到的应用程序文件定位器明确指出卡上只有以下记录可用:
10 02 03 01: records 2 and 3 in the file with SFI 2
18 01 02 00: records 1 and 2 in the file with SFI 3
18 04 04 00: record 4 in the file with SFI 3
因此您不能期望 SFI 1 文件中的记录 1 出现在卡上。对于该卡,您通常可以在 SFI 2 记录 2 中找到 PAN:
00 B2 02 14 00
另请注意,您使用的静态编码 GPO 命令仅适用于 PDOL 为空的卡片。
关于javax.smartcardio 读取所有智能卡,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23422379/
我正在尝试通过 java smartcardio 读取印度政府标准的“Scosta”智能卡我使用的代码是 package com.example.smartcardreader; import jav
下面的代码适用于 2 个不同的加密智能卡库(certum cryptoCertum3PKCS.dll 和 cencert enigmap11.dll ),但在提供用于 100%正确 有人知道我做错了什
有没有人有阅读 eVRC(电子车辆登记卡)和 JAVA 中的 APD U 命令的经验? 任何例子都会有用。 提前致谢。 最佳答案 我强烈建议您使用 javax.smartcardio 库。请注意,在后
我正在将一个旧项目迁移到 Java,但我遇到了一些有关智能卡访问的问题。由于缺乏文档,我不得不自己寻找解决方法,所以我希望你们能帮助我。 我有一张智能卡和一个用于访问卡功能的 dll 库(中间件)。使
我刚刚开始了解一些智能卡,并且正在使用 pyscard 进行练习。 所以我有 2 个问题(我使用的是 Visa 预付卡): 1)我在网上看到有人说有一个方法可以知道你的卡可以使用哪些选择方式,通过他的
Closed. This question needs debugging details。它当前不接受答案。 想改善这个问题吗?更新问题,以便将其作为on-topic用于堆栈溢出。 6个月前关闭。
我正在使用 BouncycaSTLe 来管理我的项目的加密功能。我设法使用 CMS 进行加密和解密,其中两个 key 都存储在我的文件系统中(.cert 和 .p12)。 这是我实际使用的两个函数:
我正在尝试使用 CredMartialCredential 和 LogonUser 为使用智能卡的用户帐户获取访问 token 。有两个帐户可以使用智能卡进行身份验证(描述(有点)here)。 通过关
我们尝试在 iPhone 上连接 PIV 智能卡。我们已经加载了必要的库并且可以发送命令。使用获取数据和获取响应命令的组合,我们能够从智能卡检索所有相关证书。我们现在尝试发送通用身份验证命令来签署一些
我在使用智能卡签署 PDF 文档时遇到问题。它适用于不合格的证书,但不适用于合格的证书。我正在使用 SunPKCS11 提供程序。这是 CryptoTech 卡。这是代码的一部分,我尝试在该提供程序上
我正在为 ISO 7816 卡编写智能卡程序,我需要更新记录。我用JAVA和javax.smartcardio编写程序图书馆。 我使用以下命令选择文件:ins = 0xA4 我可以使用此命令读取记录:
我正在开发用于读取 EMV 卡的智能卡读卡器。我正在处理一张万事达卡,我试图读取特定记录。结果显示读数很好,但是当我解析结果时,它们似乎不遵循 TLV 标准,其中结果采用 Tag/Template-L
我有一个网络服务器服务,客户端请求智能卡计算并获得结果。在服务器正常运行期间,可用的智能卡数量可能会减少或增加,例如,我可以从读卡器中物理添加或移除智能卡(或许多其他事件......如异常等)。 智能
[我的设置] RDP 客户端 (Win7) ------------------RDP------------------------ -> 带智能卡的远程服务器 (Win2k8R2) 我发现无数的答
我可以毫无问题地从智能卡发送大部分数据。我注意到出于某种原因我总是需要删除 APDU 中的前 6 个字节才能获取真实数据。 但是,当发送一个特定数据时,很难知道该数据在 APDU 中的位置。 这是Ja
我也在使用 C++(Windows API)和 Java 的 SmartCard API。 我在删除操作系统后获取 ATR 时遇到问题。我的申请是为了从智能卡中删除操作系统。当操作系统被删除时,卡的
我正在编写一个Java程序,它使用USB证书(智能卡)进行加密和签名。我有一个共享库(Windows 上为 .dll,Linux 上为 .so),它为硬件实现了 PKCS11。 我正在搜索现有的解决方
我目前可以正确使用 pyscard 与我的智能卡通信,但是当 apdu 大小超过 255 字节时,我需要接收命令的剩余字节。 用什么方法获取 pyscard 中的剩余字节?根据我的理解,sw2 应该是
我必须调用服务器上的脚本(php、jsp - 什么都行)。但是此服务器受客户端身份验证保护。现在我可以使用 P12-Keystore 来完成它。代码: private void install
我正在尝试在 ACOS5-64 智能卡和 OMNIKEY 3121 读卡器上创建 AES 256 key ,使用 python 中的 PKCS11(使用 PyKCS11 库)。到目前为止,所有“标准”
我是一名优秀的程序员,十分优秀!