ECC Brainpool Generazione di curve e curve standard con il castello gonfiabile quale seme da utilizzare?

1

Voglio implementare un accordo chiave ECC con una curva Brainpool brainpoolP512r1 o brainpoolP512t1.

Non sono chiaro sul valore di semi-usi da usare (e come). In questo documento link sono menzionati due valori di seme.

E RFC link

5.1 Generazione di numeri primi

6636920D871574E69A458FEA3F4933D7E0D95748 for ECC 512

5.2 Generazione di curve pseudo-casuali

02AC60ACC93ED874422A52ECB238FEEE5AB6AD for ECC 512

  • Quindi quale seme dovrei usare nel costruttore di ECDomainParameters?
  • Il valore di seme per la curva a spirale è lo stesso? Trovo solo i valori iniziali per brainpoolP512r1 e non per brainpoolP512t1
  • L'implementazione è rigida?

        // ECC 512 = AES 256 = RSA 15360
        var ecP = TeleTrusTNamedCurves.GetByName("brainpoolp512t1");
    
        // because ecP.GetSeed() is null !?
        // see spec "ECC Brainpool Standard Curves and Curve Generation" site 7
    
        // 5.1 Generation of prime numbers
        var seed_p_512PrimeNumbers = StringToByteArray("6636920D871574E69A458FEA3F4933D7E0D95748");
        // 5.2 Generation of pseudo-random curves
        var seed_p_512PseudoRandomCurves = StringToByteArray("02AC60ACC93ED874422A52ECB238FEEE5AB6AD");
    
        var ecSpec = new ECDomainParameters(ecP.Curve, ecP.G, ecP.N, ecP.H, seed_p_512PseudoRandomCurves);
    
        // Alice
    
        var enc = new UTF8Encoding();
        var secretPlain = "This is a secret.";
        var secretPlainBytes = enc.GetBytes(secretPlain);
    
    
        IAsymmetricCipherKeyPairGenerator aliceGenerator = GeneratorUtilities.GetKeyPairGenerator("ECDH");
        aliceGenerator.Init(new ECKeyGenerationParameters(ecSpec, new SecureRandom()));
        AsymmetricCipherKeyPair aliceKeyPair = aliceGenerator.GenerateKeyPair();
        IBasicAgreement aliceBasicAgreement = AgreementUtilities.GetBasicAgreement("ECDH");
        aliceBasicAgreement.Init(aliceKeyPair.Private);
    
    
        // Bob
    
        IAsymmetricCipherKeyPairGenerator bobGenerator = GeneratorUtilities.GetKeyPairGenerator("ECDH");
        bobGenerator.Init(new ECKeyGenerationParameters(ecSpec, new SecureRandom()));
        AsymmetricCipherKeyPair bobKeyPair = bobGenerator.GenerateKeyPair();
        IBasicAgreement bobBasicAgreement = AgreementUtilities.GetBasicAgreement("ECDH");
        bobBasicAgreement.Init(bobKeyPair.Private);
    
    
        // generate shared key
    
        var k1 = bobBasicAgreement.CalculateAgreement(aliceKeyPair.Public).ToByteArray();
        var k2 = aliceBasicAgreement.CalculateAgreement(bobKeyPair.Public).ToByteArray();
    
        for (int i = 0; i < k1.Length; i++)
        {
            if (k1[i] != k2[i])
            {
                throw new Exception("Secrets are not equal.");
            }
        }
    

Grazie mille!

Daniel

    
posta dh_cgn 13.09.2013 - 10:59
fonte

1 risposta

3

Non devi assolutamente specificare un seme.

