Nano Hash - криптовалюты, майнинг, программирование

Как выполнить ECKA и вернуть ECPoint?

Я использую Bouncy Castle для выполнения соглашения о ключе эллиптической кривой с использованием протокола ECDH в программном обеспечении, связанном со смарт-картами, как определено в BSI-TR-03111 спецификации, §3.4 с

Цель состоит в том, чтобы выполнить общее сопоставление одноразового номера в протоколе PACE, как определено в Технический отчет SAC ИКАО, §3.4.2.1.1

(Я использую Java, но язык не имеет значения, я думаю)

Класс KeyAgreement делает это очень простым (как показано здесь), но он позволяет только выводить координата X сгенерированного ECPoint, то есть ZAB (что часто, но не всегда то, что требуется.)

Есть ли способ вернуть фактический ECPoint (то есть SAB) без повторной реализации алгоритма? Несмотря на то, что формула сама по себе проста, необходимо проверять ошибки и аномалии и учитывать вариации (например, умножение кофакторов).


  • Короткий ответ - нет, я думаю. Как правило, провайдер реализует алгоритмы верхнего уровня, тогда как ECKA-DH — это скорее алгоритм строительных блоков. Стандартные блоки обычно доступны, если вы хотите напрямую использовать упрощенный (на JCE) API. Вероятно, лучше упомянуть, какой высокоуровневый алгоритм вы пытаетесь реализовать. В некоторых случаях, например. ECIES, у провайдера есть по крайней мере возможность использовать несжатое точечное кодирование в выходных данных соглашения. В качестве альтернативы вы можете захотеть использовать схему, которой еще нет у провайдера; тогда давайте посмотрим на его добавление! 16.04.2015
  • Цель состоит в том, чтобы выполнить общее сопоставление одноразового номера в протоколе PACE, как определено в Технический отчет ICAO SAC, §3.4.2.1.1, для которого требуется одноразовый номер и два пункты, один хорошо известный и один согласованный между двумя сторонами. 16.04.2015
  • Итак, я бы сказал, что вы не сможете сделать это с помощью текущего провайдера, но вам придется использовать облегченный API (т. е. код без JCE) и, как вы ожидаете, повторно реализовать некоторые алгоритмы ( даже облегченные классы соглашений не возвращают ECPoint). Сообщите нам на github.com/bcgit/bc-java, если мы можем внести изменения в помощь, или если вы хотите внести свой вклад в алгоритмы, связанные с PACE, в BC. 16.04.2015
  • Спасибо, Питер, тогда я собираюсь изменить дизайн пакета PACE, чтобы завернуть легкий API под капот. 16.04.2015

Ответы:


1

Я совсем забыл об этом вопросе. Это было решение, которое я реализовал:

package com.arjowiggins.arjonaut.crypto.ec;

import org.bouncycastle.crypto.BasicAgreement;
import org.bouncycastle.crypto.CipherParameters;
import org.bouncycastle.crypto.params.ECPrivateKeyParameters;
import org.bouncycastle.crypto.params.ECPublicKeyParameters;
import org.bouncycastle.math.ec.ECPoint;

import java.math.BigInteger;

/**
 * Created by Salvatore on 22/04/2015.
 */
public class ECDHPointAgreement implements BasicAgreement {

    private ECPrivateKeyParameters key;

    public void init(CipherParameters key) {
        this.key = (ECPrivateKeyParameters) key;
    }

    public int getFieldSize() {
        return (key.getParameters().getCurve().getFieldSize() + 7) / 8;
    }

    public BigInteger calculateAgreement(CipherParameters pubKey) {
        ECPoint P = calculatePoint(pubKey);
        return P.getAffineXCoord().toBigInteger();
    }

    public ECPoint calculatePoint(CipherParameters pubKey) {
        ECPublicKeyParameters pub = (ECPublicKeyParameters) pubKey;
        ECPoint P = pub.getQ().multiply(key.getD()).normalize();

        if (P.isInfinity()) {
            throw new IllegalStateException("Infinity is not a valid agreement value for ECDH");
        }
        return P;
    }

}

Большая часть кода взята из класса KeyAgreement BouncyCastle.

21.01.2016

2

Решение уравнения кривой для Y — это именно то, что я сделал.

public static BigInteger computeAffineY(BigInteger affineX, ECParameterSpec params) {
    ECCurve bcCurve = toBouncyCastleECCurve(params);
    ECFieldElement a = bcCurve.getA();
    ECFieldElement b = bcCurve.getB();
    ECFieldElement x = bcCurve.fromBigInteger(affineX);     
    ECFieldElement y = x.multiply(x).add(a).multiply(x).add(b).sqrt();
    return y.toBigInteger();
}
19.01.2016
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..