Ich versuche, Elliptic Curve Diffie Hellman auf einer JavaCard (Version 2.2.1) zu arbeiten. ,Wie funktioniert Elliptic Curve Diffie Hellman auf JavaCard in Kombination mit Java?
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());
All dies scheint zu funktionieren, mit Ausnahme der dh.generateSecret
Aufruf:
Auf der Javacard, ich habe den folgenden Code jetzt:
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);
Und ich initialisieren dh
wie folgt wo das Applet einfach zu stürzen scheint. Wenn ich den Anruf verlasse und andere Daten zurücksende, funktioniert das gut. In dem ich die Daten importiere, die vom Terminal gesendet werden. Im Terminal habe ich folgendes:
// 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();
Ich habe mehrere Dinge ausprobiert. Im Moment versucht der Code, der den öffentlichen Schlüssel sendet, diesen in der X9.62-Codierung (unkomprimiert) zu codieren, wie von den JavaCard-Dokumenten angegeben. Allerdings habe ich auch die Standardmethode encode
versucht, die genau das gleiche Ergebnis liefert.
Ich scheine nicht in der Lage zu sein, einen Fehler über die JavaCard zu bekommen, was falsch läuft. Weiß jemand, was schief läuft? Oder hat jemand ein funktionierendes Beispiel für einen Schlüsselaustausch auf einer JavaCard?
Haben Sie APDU-Protokolle? –
Nur ein paar Anmerkungen: 'KeyPair.ALG_EC_FP, KeyBuilder.LENGTH_EC_F2M_163' - Algorithmus und Länge stimmen nicht überein. Geben Sie irgendwo in Ihrem Code Domänenparameter für elliptische Kurven an? Es gibt keine standardmäßige elliptische Kurve. Daher sollten Sie die Parameter sowohl für den privaten als auch für den öffentlichen Schlüssel eingeben, bevor Sie ein neues Schlüsselpaar erstellen. – vojta