HarmonyOS 鸿蒙Next:256bit 公钥在安卓及Java平台上正常,在HarmonyOS 鸿蒙Next上使用提示 ConvertEcPubKey: d2i_EC_PUBKEY fail

HarmonyOS 鸿蒙Next:256bit 公钥在安卓及Java平台上正常,在HarmonyOS 鸿蒙Next上使用提示 ConvertEcPubKey: d2i_EC_PUBKEY fail 256bit 公钥在安卓以及java平台上正常,在鸿蒙上使用提示 ConvertEcPubKey: d2i_EC_PUBKEY fail

2 回复

当前SM2密钥生成的参数只支持封装并ASN.1序列化后的数据; 需要注意的是在生成ECC密钥时要保证配置参数与SM2一致。 第一步在生成ECC密钥前设置以上参数,生成一个ECCCommonParamsSpec对象,作为生成密钥对象的参数之一:

genSM2CommonSpec(): cryptoFramework.ECCCommonParamsSpec {

  let fieldFp: cryptoFramework.ECFieldFp = {
    fieldType: "Fp",
    p: BigInt("0xFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFF")
  }

  let G: cryptoFramework.Point = {
    x: BigInt("0x32C4AE2C1F1981195F9904466A39C9948FE30BBFF2660BE1715A4589334C74C7"),
    y: BigInt("0xBC3736A2F4F6779C59BDCEE36B692153D0A9877CC62A474002DF32E52139F0A0")
  }

  let SM2CommonSpec: cryptoFramework.ECCCommonParamsSpec = {
    algName: "ECC",
    specType: cryptoFramework.AsyKeySpecType.COMMON_PARAMS_SPEC,
    field: fieldFp,
    a: BigInt("0xFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFC"),
    b: BigInt("0x28E9FA9E9D9F5E344D5A9E4BCF6509A7F39789F515AB8F92DDBCBD414D940E93"),
    g: G,
    n: BigInt("0xFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFF7203DF6B21C6052B53BBF40939D54123"),
    h: 1
  }

  return SM2CommonSpec;
}

ECC的密钥对象有公钥私钥和密钥对三种,将上面得到的ECCCommonParamsSpec参数对象,加上公钥或私钥等其他数据,构成密钥参数对象,各参数对象的模板如下:

// 64字节公钥数据
let pk: cryptoFramework.Point = {
  x: BigInt("0x5A033A9DBEF84C0784C897D070E6608C5AEED39B806DF82853D64E2A686A3794"),
  y: BigInt("0xF9233D20DD878F642D61C2B0344988AE284646226767A1631BBB0DBB6DF40D07")
}

// 32字节私钥数据
let sk: bigint = BigInt("0x3629EFF03FBC86711F6695CBF5590F0F2FCAAA3C269A1CA9BD64FB4C70DF9C9F");

// 下面列出公钥、私钥和密钥对的参数模板,根据实际场景三选一
// 公钥对象参数
let pubKey: cryptoFramework.ECCPubKeySpec = {
  params: this.genSM2CommonSpec(),
  pk: pk,
  algName: "ECC",
  specType: cryptoFramework.AsyKeySpecType.PUBLIC_KEY_SPEC // 指定公钥类型
}

// 私钥对象参数
let priKey: cryptoFramework.ECCPriKeySpec = {
  params: this.genSM2CommonSpec(),
  sk: sk,
  algName: "ECC",
  specType: cryptoFramework.AsyKeySpecType.PRIVATE_KEY_SPEC // 指定私钥类型
}

// 密钥对对象参数
let keyPair: cryptoFramework.ECCKeyPairSpec = {
  params: this.genSM2CommonSpec(),
  sk: sk,
  pk: pk,
  algName: 'ECC',
  specType: cryptoFramework.AsyKeySpecType.KEY_PAIR_SPEC // 指定密钥对类型
}

之后便是密钥对象的生成,这里以密钥对为例,将上面代码得到的密钥对参数对象keyPair传入createAsyKeyGeneratorBySpec得到一个密钥生成器,然后调用generateKeyPair即可得到ECC密钥对

let KeyPairGenerator: cryptoFramework.AsyKeyGeneratorBySpec;

KeyPairGenerator = cryptoFramework.createAsyKeyGeneratorBySpec(keyPair);

let KeyPair: cryptoFramework.KeyPair = await KeyPairGenerator.generateKeyPair()
  .then((keyPair) => {
    return keyPair;
  })
  .catch((e: Error):null => {
    console.log(JSON.stringify(e))
    return null;
  })

return KeyPair

需要注意,如果创建密钥生成器createAsyKeyGeneratorBySpec传入的参数是公钥参数或私钥参数时,后面生成密钥对象则需要调对应的generatePubKey或generatePriKey来得到对应的公钥对象或私钥对象。

完成ECC的密钥对象创建后,下一步就是将ECC的密钥数据传入convertKey中来生成SM2密钥对象

// 参数keyPair为ECC密钥对
async convertKey(keyPair: cryptoFramework.KeyPair){
  // 获取公钥数据
  let pubKey = keyPair.pubKey;
  let pubKeyArr: Uint8Array = pubKey.getEncoded().data;
  let pubKeyBlob: cryptoFramework.DataBlob = { data: pubKeyArr };

  // 获取私钥数据
  let priKey = keyPair.priKey;
  let priKeyArr: Uint8Array = priKey.getEncoded().data;
  let priKeyBlob: cryptoFramework.DataBlob = { data: priKeyArr };

  // 传入公私钥数据生成密钥对象
  let generator = cryptoFramework.createAsyKeyGenerator("SM2_256");
  generator.convertKey(pubKeyBlob, priKeyBlob)
    .then(keyPair=>{
      console.log("convert SM2 keyPair success")
    })
    .catch(err => {
      console.log(JSON.stringify(e));
    });
}

更多关于HarmonyOS 鸿蒙Next:256bit 公钥在安卓及Java平台上正常,在HarmonyOS 鸿蒙Next上使用提示 ConvertEcPubKey: d2i_EC_PUBKEY fail的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


针对帖子标题中提到的问题,“HarmonyOS 鸿蒙Next:256bit 公钥在安卓及Java平台上正常,在HarmonyOS 鸿蒙Next上使用提示 ConvertEcPubKey: d2i_EC_PUBKEY fail”,以下是专业回答:

HarmonyOS 鸿蒙Next在处理256bit公钥时与安卓及Java平台存在差异,可能是由于底层加密库或API实现的不同导致的。d2i_EC_PUBKEY fail错误通常表明在解析EC(椭圆曲线)公钥时遇到了问题。这可能是由于公钥格式不兼容、加密库版本差异或特定的API调用方式不正确。

确保在HarmonyOS上使用的公钥格式与安卓及Java平台上的一致,并检查是否遵循了HarmonyOS的公钥处理规范。此外,确认所使用的加密库(如OpenSSL)版本及其API在HarmonyOS上的兼容性和正确性。由于HarmonyOS可能采用了不同于传统Android的加密实现,因此可能需要调整公钥处理逻辑以适应新的环境。

如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html。在那里,你可以获得更专业的技术支持和解决方案。

回到顶部