2015-07-02 24 views
5

Sto cercando di implementare algoritmi crittografici sulla curva ellittica in Java Card.Curve ellittiche ristrette in Java Card

In primo luogo, l'ho implementato su una curva ellittica a 256 bit (quella del NIST) e ha funzionato bene.

Ora voglio testarlo su una curva da 512 bit (e non 521 come quella del NIST). La mia scheda supporta questa dimensione e ho trovato un database di curve ellittiche (ben definite per la crittografia) di queste dimensioni. Ma io sto incontrando uno strano problema ...

Quando cerco di inizializzare la mia chiave:

ECPublicKey pubKey = (ECPublicKey) KeyBuilder.buildKey(
      KeyBuilder.TYPE_EC_FP_PUBLIC, (short) 0x0200, false); 

pubKey.setFieldFP(new byte[] { (byte) 0x25, (byte) 0x37, 
      (byte) 0xD2, (byte) 0x9C, (byte) 0x8B, (byte) 0xFE, 
      (byte) 0x7D, (byte) 0x9F, (byte) 0x48, (byte) 0x98, 
      (byte) 0xF7, (byte) 0x60, (byte) 0xF8, (byte) 0x7D, 
      (byte) 0xBF, (byte) 0x63, (byte) 0x90, (byte) 0x6E, 
      (byte) 0x28, (byte) 0x99, (byte) 0x0A, (byte) 0x27, 
      (byte) 0x0C, (byte) 0xA6, (byte) 0x15, (byte) 0xD9, 
      (byte) 0x1D, (byte) 0xC4, (byte) 0x89, (byte) 0xA8, 
      (byte) 0xD0, (byte) 0xA1, (byte) 0xA0, (byte) 0xE7, 
      (byte) 0x52, (byte) 0x43, (byte) 0xB0, (byte) 0x39, 
      (byte) 0x01, (byte) 0x6A, (byte) 0x61, (byte) 0x43, 
      (byte) 0x5C, (byte) 0xA5, (byte) 0x91, (byte) 0xE9, 
      (byte) 0x4B, (byte) 0x1A, (byte) 0xF7, (byte) 0x60, 
      (byte) 0xC9, (byte) 0xAE, (byte) 0xE2, (byte) 0xCE, 
      (byte) 0xE0, (byte) 0x15, (byte) 0x53, (byte) 0x51, 
      (byte) 0x1C, (byte) 0x93, (byte) 0x0E, (byte) 0xF3, 
      (byte) 0xBA, (byte) 0x0B }, (short) 0x0000, (short) 0x0040); 

La funzione setFieldFP solleva una CryptoException con il codice motivo ILLEGAL_VALUE il che significa che la lunghezza della chiave non lo fa match ... Ma lo fa (0x0200 è la dimensione della curva in bit e 0X0040 è la lunghezza del numero primo in byte)!

ho detto che è davvero strano perché se provo con il seguente valore:

ECPublicKey pubKey = (ECPublicKey) KeyBuilder.buildKey(
      KeyBuilder.TYPE_EC_FP_PUBLIC, (short) 0x0200, false); 

pubKey.setFieldFP(new byte[] { (byte) 0xFF, (byte) 0xFF, 
      (byte) 0xFF, (byte) 0xFF, (byte) 0x00, (byte) 0x00, 
      (byte) 0x00, (byte) 0x01, (byte) 0x00, (byte) 0x00, 
      (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, 
      (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, 
      (byte) 0x00, (byte) 0x00, (byte) 0xFF, (byte) 0xFF, 
      (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, 
      (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, 
      (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, 
      (byte) 0xFF, (byte) 0xFF, (byte) 0x00, (byte) 0x00, 
      (byte) 0x00, (byte) 0x01, (byte) 0x00, (byte) 0x00, 
      (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, 
      (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, 
      (byte) 0x00, (byte) 0x00, (byte) 0xFF, (byte) 0xFF, 
      (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, 
      (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, 
      (byte) 0xFF, (byte) 0xFF}, (short) 0x0000, (short) 0x0040); 

Funziona bene ...

Quindi devo concludere che il CryptoException che viene sollevata non lo fa riguarda davvero la dimensione del parametro perché, nei due casi, la dimensione è la stessa ...

Quindi cosa? La mia carta supporta solo la curva ellittica su campi specifici? Qualcuno ha mai avuto questo tipo di problema?

+0

Dove hai trovato i tuoi valori? – vojta

+0

Il valore che voglio usare è emesso dal progetto 'Arcana-ECDB' (base dati gratuita di curve ellittiche per crittografia). Ho provato alcune cose in Java e funziona bene. Il secondo che non genera il 'CryptoException' è solo il primo' p' definito nella curva P-256 dal NIST che ho scritto due volte per avere un array di 64 byte ... – Raoul722

+0

Sei sicuro del tuo valore è big-endian e allineato a destra? – vojta

risposta

4

Il tuo primo non è abbastanza grande. Per curve su F (p) di 512 bit dovresti usare 512 bit primes. Il tuo primo byte, (byte) 0x25, tuttavia inizia con una cifra esadecimale 2. Ciò significa che il primo byte inizia per primo con 2 cifre binarie impostate su 0, il che significa che hai definito un 512 - 2 = 510 bit prime.

Utilizzare solo curve ben definite, come la curva NIST P521 o la curva BrainpoolP512r1.

+0

Wow! Errore hard-to-debug! Quindi dobbiamo considerare che l'alto nibble del primo byte deve essere sempre maggiore di '8' sempre? – Abraham

+3

Beh, sì, a meno che la scheda supporti anche curve a 510 bit. Ma mi chiedo come sia stato generato il primo (è * un * primo, ho controllato). –

+0

Posso sapere perché ti stai chiedendo la generazione dei numeri primi? È difficile generare un numero primo a 512 bit su _nowadays_ Java Cards? (A causa delle restrizioni sulle risorse della carta, ad esempio). Ad ogni modo, basandomi sul commento del primo interrogante sotto il suo post, penso che il numero primo sia generato fuori carta. – Abraham