2015-07-30 2 views
4

Я работаю над апплетом Java Card 3.0.1, на котором я использую ECC. Моя карта поддерживает ECC GF (p) до 320 бит, поэтому я попытался использовать эллиптическую кривую brainpool320r1 (parameters). Проблема в том, что я получаю CryptoException, который я не понимаю ... Это та же проблема, что у меня было несколько раз: Restricted elliptic curves in Java Card, но данное решение не соответствует этому случаю (кривая хорошо определена с 320bits prime).brainpool320r1 Эллиптическая кривая не поддерживается на Java-карте?

я отправляю соответствующий код:

byte[] p = new byte[] { (byte) 0xD3, (byte) 0x5E, (byte) 0x47, (byte) 0x20, 
     (byte) 0x36, (byte) 0xBC, (byte) 0x4F, (byte) 0xB7, 
     (byte) 0xE1, (byte) 0x3C, (byte) 0x78, (byte) 0x5E, 
     (byte) 0xD2, (byte) 0x01, (byte) 0xE0, (byte) 0x65, 
     (byte) 0xF9, (byte) 0x8F, (byte) 0xCF, (byte) 0xA6, 
     (byte) 0xF6, (byte) 0xF4, (byte) 0x0D, (byte) 0xEF, 
     (byte) 0x4F, (byte) 0x92, (byte) 0xB9, (byte) 0xEC, 
     (byte) 0x78, (byte) 0x93, (byte) 0xEC, (byte) 0x28, 
     (byte) 0xFC, (byte) 0xD4, (byte) 0x12, (byte) 0xB1, 
     (byte) 0xF1, (byte) 0xB3, (byte) 0x2E, (byte) 0x27 }; 

byte[] a = new byte[] { (byte) 0x3E, (byte) 0xE3, (byte) 0x0B, (byte) 0x56, 
    (byte) 0x8F, (byte) 0xBA, (byte) 0xB0, (byte) 0xF8, 
    (byte) 0x83, (byte) 0xCC, (byte) 0xEB, (byte) 0xD4, 
    (byte) 0x6D, (byte) 0x3F, (byte) 0x3B, (byte) 0xB8, 
    (byte) 0xA2, (byte) 0xA7, (byte) 0x35, (byte) 0x13, 
    (byte) 0xF5, (byte) 0xEB, (byte) 0x79, (byte) 0xDA, 
    (byte) 0x66, (byte) 0x19, (byte) 0x0E, (byte) 0xB0, 
    (byte) 0x85, (byte) 0xFF, (byte) 0xA9, (byte) 0xF4, 
    (byte) 0x92, (byte) 0xF3, (byte) 0x75, (byte) 0xA9, 
    (byte) 0x7D, (byte) 0x86, (byte) 0x0E, (byte) 0xB4 }; 

byte[] b = new byte[] { (byte) 0x52, (byte) 0x08, (byte) 0x83, (byte) 0x94, 
    (byte) 0x9D, (byte) 0xFD, (byte) 0xBC, (byte) 0x42, 
    (byte) 0xD3, (byte) 0xAD, (byte) 0x19, (byte) 0x86, 
    (byte) 0x40, (byte) 0x68, (byte) 0x8A, (byte) 0x6F, 
    (byte) 0xE1, (byte) 0x3F, (byte) 0x41, (byte) 0x34, 
    (byte) 0x95, (byte) 0x54, (byte) 0xB4, (byte) 0x9A, 
    (byte) 0xCC, (byte) 0x31, (byte) 0xDC, (byte) 0xCD, 
    (byte) 0x88, (byte) 0x45, (byte) 0x39, (byte) 0x81, 
    (byte) 0x6F, (byte) 0x5E, (byte) 0xB4, (byte) 0xAC, 
    (byte) 0x8F, (byte) 0xB1, (byte) 0xF1, (byte) 0xA6 }; 

byte[] r = new byte[] { (byte) 0xD3, (byte) 0x5E, (byte) 0x47, (byte) 0x20, 
    (byte) 0x36, (byte) 0xBC, (byte) 0x4F, (byte) 0xB7, 
    (byte) 0xE1, (byte) 0x3C, (byte) 0x78, (byte) 0x5E, 
    (byte) 0xD2, (byte) 0x01, (byte) 0xE0, (byte) 0x65, 
    (byte) 0xF9, (byte) 0x8F, (byte) 0xCF, (byte) 0xA5, 
    (byte) 0xB6, (byte) 0x8F, (byte) 0x12, (byte) 0xA3, 
    (byte) 0x2D, (byte) 0x48, (byte) 0x2E, (byte) 0xC7, 
    (byte) 0xEE, (byte) 0x86, (byte) 0x58, (byte) 0xE9, 
    (byte) 0x86, (byte) 0x91, (byte) 0x55, (byte) 0x5B, 
    (byte) 0x44, (byte) 0xC5, (byte) 0x93, (byte) 0x11 }; 

