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?
Gdzie znalazłeś swoje wartości? – vojta
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
Czy jesteś pewien, że twoja wartość jest big-endian i wyrównany do prawej? – vojta