我寫了下面的程序,使用兩種不同的算法(ALG_SECURE_RANDOM
和ALG_PSEUDO_RANDOM
)生成不同長度的隨機數。隨機數據生成器小程序返回`0x6F00`
P1
和P2
在APDU命令中按順序指定算法和隨機長度。
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() { } public static void install(byte bArray[], short bOffset, byte bLength) throws ISOException { new RandGen().register(); } public void process(APDU apdu) throws ISOException { if (selectingApplet()) { return; } byte[] buffer = apdu.getBuffer(); generatedArray = JCSystem.makeTransientByteArray( (short) buffer[ISO7816.OFFSET_P2], JCSystem.CLEAR_ON_DESELECT); switch (buffer[ISO7816.OFFSET_P1]) { case (0x01): generatedRandom = secureRandomGenerator(apdu); break; case (0x02): generatedRandom = pseudoRandomGenerator(apdu); break; default: return; } 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[] buffer = apdu.getBuffer(); randomDataSecure.generateData(generatedArray, (short) 0, (short) buffer[ISO7816.OFFSET_P2]); return generatedArray; } public byte[] pseudoRandomGenerator(APDU apdu) { byte[] buffer = apdu.getBuffer(); randomDataPseudo.generateData(generatedArray, (short) 0, (short) buffer[ISO7816.OFFSET_P2]); return generatedArray; }
}
冠文件生成並上傳成功上牌,但是當我發送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)
有什麼錯在我的小程序?
更新:
基於親愛的@ Vojta開發的回答,我在process()
方法替代
Util.arrayCopyNonAtomic(generatedRandom, (short) 0, buffer, (short) 0,
(short) ISO7816.OFFSET_P2);
apdu.setOutgoingAndSend((short) 0, (short) ISO7816.OFFSET_P2);
隨着下面幾行:
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."[email protected]
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 ...........
爲什麼我有一個簡單的命令不同的輸出?
請注意,「ALG_PSEUDO_RANDOM」和「ALG_SECURE_RANDOM」的含義是有爭議的話題。更好地諮詢您的用戶手冊實際返回的內容。哦,並且不要在進程方法中實例化對象,甚至不是瞬態字節數組(除非它是個性化的一部分)。 –
_not甚至瞬時字節數組,在過程method_ **爲什麼?** +++ _...除非它是個性化的一部分_ **爲了個性化,我們在處理方法中實例化對象?爲什麼?** – Abraham
因爲您的卡將耗盡資源(EEPROM或RAM)。垃圾收集器並不像真正的Java那樣可靠。如果你確實需要在process方法中實例化對象,請使用額外的標誌,以便僅創建一次。 – David