byte[] g = new byte[] { (byte) 0x04, (byte) 0x43, (byte) 0xBD, (byte) 0x7E, 
    (byte) 0x9A, (byte) 0xFB, (byte) 0x53, (byte) 0xD8, 
    (byte) 0xB8, (byte) 0x52, (byte) 0x89, (byte) 0xBC, 
    (byte) 0xC4, (byte) 0x8E, (byte) 0xE5, (byte) 0xBF, 
    (byte) 0xE6, (byte) 0xF2, (byte) 0x01, (byte) 0x37, 
    (byte) 0xD1, (byte) 0x0A, (byte) 0x08, (byte) 0x7E, 
    (byte) 0xB6, (byte) 0xE7, (byte) 0x87, (byte) 0x1E, 
    (byte) 0x2A, (byte) 0x10, (byte) 0xA5, (byte) 0x99, 
    (byte) 0xC7, (byte) 0x10, (byte) 0xAF, (byte) 0x8D, 
    (byte) 0x0D, (byte) 0x39, (byte) 0xE2, (byte) 0x06, 
    (byte) 0x11, (byte) 0x14, (byte) 0xFD, (byte) 0xD0, 
    (byte) 0x55, (byte) 0x45, (byte) 0xEC, (byte) 0x1C, 
    (byte) 0xC8, (byte) 0xAB, (byte) 0x40, (byte) 0x93, 
    (byte) 0x24, (byte) 0x7F, (byte) 0x77, (byte) 0x27, 
    (byte) 0x5E, (byte) 0x07, (byte) 0x43, (byte) 0xFF, 
    (byte) 0xED, (byte) 0x11, (byte) 0x71, (byte) 0x82, 
    (byte) 0xEA, (byte) 0xA9, (byte) 0xC7, (byte) 0x78, 
    (byte) 0x77, (byte) 0xAA, (byte) 0xAC, (byte) 0x6A, 
    (byte) 0xC7, (byte) 0xD3, (byte) 0x52, (byte) 0x45, 
    (byte) 0xD1, (byte) 0x69, (byte) 0x2E, (byte) 0x8E, (byte) 0xE1 }; 

    ECPublicKey ecdhPubKey = (ECPublicKey) KeyBuilder.buildKey(
      KeyBuilder.TYPE_EC_FP_PUBLIC, (short) 0x0140, false); 
    ecdhPubKey.setFieldFP(p, (short) 0x0000, (short) 0x0028); 
    ecdhPubKey.setA(a, (short) 0x0000, (short) 0x0028); 
    ecdhPubKey.setB(b, (short) 0x0000, (short) 0x0028); 
    ecdhPubKey.setR(r, (short) 0x0000, (short) 0x0028); 
    ecdhPubKey.setG(g, (short) 0x0000, (short) g.length); 

    ECPrivateKey ecdhPrivKey = (ECPrivateKey) KeyBuilder.buildKey(
     KeyBuilder.TYPE_EC_FP_PRIVATE, (short) 0x0140, false); 

    // Generate a key pair (x, xG) for ECDH. 
    KeyPair keypair = new KeyPair(ecdhPubKey, ecdhPrivKey); 
    keypair.genKeyPair(); 

я проверил шаг за шагом, все будет в порядке, за исключением последней строки keypair.genKeyPair();, что повышает CryptoException.ILLEGAL_VALUE. В спецификациях Java Card указано, что это означает, что значения FP, A, B, R и G, указанные для ECPublicKey, являются недействительными ... Я проверял, это хорошо соответствует brainpool520r1. И что ? Я делаю что-то неправильно ? Не определена ли эта кривая для ECC? Заранее спасибо.

+0

Ну, тот же код с 256-битной кривой (brainpool и NIST) дает тот же результат ... Так что же заключить? Что конфигурация среды Java Card не поддерживает ECC? Как я могу проверить это? Спецификации смарт-карт говорят, что поддерживается ECC Gf (p) 320 бит. – Raoul722

+4

Возможно, вы не задали значение K одним значением (с помощью 'ECKey.setK'). Если это не работает, скопируйте параметры домена в закрытый ключ. –

+0

Действительно, после настройки параметров домена для закрытого ключа он работает. Огромное спасибо. Но спецификация Java Card упоминала, что только открытый ключ должен «знать» параметры домена правильно? Я уже разработал апплет без необходимости делать это для секретного ключа, и что? Зависит от поставщиков? Еще раз спасибо :) – Raoul722

ответ

3

Как Maarten Bodewes сказал в комментарии выше, проблема заключается в том, что я не ставил параметры домена для ECPrivateKey хотя спецификации Java Card упоминает, что он нужен только для ECPublicKey.

+2

Да, это может быть небольшая ошибка от продавца карты. Обратите внимание, что при генерации ключа EC сначала создается первый ключ, поэтому не так странно, если реализация забывает скопировать параметры заранее. Какую платформу вы используете? –

+0

ОК, спасибо за точность :) Используется платформа 'JCOP v2.4.2'. – Raoul722

Смежные вопросы