2015-07-02 11 views
5

Ich versuche kryptografische Algorithmen auf der elliptischen Kurve in Java Card zu implementieren.Eingeschränkte elliptische Kurven in Java-Karte

Erstens, ich setzte sie auf 256bit elliptische Kurve (der NIST eins) und es hat gut funktioniert.

Jetzt möchte ich es auf einem 512bits Kurve testen (und nicht 521 wie die NIST eins). Meine Karte unterstützt diese Größe und ich fand eine Datenbank mit elliptischen Kurven (gut für die Kryptographie definiert) dieser Größe. Aber ich bin ein seltsames Problem zu begegnen ...

Wenn ich versuche, meinen Schlüssel zu initialisieren:

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); 

Die Funktion setFieldFP wirft ein CryptoException mit dem Ursachencode ILLEGAL_VALUE was bedeutet, dass die Schlüssellänge nicht passen ... Aber es tut (0x0200 ist die Größe der Kurve in Bits und 0X0040 ist die Länge der Primzahl in Bytes)!

ich sagte, es ist wirklich seltsam, denn wenn ich mit dem folgenden Wert versuchen:

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); 

Es funktioniert gut ...

Also muss ich feststellen, dass die CryptoException das ausgelöst wird, nicht wirklich betrifft die Größe des Parameters, weil in beiden Fällen die Größe das gleiche ist ...

So what? Unterstützt meine Karte nur elliptische Kurven auf bestimmten Feldern? Ist jemand jemals auf diese Art von Problem gestoßen?

+0

Wo haben Sie Ihre Werte gefunden? – vojta

+0

Der Wert, den ich verwenden möchte, stammt aus dem Projekt 'Arcana-ECDB' (freie Datenbank elliptischer Kurven für die Kryptographie). Ich habe einige Dinge in Java getestet und es funktioniert gut. Die zweiten, die nicht die 'CryptoException' erhebt nur die Haupt' P' definiert in der P-256-Kurve von der NIST, dass ich zwei Mal schrieb einen 64 Byte-Array zu haben ... – Raoul722

+0

Sind Sie sicher, dass Ihr Wert ist Big-Endian und rechtsbündig? – vojta

Antwort

4

Ihre Primzahl ist nicht groß genug. Für Kurven über F (p) von 512 Bit sollten 512 Bit Primzahlen verwendet werden. Ihr erstes Byte, (byte) 0x25, beginnt jedoch mit einer Hexadezimalziffer 2. Das bedeutet, dass das erste Byte zuerst mit 2 Binärziffern beginnt, die auf 0 gesetzt sind, was bedeutet, dass Sie eine 512 - 2 = 510 Bit-Primzahl definiert haben.

Bitte verwenden Sie nur gut Kurven definiert, wie die NIST P521 Kurve oder der BrainpoolP512r1 Kurve.

+0

Wow! Schwer zu debugender Fehler! Also müssen wir berücksichtigen, dass das High-Nibble des ersten Bytes immer größer als "8" sein muss? – Abraham

+3

Nun ja, es sei denn, die Karte unterstützt auch 510-Bit-Kurven. Aber ich frage mich, wie die Primzahl erzeugt wurde (es ist * eine Primzahl, die ich überprüft habe). –

+0

Darf ich wissen, warum Sie sich über die Generation der Primzahlen wundern? Ist es schwierig, eine 512-Bit-Primzahl auf _nowdays_ Java Cards zu generieren? (Z. B. wegen Ressourcenbeschränkungen der Karte). Jedenfalls, basierend auf dem Kommentar des ersten Fragestellers unter seinem Post, denke ich, dass die Primzahl off-card generiert wird. – Abraham