Как Elliptic Curve Diffie Hellman работает на JavaCard в сочетании с Java?

Я пытаюсь заставить Elliptic Curve Diffie Hellman работать на JavaCard (версия 2.2.1).

На JavaCard у меня сейчас есть следующий код:

byte temp[] = new byte[100];
byte secret[] = new byte[100];
byte size = buf[ISO7816.OFFSET_LC];

Util.arrayCopy(buf, ISO7816.OFFSET_CDATA, temp, (byte) 0, size);

// the public key is in temp
short len = dh.generateSecret(temp, (byte) 0, size, secret, (byte) 0);

Util.arrayCopy(temp, (byte) 0, buf, ISO7816.OFFSET_CDATA, size);
//Util.arrayCopy(secret, (byte) 0, buf, ISO7816.OFFSET_CDATA, len);
apdu.setOutgoingAndSend(ISO7816.OFFSET_CDATA, size);

И я инициализирую dh следующим образом:

keyPair = new KeyPair(KeyPair.ALG_EC_FP, KeyBuilder.LENGTH_EC_F2M_163);
keyPair.genKeyPair();
dh = KeyAgreement.getInstance(KeyAgreement.ALG_EC_SVDP_DH, false);
dh.init(keyPair.getPrivate());

Кажется, все это работает, за исключением вызова dh.generateSecret, когда апплет просто падает. Если я оставлю вызов и верну другие данные, это работает хорошо. В котором я импортирую данные, отправленные терминалом. В терминале у меня следующее:

// generate an ecdh keypair
KeyPairGenerator keyGen = KeyPairGenerator.getInstance("EC");
keyGen.initialize(163);
KeyPair keyPair = keyGen.generateKeyPair();

// initialize DH
KeyAgreement dh = KeyAgreement.getInstance("ECDH");
dh.init(keyPair.getPrivate());

//byte encKey[] = keyPair.getPublic().getEncoded();

// X9.62 encoding, no compression
int qLength = (163+7)/8;
byte[] xArr = ((ECPublicKey) keyPair.getPublic()).getW().getAffineX().toByteArray();
byte[] yArr = ((ECPublicKey) keyPair.getPublic()).getW().getAffineY().toByteArray();
byte[] enc2 = new byte[1+2*qLength];
enc2[0] = (byte) 0x04;
System.arraycopy(xArr, 0, enc2, qLength - xArr.length, xArr.length);
System.arraycopy(yArr, 0, enc2, 2* qLength - yArr.length, yArr.length);

byte res[] =send((byte) 0x00, enc2).getData();

Я пробовал несколько вещей. Прямо сейчас код, который отправляет открытый ключ, пытается закодировать его в кодировке X9.62 (несжатой), как указано в документации JavaCard. Однако я также попробовал метод encode по умолчанию, который дает точно такой же результат.

Кажется, я не могу получить какую-либо ошибку из JavaCard о том, что происходит не так. Кто-нибудь знает, что происходит не так? Или у кого-нибудь есть рабочий пример обмена ключами на JavaCard?


person kokx    schedule 01.06.2016    source источник
comment
У вас есть журналы APDU?   -  person Paul Bastian    schedule 01.06.2016
comment
Всего несколько замечаний: KeyPair.ALG_EC_FP, KeyBuilder.LENGTH_EC_F2M_163 - алгоритм и длина не совпадают. Вы указываете параметры домена эллиптической кривой где-то в своем коде? Эллиптической кривой по умолчанию нет, поэтому перед созданием новой пары ключей необходимо заполнить параметры как закрытого, так и открытого ключа.   -  person vojta    schedule 02.06.2016


Ответы (1)


Как уже указал Войта:

keyPair = new KeyPair(KeyPair.ALG_EC_FP, KeyBuilder.LENGTH_EC_F2M_163);

просто пытается сгенерировать пару ключей, и это, вероятно, работает до определенного момента. Но кривая Fp отличается от кривой F2m, и, насколько мне известно, не существует 163-битных кривых Fp (во всяком случае, насколько мне известно).

Это означает, что вы на самом деле никогда не устанавливали параметры домена, если только вы не создали свои собственные, и я бы назвал это маловероятным.

Используйте кривую Fp с известной длиной ключа и установите параметры, по крайней мере, для открытого ключа (для карт JCOP вам, возможно, придется установить их и для закрытого ключа). Обычно для обеспечения безопасности вы используете ключ размером 224 бита или выше.

person Maarten Bodewes    schedule 20.08.2016