从JavaCard恢复ECPublicKey到Java

时间:2015-06-09 13:47:34

标签: java bouncycastle javacard apdu elliptic-curve

我正在尝试在终端(由我的电脑模拟)和智能卡(Java Card)之间实现ECDH。

我修复了我想要使用的椭圆曲线,在卡片方面,我有以下代码来运行协议的第一部分:

        ECPublicKey pubKey = (ECPublicKey) KeyBuilder.buildKey(
            KeyBuilder.TYPE_EC_FP_PUBLIC, (short) 0x0100, false);
        pubKey.setFieldFP(p, (short) 0x0001, (short) 0x0020);
        pubKey.setA(a, (short) 0x0001, (short) 0x0020);
        pubKey.setB(b, (short) 0x0000, (short) 0x0020);
        pubKey.setR(r, (short) 0x0001, (short) 0x0020);
        pubKey.setG(g, (short) 0x0000, (short) g.length);

        ECPrivateKey privKey = (ECPrivateKey) KeyBuilder.buildKey(
            KeyBuilder.TYPE_EC_FP_PRIVATE, (short) 0x0100, false);

        KeyPair keypair = new KeyPair(pubKey, privKey);
        keypair.genKeyPair();

        pubKey.getW(apduBuffer, (short) 0x0000);
        setOutgoingAndSend((short) 0x0000, (short) 0x0041);

所以我为ECDH创建了一个KeyPair,并将公共一个发送到我的终端。

我的问题如下:鉴于我得到的响应APDU,我无法重建ECPublicKey ...

我在Java中找不到任何方法(即使使用外部库作为Bouncy Castle)。

有人可以帮助我吗?提前谢谢。

1 个答案:

答案 0 :(得分:2)

JavaCard中返回的公钥格式如下:04 x y。在终端侧,首先必须提取x和y坐标。然后,

  

KeyFactory kf = KeyFactory.getInstance(" ECDSA"," BC");

     

ECPoint point = new ECPoint(x,y);

     

ECParameterSpec domainparameters = new ECParameterSpec(...); //初始化您的域参数

     

ECPublicKeySpec spec = new ECPublicKeySpec(point,domainparameters);

     

ECPublicKey publickey =(ECPublicKey)kf.generatePublic(spec);