Una curva ellittica è specificata da una manciata di parametri:

  • la definizione del campo su cui stai giocando (qui, il campo consiste negli interi modulo un dato primo p );
  • l'equazione della curva, qui Y 2 = X 3 + aX + b per due costanti a e b ;
  • un generatore convenzionale G , che è un punto di curva (cioè una coppia di coordinate (X, Y) che corrisponde all'equazione della curva);
  • l'ordine n del generatore e il suo cofattore h .

L'ordine n è il più piccolo intero non zero tale che nG = 0 ; h è tale che il numero totale di punti nella curva è uguale a nh . Normalmente, scegliamo la curva in modo che n sia primo e h = 1 , ovvero che il generatore generi l'intera curva e con un ordine primo adatto per Diffie-Hellman o DSA .

Il seme non è affatto necessario per calcolare le cose con la curva. Il seme è stato usato per generare la curva stessa. Si tratta di " numeri" niente-su-manica "". È matematicamente possibile (o almeno potrebbe esserlo) generare parametri speciali con una struttura nascosta ( p , a e b nelle notazioni sopra) tale che la curva sembra buona, ma in effetti è debole contro la crittoanalisi. La generazione della curva normale e onesta ha questo aspetto: generiamo p , a e b completamente casuali, quindi controlliamo i requisiti in section 2 di RFC 5639 ; se non sono tutti soddisfatti, riprova. I parametri in forma speciale che inducono debolezze sono estremamente rari, quindi la generazione casuale va bene.

Per dimostrare che questo processo normale è stato seguito e, quindi, che i parametri della curva non sono stati creati per essere particolarmente deboli, è consuetudine specificare completamente il PRNG utilizzato per produrre tutti i valori casuali , completo con il suo seme iniziale (s). Pertanto, terze parti (ad es., Voi) possono rieseguire il PRNG e il processo di generazione della curva e vedere che ottengono, in effetti, gli stessi parametri di curva. Per le curve di Brainpool, questo PRNG è specificato in appendice A . Qui, hanno due semi perché prima generano p , e solo allora a e b , come due distinti passi, ognuno con il proprio seme.

Tuttavia, non è necessario farlo ogni volta . Quando fai una tale rigenerazione della curva, la fai una volta , giusto per assicurarti che i parametri che trovi nella RFC siano legittimi. In realtà non hai bisogno di farlo da solo, devi solo convincerti che qualcuno, da qualche parte, l'ha fatto. In ogni caso, i parametri della curva che stai per utilizzare sono già in Bouncy Castle.

Per usare solo usa la curva, il seme non è necessario e può essere impostato su null . C'è una stanza nella classe ECDomainParameters per specificare un seed perché alcuni (ma non tutti) gli standard per la codifica dei parametri della curva hanno alcune disposizioni per supportare l'inclusione di tale seme. Tuttavia, questo non vale per il tuo caso:

  • Il tuo codice parlerà con il tuo codice; entrambe le parti conoscono già quale curva viene utilizzata e non hanno bisogno di codificare i parametri della curva in nessun punto.
  • Anche se codifichi i parametri, non avrai bisogno di rieseguire il processo di generazione della curva, poiché ogni parte userà i suoi propri parametri, hardcoded, non quelli inviati dal peer.
  • In ogni caso, non esiste uno standard per la generazione dei parametri PRNG. Brainpool ha il suo, ma non esiste un PRNG concordato che si adatti a tutti (contrariamente ai parametri DSA, dove lo standard stesso lo include, vedi l'appendice A). In effetti, questo può essere visto nel fatto che il processo Brainpool utilizza due semi, non uno.

Quindi, in questo momento, l'inclusione di seed nei parametri codificati e nella classe ECDomainParameters è puro peso morto. Basta impostarlo su null e andare avanti.

Non essendo io stesso un praticante dell'API Bouncy Castle C #, non posso davvero commentare il tuo utilizzo, ma da uno sguardo superficiale, le cose sembrano andare bene. La tua variabile secretPlainBytes sembra spuria; Suppongo che sia il messaggio che poi cripterai con la chiave concordata (risultante dallo scambio di chiavi DH), usando un codice che non mostri.

    
risposta data 13.09.2013 - 13:26
fonte

Leggi altre domande sui tag