簡體   English   中英

我為什么要在我的Java卡程序中使用“setSeed()”?

[英]Why should I use “setSeed()” in my java card program?

我編寫了以下程序,在我的java卡中生成一個16字節的隨機數。 我使用apdu緩沖區作為種子:

public class RandomNumber extends Applet {

    private RandomData rngRandom;
    public static byte[] testArray1=new byte[16];

    private RandomNumber() {
    }

    public static void install(byte bArray[], short bOffset, byte bLength)
            throws ISOException {
        new RandomNumber().register();


    }

    public void process(APDU arg0) throws ISOException {

        byte[] buffer=arg0.getBuffer();
        // CREATE RNG OBJECT
        m_rngRandom = RandomData.getInstance(RandomData.ALG_SECURE_RANDOM);
        m_rngRandom.setSeed(buffer, (short)0,(short)buffer.length );
        // GENERATE RANDOM BLOCK WITH 16 BYTES
        m_rngRandom.generateData(testArray1, (short) 0, (short)16); 

        Util.arrayCopyNonAtomic(testArray1, (short)0, buffer, (short)0,(short) testArray1.length);
        arg0.setOutgoingAndSend((short)0, (short)16);

    }

}

我轉換它並將其上傳到我的卡上,AID = 01020304050607080900 這對我來說可以。 我重復發送SELECT APDU命令(所以我有一個固定的種子),我收到不同的數字作為隨機輸出:

OpenSC: opensc-tool -s 00a404000b0102030405060708090000
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):
C2 BA 8E 75 67 A4 5F 16 1C 82 BE 98 5B 95 88 23 ...ug._.....[..#

OpenSC: opensc-tool -s 00a404000b0102030405060708090000
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):
8C 95 C3 AC 26 91 97 68 84 57 D8 E9 A5 5A CF 49 ....&..h.W...Z.I

OpenSC: opensc-tool -s 00a404000b0102030405060708090000
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):
34 2C 20 17 80 D1 EC 10 E3 E3 08 E2 DB 82 39 CB 4, ...........9.

OpenSC: opensc-tool -s 00a404000b0102030405060708090000
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):
E1 F6 60 B9 07 34 F2 46 A2 B0 43 19 E3 37 35 5D ..`..4.F..C..75]

OpenSC:

現在,我從程序中刪除了setSeed()方法,並上傳了新的cap文件。 輸出仍然是隨機的:

OpenSC: opensc-tool -s 00a404000b0102030405060708090000
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):
67 1E AE 42 29 ED 4E EE 0E 8F 57 86 C8 8F A3 FF g..B).N...W.....

OpenSC: opensc-tool -s 00a404000b0102030405060708090000
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):
B8 D9 7F 0A EB 3B C3 E4 E0 4C 8F 04 95 E2 1B F4 .....;...L......

OpenSC: opensc-tool -s 00a404000b0102030405060708090000
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):
F3 34 88 E4 C2 B1 E9 D1 77 E3 69 4C 91 21 13 69 .4......w.iL.!.i

OpenSC: opensc-tool -s 00a404000b0102030405060708090000
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):
69 46 C7 0E C9 81 9E 48 AF 5E D4 6A 28 BF 42 E4 iF.....H.^.j(.B.

我的問題 :

如上所示,在兩種情況下(使用setSeed()或不使用它),我的輸出是一個隨機數組。 那么為什么我需要使用這種方法呢?

當我使用固定種子時,我不應該收到相同的結果嗎? 如果是這樣,我為什么不呢?

固定種子與每代一次似乎有什么區別?

當我不使用這種方法時種子是什么?

setSeed()補充而不是替換Java Card RandomData對象的種子,就像Java SE上的SecureRandom一樣。 然而,在3.0.4之前的API中沒有明確說明這一點。

但是,如果您閱讀常量ALG_PSEUDO_RANDOM的文本,您將獲得:

效用偽隨機數生成算法。 即使用相同的種子數據播種,由該算法生成的隨機數序列也不必相同。

至於setSeed方法, 你不需要調用它如果你調用它,我希望你用一個包含比APDU發送到卡的熵更多的源來調用它。


通常, ALG_PSEUDO_RANDOMALG_SECURE_RANDOM的區別並不明確。 ALG_PSEUDO_RANDOM可能意味着該算法不如ALG_SECURE_RANDOM安全 ,但它也可能意味着它是預先播種的確定性隨機數生成器

ALG_SECURE_RANDOM 您可以讀到它是芯片上通常可用的隨機數發生器(在美白之后),或者它可能再次意味着它是預先播種的確定性隨機數發生器 (聽起來很熟悉?)因為通常認為它更多由NIST等人保護。

如果你正確地閱讀它,那確實意味着兩種算法實際上可能指向相同的實現。


總而言之,您沒有看到太多差異(只是隨機數據)的事實是預期的結果。 如果在隨機數生成器上運行完整的FIPS集,您可能會看到差異 - 這取決於實現。

編輯:由於ALG_PSEUDO_RANDOM的含義和種子不清楚,我建議使用ALG_SECURE_RANDOM不是ALG_PSEUDO_RANDOM來檢索加密安全的隨機數。

通常,任一算法都是通過從CPU的安全處理器獲得的隨機性預先播種的。 這意味着即使您提供種子,也無法使用算法創建相同的結果。 這很好,因為你不知道實際的算法。 如果您想這樣做,您可能需要自己編寫流密碼,DRBG或KDF。

我看不到你的類RandomData的來源,但我會假設你使用的是SecureRandom SecureRamdom總是隨機播種,種子不能被強制取值(否則它將不安全!)。

以下內容取自SecureRandom.setSeed() javadocs

public void setSeed(byte [] seed)

重新種植這個隨機對象。 給定的種子補充而不是替代現有的種子。 因此,保證重復呼叫永遠不會減少隨機性。

如果您想要可重復的“隨機性”,則需要使用標准的Random對象。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM