2016-12-12 14 views
1

Как преобразовать эти параметры кривой 192-ECDSA для использования на Java-карте?Как преобразовать параметры кривой ECDSA для Java-карты

p = 6277101735386680763835789423207666416083908700390324961279 
n = 6277101735386680763835789423176059013767194773182842284081 
SEED = 3045ae6f c8422f64 ed579528 d38120ea e12196d5 
c = 3099d2bb bfcb2538 542dcd5f b078b6ef 5f3d6fe2 c745de65 
b = 64210519 e59c80e7 0fa7e9ab 72243049 feb8deec c146b9b1 
Gx = 188da80e b03090f6 7cbf20eb 43a18800 f4ff0afd 82ff1012 
Gy = 07192b95 ffc8da78 631011ed 6b24cdd5 73f977a1 1e794811 
+0

Добро пожаловать в переполнение стека! Сначала вы можете взять [тур] (http://stackoverflow.com/tour) и узнать [Как задать хороший вопрос] (http://stackoverflow.com/help/how-to-ask) и создать [ Minimal, Complete и Verifiable] (http://stackoverflow.com/help/mcve). Нам будет легче помочь вам. Что вы уже сделали? –

+0

Не могли бы вы рассказать нам название своей кривой EC, пожалуйста? Это 'Prime192v1'? Где вы нашли эти ценности? – vojta

ответ

3

Вы должны сопоставить значения для параметров Java Card, которая является более сложным, чем это, кажется, из-за отсутствия соглашения об именовании. Более того, некоторые из ваших параметров являются десятичными, но для них требуется, чтобы они были шестнадцатеричными для Java-карты.

Давайте решим этот шаг за шагом для карты Java ECKey вы хотите инициализировать с параметрами:

поле премьерp

соответствует key.setFieldFP ключа. Ваше значение десятичного, но нужно быть шестнадцатеричным:

private final static byte[] fp = new byte[] { 
     (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)0xFE, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF 
    }; 

Заказать n

соответствует key.setR ключа. Ваше значение десятичного, но нужно быть шестнадцатеричным:

private final static byte[] r = new byte[] { 
     (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)0x99, (byte)0xDE, (byte)0xF8, (byte)0x36, (byte)0x14, (byte)0x6B, (byte)0xC9, (byte)0xB1, (byte)0xB4, (byte)0xD2, (byte)0x28, (byte)0x31 
    }; 

Коэффициент a

устанавливается в -3 (по модулю p) для того, чтобы сделать вычисления с prime192v1 эффективной. Это просто факт, который вам нужно знать. Шестнадцатеричном, это:

private final static byte[] a = new byte[] { 
     (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)0xFE, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFC 
    }; 

Коэффициент b

легко, потому что это в Java Card key.setB. Вы его как шестнадцатеричная строка = без преобразования необходимого:

private final static byte[] b = new byte[] { 
     (byte)0x64, (byte)0x21, (byte)0x05, (byte)0x19, (byte)0xE5, (byte)0x9C, (byte)0x80, (byte)0xE7, (byte)0x0F, (byte)0xA7, (byte)0xE9, (byte)0xAB, (byte)0x72, (byte)0x24, (byte)0x30, (byte)0x49, (byte)0xFE, (byte)0xB8, (byte)0xDE, (byte)0xEC, (byte)0xC1, (byte)0x46, (byte)0xB9, (byte)0xB1 
    }; 

Генератор точки G

является сложным, потому что вы должны сцепить обе координаты, конвертировать их в несжатого формы и предварять префикс 04 (индикатор несжатой формы). Некоторые карты поддерживают другие форматы, но это не гарантировано, поэтому разумнее использовать uncompressed form. Ваши координаты не являются уже шестнадцатеричными = нет преобразования необходимо:

private final static byte[] g = new byte[] { 
     (byte)0x04, (byte)0x18, (byte)0x8D, (byte)0xA8, (byte)0x0E, (byte)0xB0, (byte)0x30, (byte)0x90, (byte)0xF6, (byte)0x7C, (byte)0xBF, (byte)0x20, (byte)0xEB, (byte)0x43, (byte)0xA1, (byte)0x88, (byte)0x00, (byte)0xF4, (byte)0xFF, (byte)0x0A, (byte)0xFD, (byte)0x82, (byte)0xFF, (byte)0x10, (byte)0x12, (byte)0x07, (byte)0x19, (byte)0x2B, (byte)0x95, (byte)0xFF, (byte)0xC8, (byte)0xDA, (byte)0x78, (byte)0x63, (byte)0x10, (byte)0x11, (byte)0xED, (byte)0x6B, (byte)0x24, (byte)0xCD, (byte)0xD5, (byte)0x73, (byte)0xF9, (byte)0x77, (byte)0xA1, (byte)0x1E, (byte)0x79, (byte)0x48, (byte)0x11 
    }; 

Кофактора ч

соответствует key.setK из ключ. Обычно этот параметр опущен и используется значение по умолчанию 1.

Ключ инициализации:

условии, что вы объявили параметры как private static final byte массивы, как описано выше, вы можете инициализировать ваш ECkey таким образом:

key.setFieldFP(fp, (short)0, (short)fp.length); 
key.setR(r, (short)0, (short)r.length); 
key.setA(a, (short)0, (short)a.length); 
key.setB(b, (short)0, (short)b.length); 
key.setG(g, (short)0, (short)g.length); 

Вы можете быть удивлены, что SEED и c значения и что они означают, потому что я не использовал их для вычисления параметров Java Card вообще.

SEED - случайное значение, которое использовалось для создания других параметров. Хэш SHA-1 был рассчитан с SEED. То есть c в ваших обозначениях. Значения a и b были получены из c.

Это наиболее проблемный пункт всей криптографии ЕС: сделал NIST, чтобы выбрать семя как действительно случайное?We don't know. Возможно, они выбрали его, чтобы получить некоторое преимущество для дешифрования или подписи подписи, потому что результирующая кривая может быть «легкой» в некотором роде.

+0

@OrangeDog Нет 'BigInteger' в Java-карте, гарантированной ...' byte' и 'short' - это все, что вы можете использовать. – vojta

+2

@OrangeDog Java Card и Java - это два разных языка: синтаксис более или менее одинаковый, но библиотеки разные. Взгляните на [javadoc] (https://www.win.tue.nl/pinpasjc/docs/apis/jc222/javacard/security/package-summary.html) ... – vojta

+2

Если вы не доверяете NIST кривые, то brainpool - хорошая альтернатива, работающая на java-картах эффективно –

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

  • Нет связанных вопросов^_^