HarmonyOS 鸿蒙Next 请问如何进行SM2key的初始化

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

HarmonyOS 鸿蒙Next 请问如何进行SM2key的初始化 在初始化KeyPair中要传入公钥和私钥,目前SM2加密只有公钥,没有私钥如何进行初始化

2 回复

参考demo

// 加密消息
async function encryptMessagePromise(publicKey: cryptoFramework.PubKey, plainText: cryptoFramework.DataBlob) {
  //密钥类型为SM2_256、摘要算法为SM3的Cipher
  let cipher = cryptoFramework.createCipher('SM2_256|SM3');
  await cipher.init(cryptoFramework.CryptoMode.ENCRYPT_MODE, publicKey, null);
  let encryptData = await cipher.doFinal(plainText);
  return encryptData;
}

export async function convertStrToPubKey(keyStr: string): Promise<cryptoFramework.PubKey> {
  let pubKeyStr = keyStr.startsWith("04") ? keyStr.slice(2) : keyStr
  let pkPart1 = pubKeyStr.slice(0, pubKeyStr.length / 2)
  let pkPart2 = pubKeyStr.slice(pubKeyStr.length / 2)
  let pk: cryptoFramework.Point = {
    x: BigInt("0x" + pkPart1),
    y: BigInt("0x" + pkPart2),
  }
  let pubKeySpec: cryptoFramework.ECCPubKeySpec = {
    params: cryptoFramework.ECCKeyUtil.genECCCommonParamsSpec('NID_sm2'),
    pk: pk,
    algName: "SM2",
    specType: cryptoFramework.AsyKeySpecType.PUBLIC_KEY_SPEC
  }
  let keypairGenerator = cryptoFramework.createAsyKeyGeneratorBySpec(pubKeySpec)
  return await keypairGenerator.generatePubKey()
}

async function main() {
  let base64 = new util.Base64Helper();
  //十六进制的公私钥
  let pubKeyStr = "十六进制的公私钥"

 //base64的公私钥 需要转成十六进制公钥
  let pubKeyStr2 = "base64的公私钥"
  let u8aP = base64.decodeSync(pubKeyStr2)
  console.error('Uint8Array u8aP result string:' + u8aP);
  let buf = buffer.from(u8aP);
  console.log('hex u8aP result string:' + buf.toString('hex'));
  let hexpubKeyStr ="十六进制公钥"

  let pubKey = await convertStrToPubKey(hexpubKeyStr)
  // let priKey = await convertStrToPriKey(priKeyStr)


  // 此处为明文
  let message = 'thisistes';
  // 把字符串按utf-8解码为Uint8Array
  let plainText: cryptoFramework.DataBlob = { data: new Uint8Array(buffer.from(message, 'utf-8').buffer) };
  let encryptText = await encryptMessagePromise(pubKey, plainText);
  console.error("encryptText=======&gt;" + buffer.from(encryptText.data).toString('hex'))

  //reslut 是加密后的密文数据
  let spec: cryptoFramework.SM2CipherTextSpec = cryptoFramework.SM2CryptoUtil.getCipherTextSpec(encryptText, 'C1C2C3');
  /*
  * C1 = spec.xCoordinate.toString(16) + spec.yCoordinate.toString(16)
  * C2 = buffer.from(spec.cipherTextData).toString('hex')
  * C3 = buffer.from(spec.hashData).toString('hex')
  * */
  let str = "04" + spec.xCoordinate.toString(16) + spec.yCoordinate.toString(16) + buffer.from(spec.cipherTextData).toString('hex') + buffer.from(spec.hashData).toString('hex')
  console.error("C1C2C3解码后16进制数据=======&gt;" + str)

  let Base64Str = base64.encodeToStringSync(new Uint8Array(buffer.from(str, 'hex').buffer))
  console.error("C1C2C3解码后数据Base64Str=======&gt;" + Base64Str)
}

@Entry
@Component
struct SM2Crypto {
  @State message: string = '点击开始';

  build() {
    Row() {
      Column() {
        Text(this.message)
          .fontSize(50)
          .fontWeight(FontWeight.Bold)
          .onClick(() =&gt; {
            main();
          })
      }
      .width('100%')
    }
    .height('100%')
  }
}

更多关于HarmonyOS 鸿蒙Next 请问如何进行SM2key的初始化的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS(鸿蒙)系统中进行SM2密钥的初始化,可以通过调用鸿蒙系统提供的加密库函数来实现。以下是一个基本的步骤概述:

  1. 引入必要的头文件: 首先,确保在你的代码中包含了鸿蒙加密库的头文件。这些头文件通常包含了进行加密操作所需的函数声明和类型定义。

  2. 创建密钥上下文: 使用鸿蒙加密库提供的API创建一个密钥上下文(key context),这是存储密钥和相关信息的结构体。

  3. 设置密钥参数: 根据SM2算法的要求,设置密钥上下文中的参数,包括密钥类型、密钥长度等。

  4. 初始化密钥: 调用鸿蒙加密库中的初始化函数,传入密钥上下文和其他必要的参数,以生成或加载SM2密钥。

  5. 检查初始化结果: 检查初始化函数的返回值,确保密钥已成功初始化。如果初始化失败,则需要进行错误处理。

请注意,具体的实现细节(如函数名称和参数)可能会根据鸿蒙系统的版本和加密库的具体实现而有所不同。因此,建议查阅鸿蒙系统的官方文档或加密库的API参考,以获取准确的函数和参数信息。

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

回到顶部