Java 如何使用jmrtd和潜水从智能卡读取数据

Java 如何使用jmrtd和潜水从智能卡读取数据,java,smartcard,eid,Java,Smartcard,Eid,我正在尝试使用jmrtd和水肺从ePassporta读取数据。 但它不起作用。在安卓系统中,几乎相同的代码也可以工作。 当从智能卡读取数据时,它不起作用 我的阅读方法: public static void reader() throws Exception { try { CardTerminal terminal =TerminalFactory.getDefault().terminals().list().get(0);

我正在尝试使用jmrtd和水肺从ePassporta读取数据。 但它不起作用。在安卓系统中,几乎相同的代码也可以工作。 当从智能卡读取数据时,它不起作用

我的阅读方法:

public static void reader() throws Exception {

        try {
            CardTerminal terminal =TerminalFactory.getDefault().terminals().list().get(0);
            CardService cs = CardService.getInstance(terminal);
            PassportService service = new PassportService(cs);
            service.open();
            BACKeySpec bacKey = new BACKey("12312312312312", "31121990", "311230");

            boolean paceSucceeded = false;
            try {
                CardAccessFile cardAccessFile = new CardAccessFile(service.getInputStream(PassportService.EF_CARD_ACCESS));
                Collection<PACEInfo> paceInfos = cardAccessFile.getPACEInfos();
                if (paceInfos != null && paceInfos.size() > 0) {
                    PACEInfo paceInfo = paceInfos.iterator().next();
                    service.doPACE(bacKey, paceInfo.getObjectIdentifier(), PACEInfo.toParameterSpec(paceInfo.getParameterId()));
                    paceSucceeded = true;
                } else {
                    paceSucceeded = true;
                }
            } catch (Exception e) {
                e.printStackTrace();
            }

            service.sendSelectApplet(paceSucceeded);

            if (!paceSucceeded) {
                try {
                    service.getInputStream(PassportService.EF_COM).read();
                } catch (Exception e) {
                    service.doBAC(bacKey);
                }
            }


            LDS lds = new LDS();


            CardFileInputStream dg1In = service.getInputStream(PassportService.EF_DG1);
            lds.add(PassportService.EF_DG1, dg1In, dg1In.getLength());
            DG1File dg1File = lds.getDG1File();

            System.out.println(dg1File.getMRZInfo().toString());


        } catch (CardServiceException e) {
            e.printStackTrace();
        }
    }
public static void reader()引发异常{
试一试{
CardTerminal=TerminalFactory.getDefault().terminals().list().get(0);
CardService cs=CardService.getInstance(终端);
护照服务=新护照服务(cs);
service.open();
BACKeySpec bacKey=新bacKey(“12312”、“31121990”、“311230”);
布尔值=假;
试一试{
CardAccessFile CardAccessFile=新的CardAccessFile(service.getInputStream(PassportService.EF_CARD_ACCESS));
集合paceInfos=cardAccessFile.getPACEInfos();
if(paceInfos!=null&&paceInfos.size()>0){
PACEInfo PACEInfo=paceInfos.iterator().next();
doPACE(bacKey,paceInfo.getObjectIdentifier(),paceInfo.toParameterSpec(paceInfo.getParameterId());
成功率=真;
}否则{
成功率=真;
}
}捕获(例外e){
e、 printStackTrace();
}
service.sendSelectApplet(成功);
如果(!成功){
试一试{
getInputStream(PassportService.EF_COM.read();
}捕获(例外e){
多巴克(巴基);
}
}
LDS=新的LDS();
CardFileInputStream dg1In=service.getInputStream(PassportService.EF_DG1);
添加(PassportService.EF_DG1,dg1In,dg1In.getLength());
DG1File DG1File=lds.getDG1File();
System.out.println(dg1File.getMRZInfo().toString());
}捕获(CardServiceException e){
e、 printStackTrace();
}
}
pom.xml

<dependency>
            <groupId>org.jmrtd</groupId>
            <artifactId>jmrtd</artifactId>
            <version>0.5.2</version>
        </dependency>
        <dependency>
            <groupId>net.sf.scuba</groupId>
            <artifactId>scuba-sc-j2se</artifactId>
            <version>0.0.13</version>
        </dependency>
        <dependency>
            <groupId>net.sf.scuba</groupId>
            <artifactId>scuba-smartcards</artifactId>
            <version>0.0.13</version>
        </dependency>

org.jmrd
jmrtd
0.5.2
net.sf.scuba
水肺-sc-j2se
0.0.13
net.sf.scuba
水肺智能卡
0.0.13
Stacktrace: 为堆栈溢出添加更多文本以接受问题。 添加了完整的stacktrace内容。 添加了完整的stacktrace内容。 添加了完整的stacktrace内容。 添加了完整的stacktrace内容

D:\Java\jdk\bin\java -Didea.launcher.port=7539 "-Didea.launcher.bin.path=C:\Program Files (x86)\JetBrains\IntelliJ IDEA 14.0\bin" -Dfile.encoding=UTF-8 -classpath "D:\Java\jdk\jre\lib\charsets.jar;D:\Java\jdk\jre\lib\deploy.jar;D:\Java\jdk\jre\lib\javaws.jar;D:\Java\jdk\jre\lib\jce.jar;D:\Java\jdk\jre\lib\jfr.jar;D:\Java\jdk\jre\lib\jfxswt.jar;D:\Java\jdk\jre\lib\jsse.jar;D:\Java\jdk\jre\lib\management-agent.jar;D:\Java\jdk\jre\lib\plugin.jar;D:\Java\jdk\jre\lib\resources.jar;D:\Java\jdk\jre\lib\rt.jar;D:\Java\jdk\jre\lib\ext\access-bridge-32.jar;D:\Java\jdk\jre\lib\ext\cldrdata.jar;D:\Java\jdk\jre\lib\ext\dnsns.jar;D:\Java\jdk\jre\lib\ext\jaccess.jar;D:\Java\jdk\jre\lib\ext\jfxrt.jar;D:\Java\jdk\jre\lib\ext\localedata.jar;D:\Java\jdk\jre\lib\ext\nashorn.jar;D:\Java\jdk\jre\lib\ext\sunec.jar;D:\Java\jdk\jre\lib\ext\sunjce_provider.jar;D:\Java\jdk\jre\lib\ext\sunmscapi.jar;D:\Java\jdk\jre\lib\ext\sunpkcs11.jar;D:\Java\jdk\jre\lib\ext\zipfs.jar;C:\Users\maksat\IdeaProjects\smart_card\target\classes;C:\Users\maksat\.m2\repository\org\jmrtd\jmrtd\0.5.2\jmrtd-0.5.2.jar;C:\Users\maksat\.m2\repository\org\bouncycastle\bcprov-jdk15on\1.52\bcprov-jdk15on-1.52.jar;C:\Users\maksat\.m2\repository\net\sf\scuba\scuba-sc-j2se\0.0.11\scuba-sc-j2se-0.0.11.jar;C:\Users\maksat\.m2\repository\net\sf\scuba\scuba-smartcards\0.0.9\scuba-smartcards-0.0.9.jar;C:\Program Files (x86)\JetBrains\IntelliJ IDEA 14.0\lib\idea_rt.jar" com.intellij.rt.execution.application.AppMain paket.ReadFromSmartCard
net.sf.scuba.smartcards.CardServiceException: File not found, CAPDU = 00A4020C02011C, RAPDU = 6A82 (SW = 0x6A82: FILE NOT FOUND)
    at org.jmrtd.PassportApduService.checkStatusWordAfterFileOperation(Unknown Source)
    at org.jmrtd.PassportApduService.sendSelectFile(Unknown Source)
    at org.jmrtd.PassportService.sendSelectFile(Unknown Source)
    at org.jmrtd.MRTDFileSystem.getFileInfo(Unknown Source)
    at org.jmrtd.MRTDFileSystem.getSelectedPath(Unknown Source)
    at net.sf.scuba.smartcards.CardFileInputStream.<init>(CardFileInputStream.java:56)
    at org.jmrtd.PassportService.getInputStream(Unknown Source)
    at paket.ReadFromSmartCard.sdvsdv(ReadFromSmartCard.java:121)
    at paket.ReadFromSmartCard.readData(ReadFromSmartCard.java:89)
    at paket.ReadFromSmartCard.main(ReadFromSmartCard.java:23)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:134)
ноя 19, 2019 10:45:51 AM org.jmrtd.PassportService doBAC
WARNING: BAC failed for BAC key "21009199301195, 100993, 120229"
net.sf.scuba.smartcards.CardServiceException: Mutual authentication failed: expected length: 40 + 2, actual length: 2 (SW = 0x6985: CONDITIONS NOT SATISFIED)
    at org.jmrtd.PassportApduService.sendMutualAuth(Unknown Source)
    at org.jmrtd.PassportService.doBAC(Unknown Source)
    at org.jmrtd.PassportService.doBAC(Unknown Source)
    at paket.ReadFromSmartCard.sdvsdv(ReadFromSmartCard.java:140)
    at paket.ReadFromSmartCard.readData(ReadFromSmartCard.java:89)
    at paket.ReadFromSmartCard.main(ReadFromSmartCard.java:23)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:134)

Process finished with exit code 0

D:\Java\jdk\bin\Java-Didea.launcher.port=7539“-Didea.launcher.bin.path=C:\ProgramFiles(x86)\JetBrains\IntelliJ IDEA 14.0\bin“-Dfile.encoding=UTF-8-classpath“D:\Java\jdk\jre\lib\charsets.jar;D:\Java\jdk\jre\lib\deploy.jar;D:\Java\jdk\jre\lib\javaws.jar;D:\Java\jdk\jre\lib\jce.jar;D:\Java\jdk\jre\lib\jfr.jar;D:\Java\jdk\jre\lib\jfxswt.jar;D:\Java\jdk\jre\lib\jsse.jar;D:\Java\jdk\jre\lib\management-agent.jar;D:\Java\jdk\jre\lib\plugin.jar;D:\Java\jdk\jre\lib\resources.jar;D:\Java\jdk\jre\lib\rt.jar;D:\Java\jdk\jre\lib\ext\access-bridge-32.jar;D:\Java\jdk\jre\lib\ext\cldrdata.jar;D:\Java\jdk\jre\lib\ext\dnsns.jar;D:\Java\jdk\jre\lib\ext\jaccess.jar;D:\Java\jdk\jre\lib\ext\jfxrt.jar;D:\Java\jdk\jre\lib\ext\localedata.jar;D:\Java\jdk\jre\lib\ext\nashorn.jar;D:\Java\jdk\jre\lib\ext\sunec.jar;D:\Java\jdk\jre\lib\ext\sunjce\u provider.jar;D:\Java\jdk\jre\lib\ext\sunmsapi.jar;D:\Java\jdk\jre\lib\ext\sunpkcs11.jar;D:\Java\jdk\jre\lib\ext\zipfs.jar;C:\Users\maksat\IdeaProjects\smart\u card\target\classes;C:\Users\maksat\.m2\repository\org\jmrd\jmrd\0.5.2\jmrd-0.5.2.jar;C:\Users\maksat\.m2\repository\org\bouncycastle\bcprov-jdk15on\1.52\bcprov-jdk15on-1.52.jar;C:\Users\maksat\.m2\repository\net\sf\scuba\scuba-sc-j2se\0.0.11\scuba-sc-j2se-0.0.11.jar;C:\Users\maksat\.m2\repository\net\sf\scuba\scuba智能卡\0.0.9\scuba-smartcards-0.0.9.jar;C:\Program Files(x86)\JetBrains\IntelliJ IDEA 14.0\lib\IDEA\u rt.jar“com.IntelliJ.rt.execution.application.AppMain paket.ReadFromSmartCard
net.sf.scuba.smartcards.CardServiceException:未找到文件,CAPDU=00A4020C02011C,RAPD=6A82(SW=0x6A82:未找到文件)
位于org.jmrdt.PassportApduService.checkStatusWordAfterFileOperation(未知源)
位于org.jmrdt.PassportApduService.sendSelectFile(未知源)
位于org.jmrd.PassportService.sendSelectFile(未知源)
位于org.jmrdt.MRTDFileSystem.getFileInfo(未知源)
位于org.jmrdt.MRTDFileSystem.getSelectedPath(未知源)
在net.sf.scuba.smartcards.CardFileInputStream.(CardFileInputStream.java:56)
位于org.jmrd.PassportService.getInputStream(未知源)
在paket.readfromsartcard.sdvsdv(readfromsartcard.java:121)
位于paket.readfromsartcard.readData(readfromsartcard.java:89)
位于paket.readfromsartcard.main(readfromsartcard.java:23)
在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)处
位于sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
在sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)中
位于java.lang.reflect.Method.invoke(Method.java:498)
位于com.intellij.rt.execution.application.AppMain.main(AppMain.java:134)
2019年11月19日上午10:45:51 org.jmrd.PassportService-doBAC
警告:BAC密钥“210091993011951009931229”的BAC失败
net.sf.scuba.smartcards.CardServiceException:相互身份验证失败:预期长度:40+2,实际长度:2(SW=0x6985:不满足条件)
位于org.jmrdt.PassportApduService.sendMutualAuth(未知来源)
位于org.jmrd.PassportService.doBAC(未知来源)
位于org.jmrd.PassportService.doBAC(未知来源)
在paket.readfromsartcard.sdvsdv(readfromsartcard.java:140)
位于paket.readfromsartcard.readData(readfromsartcard.java:89)
位于paket.readfromsartcard.main(readfromsartcard.java:23)
在sun.reflect.NativeMethodAccessorImpl.i