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?
Dove hai trovato i tuoi valori? – vojta
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
Sei sicuro del tuo valore è big-endian e allineato a destra? – vojta