2016-06-01 4 views
3

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?

+0

Haben Sie APDU-Protokolle? –

+1

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

Antwort

0

Wie Vojta bereits angedeutet:

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

nur ein Schlüsselpaar zu erzeugen versucht, und es funktioniert wahrscheinlich zu einem gewissen Punkt. Aber eine Fp-Kurve unterscheidet sich von einer F2m-Kurve, und meines Wissens gibt es keine 163-Bit-Fp-Kurven (meines Wissens sowieso).

Dies bedeutet, dass Sie nie wirklich die Domain-Parameter installiert haben, es sei denn, Sie haben Ihre eigenen generiert, und ich würde das unwahrscheinlich nennen.

Verwenden Sie eine Fp-Kurve mit einer bekannten Schlüssellänge und legen Sie die Parameter mindestens für den öffentlichen Schlüssel fest (für JCOP-Karten müssen Sie sie möglicherweise auch für den privaten Schlüssel festlegen). Normalerweise verwenden Sie eine Schlüsselgröße von 224 Bit oder höher, um sicher zu sein.

Verwandte Themen