Java智能卡发送命令

时间:2015-12-15 13:52:17

标签: java smartcard apdu

我是Java Card编程的新手。我在基础知识方面遇到了一些麻烦。

我创建了以下脚本:

echo "Key APDU";
send 0x84 0x20 0x00 0x00 0x40 0x2B 0x57 0xC0 0x2F 0x3C 0x25 0x36 0x61 0xF7 0x85 0x57 0x55 0x4B 0xAA 0x86 0x02 0xAE 0x99 0xFE 0x30 0xBE 0xB9 0xF1 0x85 0x30 0x9E 0x84 0x48 0x98 0x17 0xF2 0xAA 0x7E 0xE3 0x43 0xE2 0x7F 0xD7 0x69 0x73 0x7D 0xCA 0xAD 0xAB 0x58 0x60 0x35 0xEE 0x6D 0xD5 0x3D 0x45 0x0E 0x00 0xCC 0x37 0x6A 0xE8 0xEC 0xF1 0x6C 0x8E 0x34 0x3F;

echo "Data APDU";
send 0x84 0x22 0x00 0x00 0x80 0x20 0x48 0xDE 0xD2 0x6A 0xDC 0x34 0xE2 0xFB 0xA6 0xA5 0x8B 0x0E 0x84 0x65 0x5D 0x1A 0xC8 0x12 0x9C 0x27 0x55 0xE5 0xC2 0xF2 0xCA 0x34 0x14 0xEE 0x26 0x20 0x3D 0xA8 0x6C 0x7F 0xC3 0xAE 0xD2 0xD9 0x62 0xE6 0x2C 0xAF 0x0E 0xD3 0x29 0x62 0x9F 0x9F 0xCC 0x99 0x3E 0xAE 0x9D 0xE3 0x65 0xEC 0xE5 0x5C 0xFF 0x6E 0x47 0x3C 0xB7 0x0F 0xFB 0x6F 0x32 0xB5 0x87 0x52 0x45 0xD6 0xC9 0xDF 0x78 0x96 0xB4 0x15 0xAF 0xE1 0x50 0x04 0x07 0xB0 0xB2 0xF4 0x02 0x93 0x72 0xE0 0x13 0x4F 0x09 0x73 0xC1 0x86 0x03 0x64 0xBD 0xF0 0x83 0xE8 0x19 0xFF 0x7F 0x4F 0x96 0x4C 0xFC 0xEA 0x54 0x28 0x86 0x3A 0xD2 0x82 0x70 0x67 0x8C 0x9D 0x85 0xDC 0xAA 0xC3 0x13 0x5E 0xE9;

echo "Fin APDU";
send 0x84 0x24 0x00 0x00;

但我收到错误:(在第一次发送时)

Input data length != Lc around line 7.

我理解这意味着数据的长度不适合给定的数据长度(第5个字节)。但0x40(十六进制)是64(十进制),应该是正确的大小。

我使用CommadAPDU类创建了所有命令。它表明大小应该是正确的。

CommmandAPDU: 69 bytes, nc=64, ne=0

我创建了这样的命令:

byte[] key = tester.getSessionKey();



CommandAPDU apduKey = new CommandAPDU(NEW_DATA_CLA, NEW_KEY_INS, 0x00, 
            0x00, key, 0, key.length);
    System.out.println("echo \"Key APDU\";\n" + "send " + bytesToHex(apduKey.getBytes()) + ";\n");
    System.out.println("\t\t" +apduKey);

    byte[] data = tester.encryptData("hallo Welt!");
    CommandAPDU apduData = new CommandAPDU(NEW_DATA_CLA, NEW_DATA_INS, 0x00, 0x00, data, 0 , data.length);
    System.out.println("echo \"Data APDU\";\n" + "send " + bytesToHex(apduData.getBytes()) + ";\n");

    CommandAPDU apduFin = new CommandAPDU(NEW_DATA_CLA, DATA_FIN_INS, 0x00, 0x00);
    System.out.println("echo \"Fin APDU\";\n" + "send " + bytesToHex(apduFin.getBytes()) + ";\n"); 

任何帮助都是适用的

1 个答案:

答案 0 :(得分:0)

使用以下格式的Net beans中的Java卡项目,

//在此发送APDU // 0x80 0xCA 0x00 0x00 Lc 数据 0x7F;

0x00 0xA4 0x04 0x00 0X06 0X68 0XEA 0X30 0X8D 0X42 0XDF 0x7F;

这里7F是 Le 。请在命令中尝试Le byte。尝试命令,

0x84 0x20 0x00 0x00 0x40 
0x2B 0x57 0xC0 0x2F 0x3C 0x25 0x36 0x61
0xF7 0x85 0x57 0x55 0x4B 0xAA 0x86 0x02
0xAE 0x99 0xFE 0x30 0xBE 0xB9 0xF1 0x85
0x30 0x9E 0x84 0x48 0x98 0x17 0xF2 0xAA
0x7E 0xE3 0x43 0xE2 0x7F 0xD7 0x69 0x73
0x7D 0xCA 0xAD 0xAB 0x58 0x60 0x35 0xEE
0x6D 0xD5 0x3D 0x45 0x0E 0x00 0xCC 0x37
0x6A 0xE8 0xEC 0xF1 0x6C 0x8E 0x34 0x3F
0x7F

将0x7F添加为Le字节。不是上述格式的命令会给出错误

Input data length != Lc around line x. hope this will remove the error