我编写了以下程序,使用两种不同的算法(ALG_SECURE_RANDOM和ALG_PSEUDO_RANDOM)生成不同长度的随机数。
APDU命令中的P1和P2按照顺序指定算法和随机长度。
P1 = 0X01:ALG_SECURE_RANDOMP1 = 0X02:ALG_PSEUDO_RANDOMP2 =随机数长度
公共类RandGen扩展Applet {
byte[] generatedArray;byte[] generatedRandom;RandomData randomDataSecure = RandomData .getInstance(RandomData.ALG_SECURE_RANDOM);RandomData randomDataPseudo = RandomData .getInstance(RandomData.ALG_PSEUDO_RANDOM);private RandGen() {}公共静态空安装(字节bArray[],short bOffset,字节RandGen)抛出{新#()();}公共空进程(Apdu apdu)抛出{ if (()){返回;} byte[]缓冲器= apdu.getBuffer();generatedArray = JCSystem.makeTransientByteArray( (短) bufferISO7816.OFFSET_P2,JCSystem.CLEAR_ON_DESELECT);开关(bufferISO7816.OFFSET_P1) { case (0x01):generatedRandom = secureRandomGenerator(apdu);中断;大小写(0x02):generatedRandom = pseudoRandomGenerator(apdu);中断;默认:返回;} Util.arrayCopyNonAtomic(generatedRandom,(short) 0,buffer,(short) 0,(short) ISO7816.OFFSET_P2);apdu.setOutgoingAndSend((short) 0,(short) ISO7816.OFFSET_P2);} public byte[] secureRandomGenerator(APDU apdu) { byte[] byte[]= apdu.getBuffer();randomDataSecure.generateData(generatedArray,(short) 0,(short) bufferISO7816.OFFSET_P2);返回generatedArray;} public byte[] pseudoRandomGenerator(APDU apdu) { byte[]缓冲区= apdu.getBuffer();randomDataPseudo.generateData(generatedArray,(short) 0,(short) bufferISO7816.OFFSET_P2);返回generatedArray;}
}成功生成并上载到卡上的CAP文件,但是当我向卡发送APDU命令时,我收到0X6F00状态字:
OSC: opensc-tool.exe -s 00a404000b0102030405060708090000 -s 00000202
Using reader with a card: ACS CCID USB Reader 0
Sending: 00 A4 04 00 0B 01 02 03 04 05 06 07 08 09 00 00
Received (SW1=0x90, SW2=0x00)
Sending: 00 00 02 02
Received (SW1=0x90, SW2=0x00)
OSC: opensc-tool.exe -s 00a404000b0102030405060708090000 -s 00000102
Using reader with a card: ACS CCID USB Reader 0
Sending: 00 A4 04 00 0B 01 02 03 04 05 06 07 08 09 00 00
Received (SW1=0x90, SW2=0x00)
Sending: 00 00 01 02
Received (SW1=0x6F, SW2=0x00) 我的小程序有什么问题吗?
更新:
根据dear @Vojta的回答,我替换
Util.arrayCopyNonAtomic(generatedRandom, (short) 0, buffer, (short) 0,
(short) ISO7816.OFFSET_P2);
apdu.setOutgoingAndSend((short) 0, (short) ISO7816.OFFSET_P2);使用process()方法中的下列行:
Util.arrayCopyNonAtomic(generatedRandom, (short) 0, buffer, (short) 0,
(short) buffer[ISO7816.OFFSET_P2]);
apdu.setOutgoingAndSend((short) 0, (short) buffer[ISO7816.OFFSET_P2]);现在,我在OpenSC工具输出中有了一个奇怪的输出:
安全随机发生器:
OSC: opensc-tool.exe -s 00a404000b0102030405060708090000 -s 00000110
Using reader with a card: ACS CCID USB Reader 0
Sending: 00 A4 04 00 0B 01 02 03 04 05 06 07 08 09 00 00
Received (SW1=0x90, SW2=0x00)
Sending: 00 00 01 10
Received (SW1=0x90, SW2=0x00):
B8 1F 80 25 A2 8E 25 30 F8 22 F8 40 0F AE B0 6C ...%..%0.".@...l
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
00 00 00 00 00 .....
OSC: opensc-tool.exe -s 00a404000b0102030405060708090000 -s 00000110
Using reader with a card: ACS CCID USB Reader 0
Sending: 00 A4 04 00 0B 01 02 03 04 05 06 07 08 09 00 00
Received (SW1=0x90, SW2=0x00)
Sending: 00 00 01 10
Received (SW1=0x6F, SW2=0x00)
OSC: opensc-tool.exe -s 00a404000b0102030405060708090000 -s 00000110
Using reader with a card: ACS CCID USB Reader 0
Sending: 00 A4 04 00 0B 01 02 03 04 05 06 07 08 09 00 00
Received (SW1=0x90, SW2=0x00)
Sending: 00 00 01 10
Received (SW1=0x90, SW2=0x00):
F6 45 A9 0C 0C 3B 3A 5A 5F DC A8 36 .E...;:Z_..6伪随机发生器:
OSC: opensc-tool.exe -s 00a404000b0102030405060708090000 -s 00000210
Using reader with a card: ACS CCID USB Reader 0
Sending: 00 A4 04 00 0B 01 02 03 04 05 06 07 08 09 00 00
Received (SW1=0x90, SW2=0x00)
Sending: 00 00 02 10
Received (SW1=0x90, SW2=0x00):
37 FD FC 67 EB 9E 21 00 6B E9 44 A7 21 3F 31 9A 7..g..!.k.D.!?1.
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
00 00 00 00 00 00 00 .......
OSC: opensc-tool.exe -s 00a404000b0102030405060708090000 -s 00000210
Using reader with a card: ACS CCID USB Reader 0
Sending: 00 A4 04 00 0B 01 02 03 04 05 06 07 08 09 00 00
Received (SW1=0x90, SW2=0x00)
Sending: 00 00 02 10
Received (SW1=0x6F, SW2=0x00)
OSC: opensc-tool.exe -s 00a404000b0102030405060708090000 -s 00000210
Using reader with a card: ACS CCID USB Reader 0
Sending: 00 A4 04 00 0B 01 02 03 04 05 06 07 08 09 00 00
Received (SW1=0x90, SW2=0x00)
Sending: 00 00 02 10
Received (SW1=0x90, SW2=0x00):
72 FE 48 1B 9A A0 BD 2D DF F9 E7 F8 58 CF B7 C0 r.H....-....X...
00 00 00 00 00 00 00 00 00 00 00 ...........为什么对于单个命令有不同的输出?
发布于 2015-04-28 13:08:19
您的代码中有一个小错误。你想要的
Util.arrayCopyNonAtomic(generatedRandom, (short) 0, buffer, (short) 0,
(short) buffer[ISO7816.OFFSET_P2]);而不是
Util.arrayCopyNonAtomic(generatedRandom, (short) 0, buffer, (short) 0,
(short) ISO7816.OFFSET_P2);一般规则:始终将process方法的内容包围在一个try-catch块中,并根据异常的类型和原因设置状态词。否则,您只会得到6F00,并且不知道实际发生了什么。如果您遵循这条规则,您就会知道抛出了ArrayIndexOutOfBoundsException。
更新答案:
奇怪的输出是由以下事实引起的
Util.arrayCopyNonAtomic(generatedRandom, (short) 0, buffer, (short) 0,
(short) buffer[ISO7816.OFFSET_P2]);
apdu.setOutgoingAndSend((short) 0, (short) buffer[ISO7816.OFFSET_P2]);用一些随机值覆盖buffer[ISO7816.OFFSET_P2],然后在下一行中使用该值。应该在buffer[ISO7816.OFFSET_P2]方法开始时将process存储在内存中:
final byte p2 = buffer[ISO7816.OFFSET_P2];对以下评论的答复:
P2 >= 0x80遇到了麻烦,因为将byte转换为short。不幸的是,JavaCard以签名的方式处理字节,这就是为什么P2 >= 0x80的长度为负数的原因。您可以很容易地通过以下方法来避免这种情况:
final short outputLen = (short) (buffer[ISO7816.OFFSET_P2] & 0xFF);发布于 2015-05-28 07:50:46
命令不支持,您有错误的指令连接在一起。
https://stackoverflow.com/questions/29918092
复制相似问题