首页 > 解决方案 > 如何使用 jmrtd 和 scuba 从智能卡中读取数据

问题描述

我正在尝试使用 jmrtd 和 scuba 从 ePassporta 读取数据。但它不起作用。在 Android 中,几乎相同的代码可以工作。从智能卡读取时,它不起作用。

我的阅读方法:

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();
        }
    }

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>

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

标签: javasmartcardeid

解决方案


推荐阅读