【问题标题】:How to perform ECKA and have an ECPoint returned?如何执行 ECKA 并返回 ECPoint?
【发布时间】:2015-06-20 07:41:38
【问题描述】:

我正在使用 Bouncy Castle 在智能卡相关软件中使用 ECDH 协议执行椭圆曲线密钥协议,如 BSI-TR-03111 规范第 3.4 节中所定义的

目的是在 PACE 协议中执行随机数的通用映射,如ICAO SAC 技术报告,§3.4.2.1.1 中所定义

(我使用的是 Java,但我猜该语言对我来说不是必需的)

KeyAgreement 类使它非常简单(例如here),但它只允许输出生成的ECPoint 的 X 坐标,即 ZAB(通常是,但并不总是需要的。)

有什么方法可以返回实际的ECPoint(即 SAB)而无需重新实现算法?即使公式本身很简单,也必须检查错误和异常并考虑变化(例如辅因子乘法)

【问题讨论】:

  • 我猜简短的回答是否定的。作为一般规则,提供者实现“顶级”算法,而 ECKA-DH 更多的是构建块算法。如果您愿意直接使用轻量级(on-JCE)API,则通常可以访问构建块。最好提及您尝试实现的高级算法。在某些情况下,例如ECIES,提供​​者至少可以选择在协议输出中使用未压缩的点编码。或者,您可能想要使用尚未在提供程序中的方案;那我们来看看添加吧!
  • 目的是在 PACE 协议中执行 nonce 的 Generic Mapping,如ICAO SAC Technical Report, §3.4.2.1.1 中所定义,它需要一个 nonce 和两个点,一个井已知并且双方同意。
  • 好的,所以我会说你不能通过当前的提供者来做到这一点,但必须使用轻量级 API(即非 JCE 代码),因为你预测,重新实现一些算法(即使是轻量级协议类也不返回 ECPoint)。让我们知道github.com/bcgit/bc-java 是否有我们可以提供帮助的更改,或者如果您想为 BC 贡献任何与 PACE 相关的算法。
  • 感谢 Peter,我将重新设计 PACE 包,以便将轻量级 API 封装在底层。

标签: cryptography bouncycastle smartcard public-key-encryption elliptic-curve


【解决方案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;
    }

}

大部分代码来自 BouncyCastle 的 KeyAgreement 类。

【讨论】:

    【解决方案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();
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-18
      • 2010-09-15
      • 1970-01-01
      • 2010-10-20
      • 1970-01-01
      • 2015-10-20
      相关资源
      最近更新 更多