2015-07-02 13 views
5

Próbuję wdrożyć algorytmy kryptograficzne na krzywej eliptycznej w Java Card.Ograniczone krzywe eliptyczne w Java Card

Najpierw zaimplementowałam go na krzywej eliptycznej 256 bitów (wersja NIST) i działała dobrze.

Teraz chcę przetestować go na krzywej 512bits (a nie 521 jak na NIST). Moja karta obsługuje ten rozmiar i znalazłem bazę danych o krzywych eliptycznych (dobrze zdefiniowanych do kryptografii) o tej wielkości. Ale ja napotykają dziwny problem ...

Kiedy próbuję zainicjować mój klucz:

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

Funkcja setFieldFP podnosi się CryptoException z kodem przyczyny ILLEGAL_VALUE co oznacza, że ​​długość klucza nie dopasuj ... Ale tak (0x0200 jest wielkością krzywej w bitach, a 0X0040 jest długością liczby pierwotnej w bajtach)!

powiedziałem to naprawdę dziwne, bo gdy próbuję z następujących wartości:

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

to działa dobrze ...

Więc muszę stwierdzić, że CryptoException że jest podniesiony nie tak naprawdę chodzi o rozmiar parametru, ponieważ w dwóch przypadkach rozmiar jest taki sam ...

Co z tego? Czy moja karta obsługuje tylko krzywą eliptyczną na określonych polach? Czy ktoś kiedykolwiek napotkał tego rodzaju problem?

+0

Gdzie znalazłeś swoje wartości? – vojta

+0

Wartość, której chcę użyć, pochodzi z projektu 'Arcana-ECDB' (bezpłatna baza danych krzywych eliptycznych do kryptografii). Testowałem pewne rzeczy w Javie i działa dobrze. Drugi, który nie podnosi 'CryptoException' jest po prostu podstawowym' p' zdefiniowanym na krzywej P-256 z NIST, który napisałem dwa razy, aby mieć tablicę 64-bajtową ... – Raoul722

+0

Czy jesteś pewien, że twoja wartość jest big-endian i wyrównany do prawej? – vojta

Odpowiedz

4

Twoja doskonałość nie jest wystarczająco duża. Dla krzywych powyżej F (p) 512 bitów powinieneś używać 512-bitowych liczb pierwszych. Twój pierwszy bajt, (byte) 0x25, zaczyna się jednak od cyfry szesnastkowej 2. Oznacza to, że pierwszy bajt zaczyna się od 2 cyfr binarnych ustawionych na 0, co oznacza, że ​​zdefiniowałeś 512 - 2 = 510 bitów.

Należy używać tylko dobrze zdefiniowanych krzywych, takich jak krzywa NIST P521 lub krzywa BrainpoolP512r1.

+0

Wow! Trudny do debugowania błąd! Musimy więc wziąć pod uwagę, że wysoki przekrój pierwszego bajtu musi być zawsze większy niż "8"? – Abraham

+3

No tak, chyba że karta obsługuje również krzywe 510 bitów. Zastanawiam się jednak, w jaki sposób wygenerowano prime (to * jest * a prim, sprawdziłem). –

+0

Czy mogę wiedzieć, dlaczego zastanawiasz się nad generowaniem pierwszej liczby? Czy trudno jest wygenerować 512-bitową liczbę pierwszą na "juternach" kart Java? (Na przykład z powodu ograniczeń zasobów karty). W każdym razie, na podstawie pierwszego komentarza pytającego pod jego postem, myślę, że liczba pierwsza jest generowana poza kartą. – Abraham