在设置Public Key的参数W时,总是报错。提示长度错误。
W由公钥的Qx和Qy两部分依次组成。与设置Private Key的S参数不同的是,在setW时,需要在Qx前再添加1字节标记位,表明Q是否被压缩。通常使用0x04,代表未被压缩。因此,W的长度应为1+Qx Length+Qy Length。
此问题javacardAPI中,并未有详细描述,此处记录一下。
示例代码如下:
private ECKey initECKey(ECKey ecKey, byte[] ecParams) { ecKey.setFieldFP(ecParams, (short) (0), (short) (32)); ecKey.setA(ecParams, (short) (32), (short) (32)); ecKey.setB(ecParams, (short) (64), (short) (32)); ecKey.setG(ecParams, (short) (96), (short) (65)); ecKey.setR(ecParams, (short) (161), (short) (32)); ecKey.setK(Util.getShort(ecParams, (short) (193))); return ecKey; } public ECPublicKey genECPubKey(byte[] buffer, short offset){ ECPublicKey ePubKey=null; ePubKey=(ECPublicKey) (KeyBuilder.buildKey( KeyBuilder.TYPE_EC_FP_PUBLIC, ECC_KEY_LEN, false)); ePubKey.setW(buffer, offset, (short)((ECC_KEY_LEN/4)+1)); //W Length ePubKey=(ECPublicKey)initECKey(ePubKey,EC_PARAMS_SECP256R1); return ePubKey; } public ECPrivateKey genECPriKey(byte[] buffer, short offset){ ECPrivateKey ePriKey=null; ePriKey=(ECPrivateKey) (KeyBuilder.buildKey( KeyBuilder.TYPE_EC_FP_PRIVATE, ECC_KEY_LEN, false)); ePriKey.setS(buffer, offset,(short)(AlgoCore.ECC_KEY_LEN/8)); ePriKey=(ECPrivateKey)initECKey(ePriKey,EC_PARAMS_SECP256R1); return ePriKey; }