2015-07-02 2 views
5

Я пытаюсь реализовать криптографические алгоритмы на эллиптической кривой в Java-карте.Ограниченные эллиптические кривые в Java Card

Во-первых, я реализовал его на 256-битной эллиптической кривой (NIST-One), и он работал хорошо.

Теперь я хочу протестировать его на кривой 512 бит (а не 521, как NIST). Моя карта поддерживает этот размер, и я нашел базу данных эллиптических кривых (четко определенных для криптографии) такого размера. Но я встречая странную проблему ...

Когда я пытаюсь инициализировать мой ключ:

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

Функция setFieldFP поднимает CryptoException с кодом ILLEGAL_VALUE причины, что означает, что длина ключа не match ... Но он делает (0x0200 - это размер кривой в битах, а 0X0040 - это длина простого числа в байтах)!

Я сказал, что это действительно странно, потому что если я пытаюсь со следующим значением:

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

Это прекрасно работает ...

Так что я должен сделать вывод, что CryptoException, увеличивающийся не действительно относятся к размеру параметра, потому что в двух случаях размер такой же ...

И что? Моя карта поддерживает только эллиптическую кривую на определенных полях? Кто-нибудь сталкивался с такой проблемой?

+0

Где вы находите свои данные? – vojta

+0

Значение, которое я хочу использовать, выдается из проекта «Arcana-ECDB» (свободная база данных эллиптических кривых для криптографии). Я тестировал некоторые вещи на Java, и он отлично работает. Второй, который не вызывает «CryptoException», является просто «p», определяемым в кривой P-256 из NIST, который я написал два раза, чтобы иметь массив из 64 байтов ... – Raoul722

+0

Вы уверены, что ваша ценность является широкоформатным и выровненным по правому краю? – vojta

ответ

4

Ваше расстройство не достаточно велико. Для кривых над F (p) 512 бит вы должны использовать 512 бит простых чисел. Ваш первый байт, (byte) 0x25, однако начинается с шестнадцатеричной цифры 2. Это означает, что первый байт сначала начинается с двух двоичных цифр, установленных на 0, что означает, что вы определили 512 - 2 = 510 бит.

Используйте только четко определенные кривые, такие как кривая NIST P521 или кривая BrainpoolP512r1.

+0

Ничего себе! Жесткая ошибка отладки! Итак, мы должны учитывать, что высокий кусок первого байта должен быть больше, чем '8' всегда? – Abraham

+3

Ну, да, если карта не поддерживает кривые 510 бит. Но мне интересно, как было сгенерировано простое (это * - простое, я проверил). –

+0

Могу ли я узнать, почему вы задаетесь вопросом о поколении простых чисел? Трудно ли генерировать 512-битное простое число на _nowadays_ Java-картах (например, из-за ограничений ресурсов карты). В любом случае, основываясь на комментарии первого комментатора под своим сообщением, я думаю, что простое число создается вне карты. – Abraham