【HarmonyOS NEXT】使用国密SM2_256,密钥转成Uint8Array后,convertKey报错

文章讲述了开发者在Android项目中尝试使用SM2_256算法进行加解密时遇到convertKey函数报错,涉及到密钥类型转换和OpenSSL错误。给出了通过正确编码密钥和使用特定函数转换为Uint8Array来解决问题的方法。
摘要由CSDN通过智能技术生成

【关键字】

国密 / SM2_256 / 加解密 / Uint8Array / convertKey

【问题描述】

按照官方的SM2_256加解密代码进行配置,从Android项目拷贝密钥,并将密钥转成Uint8Array后,convertKey报错,错误信息如下:

ConvertEcPubKey: d2i_EC_PUBKEY fail.
com.examp...lication E HcfPrintOpensslError: [Openssl]: engine fail, error code = 109052059, error string = error:0680009B:asn1 encoding routines::too long
com.examp...lication E ConvertKeyAsyncWorkProcess: convert key fail.

问题代码如下:

let generator = cryptoFramework.createAsyKeyGenerator("");
generator.convertKey(pubKeyBlob, null, (error, data) => {
})

【解决方案】

请参考如下代码进行配置:

function HexStrTouint8Array(data: string): Uint8Array {
  return new Uint8Array(buffer.from(data, 'hex').buffer);;
}
async init(): Promise<cryptoFramework.KeyPair | null> {

  let puk = "04D03640597C482DC4684A753BEB6CD18669AF5B77EF90C2CA6EDD25D68A8F54916E445307B2EDD05789373CD1B96DE9F79367F4E9A1005B3845B971EA18007090";
  let prk = "83C74105FC41DD00A48AF1F15A6C82EFC69D9E05E4002713B1D2F2C44DBF4C39";

  //转16进制放入对应的位置 04+x+y
  let pk: cryptoFramework.Point = {
    x: BigInt("0xD03640597C482DC4684A753BEB6CD18669AF5B77EF90C2CA6EDD25D68A8F5491"),
    y: BigInt("0x6E445307B2EDD05789373CD1B96DE9F79367F4E9A1005B3845B971EA18007090")
  }
  let sk: bigint = BigInt("0x83C74105FC41DD00A48AF1F15A6C82EFC69D9E05E4002713B1D2F2C44DBF4C39");
  // 密钥对对象数据
  let keyPair: cryptoFramework.ECCKeyPairSpec = {
    params: this.genSM2CommonSpec(),
    sk: sk,
    pk: pk,
    algName: 'SM2',
    specType: cryptoFramework.AsyKeySpecType.KEY_PAIR_SPEC
  }

  let KeyPair: cryptoFramework.KeyPair | null = null;
  try {
    let KeyPairGenerator: cryptoFramework.AsyKeyGeneratorBySpec;
    KeyPairGenerator = cryptoFramework.createAsyKeyGeneratorBySpec(keyPair);
    KeyPair = await KeyPairGenerator.generateKeyPair()
    .then((keyPair) => {
      return keyPair;
    })
    .catch((e: Error): null => {
      console.log(JSON.stringify(e))
      return null;
    })
  } catch (err) {
    let e: BusinessError = err as BusinessError;
    console.error(`sync error, ${e.code}, ${e.message}`);
  }
  return KeyPair;
}
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;
}

详细信息请参见:https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/crypto-generate-asym-key-pair-from-key-spec-0000001774120454#ZH-CN_TOPIC_0000001774120454__%E6%A0%B9%E6%8D%AE%E6%A4%AD%E5%9C%86%E6%9B%B2%E7%BA%BF%E5%90%8D%E7%94%9F%E6%88%90sm2%E5%AF%86%E9%92%A5%E5%AF%B9

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值