Безопасность ECDHE с Bouncy Castle

Я новичок и неопытен в области криптографии на основе эллиптических кривых. После некоторых исследований я определил, что в отличие от традиционного DHE, параметры ECDHE не должны генерироваться, а должны выбираться из списка предопределенных кривых (примеры включают «P-521», «prime192v3»).

При создании чувствительного к безопасности сетевого приложения лучше (или даже логичнее) выбирать разные кривые случайным образом во время выполнения по сравнению с использованием одной жестко закодированной кривой?

Кроме того, существует ли такая концепция более сильной и более слабой кривых среди всех кривых на выбор?

Пока что это мой код для инициирования обмена ECDH:

//For readability purposes exception checking code not shown, all code is properly exception-handled
SecureRandom rnd = SecureRandom.getInstance("SHA1PRNG", "SUN");

X9ECParameters curve = ECNamedCurveTable.getByName("prime192v3");

ECDomainParameters domain = new ECDomainParameters(curve.getCurve(), curve.getG(), curve.getN(), curve.getH(), curve.getSeed());
ECKeyGenerationParameters ecgen = new ECKeyGenerationParameters(domain, rnd);

ECKeyPairGenerator kpgen = new ECKeyPairGenerator();

kpgen.init(ecgen);

AsymmetricCipherKeyPair kp = kpgen.generateKeyPair();

Что-то не так с этим кодом до сих пор?


person initramfs    schedule 26.10.2013    source источник
comment
Большинство вопросов больше подходят для crypto.stackexchange.com. Вы всегда должны, по крайней мере, добавлять к вопросу общий тег, такой как криптография, этот вопрос остался незамеченным.   -  person Maarten Bodewes    schedule 30.10.2013


Ответы (1)


При использовании криптографии ECC создание параметров домена занимает очень много времени. Также довольно сложно проверить безопасность параметров домена, проверьте, например, исследование SafeCurves Дэниела Дж. Бернштейн и Таня Ланге. Можно создать собственную кривую, но, вероятно, не в режиме реального времени. Кроме того, безопасность может быть меньше, чем предопределенная, и позже вы можете столкнуться с проблемами совместимости.

Размер кривой, очевидно, важен, хотя все, что превышает 256 бит, должно обеспечивать достаточную безопасность. Все еще возможно (хотя это маловероятно), что кривые NIST генерируются с использованием схемы, которая может ослабить безопасность. Если вас это беспокоит, выберите кривую на сайте выше (например, кривую BrainpoolP384r1) или одну из более «академических» кривых. Кривые F(p), вероятно, следует предпочесть другим кривым.

Хотя это не сайт для проверки кода, в коде, который вы предоставили, нет ничего особенно плохого.

person Maarten Bodewes    schedule 30.10.2013
comment
Что касается предопределенных именованных кривых, следует ли мне придерживаться одной или выбирать из множества предопределенных кривых во время выполнения. По сути, есть ли какая-либо польза от рандомизации используемой кривой? (Кривая, используемая в конкретном обмене, будет передана второй стороне в виде открытого текста непосредственно перед обменом, чтобы обе стороны использовали одну и ту же кривую) - person initramfs; 30.10.2013
comment
@CPUTerminator Нет, это не принесет вам никакой пользы. На самом деле, вы бы столкнулись с проблемами, если бы какой-либо из них оказался слабым. - person Maarten Bodewes; 30.10.2013