HarmonyOS 鸿蒙Next SM2加解密如果只有私钥,目前的API必须要使用公钥、私钥生成秘钥对keypair才能使用

发布于 1周前 作者 bupafengyu 来自 鸿蒙OS

HarmonyOS 鸿蒙Next SM2加解密如果只有私钥,目前的API必须要使用公钥、私钥生成秘钥对keypair才能使用

SM2加解密API必须要有公私钥生成keyPair,事件场景下客户端只会持有私钥进行加密签名使用,尝试过很多办法,没法使用现有API进行加密。 https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/crypto-sm2-asym-encrypt-decrypt-0000001774280138 https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/crypto-sm2-sign-sig-verify-pkcs1-0000001774280146 使用上面两个链接中的demo方法都不行,covert方法可以支持只传公钥或私钥,但是在cipher.init必须要公钥,在只持有私钥的情况下无法实现。 鸿蒙客户端只持有私钥,对网络请求参数进行加密签名。想请教下有相关API实现该功能吗?

2 回复
可以通过参数生成私钥,对数据进行签名,私钥只能用来签名。

参考demo:

async function genSM2PriKey() {
    let sm2CommonParamsSpec = cryptoFramework.ECCKeyUtil.genECCCommonParamsSpec('NID_sm2');
    let sm2KeyPairSpec: cryptoFramework.ECCPriKeySpec = {
      algName: "SM2",
      specType: cryptoFramework.AsyKeySpecType.PRIVATE_KEY_SPEC,
      params: sm2CommonParamsSpec,
      sk: BigInt('sk'),
    };
    let generatorBySpec = cryptoFramework.createAsyKeyGeneratorBySpec(sm2KeyPairSpec);
    let prk = await generatorBySpec.generatePriKey()
    return prk;
  }
  let input1: cryptoFramework.DataBlob = { data: new Uint8Array(buffer.from("This is Sign test plan1", 'utf-8').buffer) };
  let input2: cryptoFramework.DataBlob = { data: new Uint8Array(buffer.from("This is Sign test plan2", 'utf-8').buffer) };
  async function doSign() {
    let signMessageBlob: cryptoFramework.DataBlob;
    let signer = cryptoFramework.createSign("SM2|SM3");
    try {
      signer.setSignSpec(cryptoFramework.SignSpecItem.SM2_USER_ID_UINT8ARR, stringToUint8Array('123'))
    } catch (e) {
      console.error("设置签名参数error = " + e);
    }
    // let signData: cryptoFramework.DataBlob = { data: message };
    // let keypair = await genSM2KeyPair()
    let prk = await genSM2PriKey()
    await signer.init(prk);
    await signer.update(input1); // 如果明文较短,可以直接调用verify接口一次性传入
    let signData = await signer.sign(input2);
    console.info("sign result is " + signData.data);
  } 

签名(私钥):

对参数进行签名就用文档中Sign.init,使用私钥(PriKey)初始化Sign实例:

使用SM2密钥对签名验签(ArkTS)-签名验签开发指导-签名验签-Crypto Architecture Kit(加解密算法框架服务)-安全-系统 - 华为HarmonyOS开发者 (huawei.com)

加密(公私钥对):

加密就用Cipher.init,是需要公钥的:

使用SM2非对称密钥加解密-加解密开发指导-加解密-Crypto Architecture Kit(加解密算法框架服务)-安全-系统 - 华为HarmonyOS开发者 (huawei.com)

以您目前已有私钥的条件就只能进行签名,

如果有对明文加密的需求肯定要准备公私钥对,

加密和签名是不一样的,请明确这点

在HarmonyOS 鸿蒙Next中,SM2加解密确实通常需要使用公钥和私钥组成的密钥对来进行。如果你只有私钥而没有对应的公钥,目前的API设计确实要求你必须先生成一个包含公钥和私钥的密钥对才能使用。

这是因为SM2作为一种非对称加密算法,其安全性正是基于公钥和私钥的配对使用。公钥用于加密数据或验证签名,而私钥则用于解密数据或生成签名。因此,只有私钥而没有公钥是无法完成SM2加解密过程的。

如果你只有私钥,但需要使用SM2进行加解密,你可以考虑以下方案:

  1. 尝试找回或重新生成与私钥配对的公钥。
  2. 如果无法找回或重新生成公钥,你可能需要重新生成一个新的密钥对,并确保同时安全地保存公钥和私钥。

如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html

回到顶部