JAVA CARD中创建ECC公钥示例

在设置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;
	}

猜你喜欢

转载自blog.csdn.net/daihuimaozideren/article/details/80508422