HarmonyOS鸿蒙Next Ecc

HarmonyOS鸿蒙Next Ecc

1、在生产公私钥秘钥对时,官方文档中的哪些数据都是固定的吗?我们开发者只需要直接调用就行了吗?官方给出的函数如下:

function genEccCommonSpec(): cryptoFramework.ECCCommonParamsSpec {
  let fieldFp: cryptoFramework.ECFieldFp = {
    fieldType: 'Fp',
    p: BigInt('0xffffffffffffffffffffffffffffffff000000000000000000000001')
  }
  let G: cryptoFramework.Point = {
    x: BigInt('0xb70e0cbd6bb4bf7f321390b94a03c1d356c21122343280d6115c1d21'),
    y: BigInt('0xbd376388b5f723fb4c22dfe6cd4375a05a07476444d5819985007e34')
  }
  let eccCommonSpec: cryptoFramework.ECCCommonParamsSpec = {
    algName: 'ECC',
    specType: cryptoFramework.AsyKeySpecType.COMMON_PARAMS_SPEC,
    field: fieldFp,
    a: BigInt('0xfffffffffffffffffffffffffffffffefffffffffffffffffffffffe'),
    b: BigInt('0xb4050a850c04b3abf54132565044b0b7d7bfd8ba270b39432355ffb4'),
    g: G,
    n: BigInt('0xffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3d'),
    h: 1
  }
  return eccCommonSpec;
}

更多关于HarmonyOS鸿蒙Next Ecc的实战教程也可以访问 https://www.itying.com/category-93-b0.html

3 回复

这个是需要补充eccCommonSpec 生成 ecc 公司密钥的方法 x y 为 公钥的密钥去掉开头的04 然后从中一分为二 x 为前半部分加x0x y为后半部分加0x

x y 构成的G 为eccCommonSpec 的g
a b n 为 生成的其他需要参数
Fp域下的ECC密钥参数,定义如下:

  • p:素数,用于确定Fp
  • a, b:确定椭圆曲线的方程
  • g:椭圆曲线的一个基点(base point),可由gx,gy表示
  • n:基点g的阶(order)
  • h:余因子(cofactor)
  • sk:私钥,是一个随机整数,小于n
  • pk:公钥,是椭圆曲线上的一个点, pk = sk * g

参考指南链接:https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/crypto-asym-key-generation-conversion-spec-0000001820880089#ZH-CN_TOPIC_0000001811318202__%E4%BD%BF%E7%94%A8%E5%AF%86%E9%92%A5%E5%8F%82%E6%95%B0%E7%94%9F%E6%88%90-1

详情可参考demo:

import cryptoFramework from '@ohos.security.cryptoFramework';

import { BusinessError } from '@ohos.base';

// 打印bigint信息
function showBigIntInfo(bnName: string, bnValue: bigint | string | number) {
  if (typeof bnValue === 'string') {
    console.error('type is string');
    return;
  }
  if (typeof bnValue === 'number') {
    console.error('type is number');
    return;
  }
  console.info(bnName + ':');
  console.info('. Decimal: ' + bnValue.toString());
  console.info('. Hexadecimal: ' + bnValue.toString(16));
  console.info('. Length (bits): ' + bnValue.toString(2).length);
}

// 根据关键规范构造EccCommonSpec结构体。EccCommonSpec结构体定义了ECC私钥和公钥的公共参数
function genEccCommonSpec(): cryptoFramework.ECCCommonParamsSpec {
  let fieldFp: cryptoFramework.ECFieldFp = {
    fieldType: 'Fp',
    p: BigInt('0xffffffffffffffffffffffffffffffff000000000000000000000001')
  }
  let G: cryptoFramework.Point = {
    x: BigInt('0xb70e0cbd6bb4bf7f321390b94a03c1d356c21122343280d6115c1d21'),
    y: BigInt('0xbd376388b5f723fb4c22dfe6cd4375a05a07476444d5819985007e34')
  }
  let eccCommonSpec: cryptoFramework.ECCCommonParamsSpec = {
    algName: 'ECC',
    specType: cryptoFramework.AsyKeySpecType.COMMON_PARAMS_SPEC,
    field: fieldFp,
    a: BigInt('0xfffffffffffffffffffffffffffffffefffffffffffffffffffffffe'),
    b: BigInt('0xb4050a850c04b3abf54132565044b0b7d7bfd8ba270b39432355ffb4'),
    g: G,
    n: BigInt('0xffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3d'),
    h: 1
  }
  return eccCommonSpec;
}

// 打印ECC密钥规格
function showEccSpecDetailInfo(key: cryptoFramework.PubKey | cryptoFramework.PriKey, keyType: string) {
  console.info('show detail of ' + keyType + ':');
  try {
    let p = key.getAsyKeySpec(cryptoFramework.AsyKeySpecItem.ECC_FP_P_BN);
    showBigIntInfo('--- p', p); // length is 224, hex : ffffffffffffffffffffffffffffffff000000000000000000000001
    let a = key.getAsyKeySpec(cryptoFramework.AsyKeySpecItem.ECC_A_BN);
    showBigIntInfo('--- a', a); // length is 224, hex : fffffffffffffffffffffffffffffffefffffffffffffffffffffffe
    let b = key.getAsyKeySpec(cryptoFramework.AsyKeySpecItem.ECC_B_BN);
    showBigIntInfo('--- b', b); // length is 224, hex : b4050a850c04b3abf54132565044b0b7d7bfd8ba270b39432355ffb4
    let gX = key.getAsyKeySpec(cryptoFramework.AsyKeySpecItem.ECC_G_X_BN);
    showBigIntInfo('--- gX', gX); // length is 224, hex : b70e0cbd6bb4bf7f321390b94a03c1d356c21122343280d6115c1d21
    let gY = key.getAsyKeySpec(cryptoFramework.AsyKeySpecItem.ECC_G_Y_BN);
    showBigIntInfo('--- gY', gY); // length is 224, hex : bd376388b5f723fb4c22dfe6cd4375a05a07476444d5819985007e34
    let n = key.getAsyKeySpec(cryptoFramework.AsyKeySpecItem.ECC_N_BN);
    showBigIntInfo('--- n', n); // length is 224, hex : ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3d
    let h = key.getAsyKeySpec(cryptoFramework.AsyKeySpecItem.ECC_H_NUM);
    console.warn('--- h: ' + h); // key h: 1
    let fieldType = key.getAsyKeySpec(cryptoFramework.AsyKeySpecItem.ECC_FIELD_TYPE_STR);
    console.warn('--- field type: ' + fieldType); // key field type: Fp
    let fieldSize = key.getAsyKeySpec(cryptoFramework.AsyKeySpecItem.ECC_FIELD_SIZE_NUM);
    console.warn('--- field size: ' + fieldSize); // key field size: 224
    let curveName = key.getAsyKeySpec(cryptoFramework.AsyKeySpecItem.ECC_CURVE_NAME_STR);
    console.warn('--- curve name: ' + curveName); // key curve name: NID_secp224r1
    if (keyType == 'priKey') {
      let sk = key.getAsyKeySpec(cryptoFramework.AsyKeySpecItem.ECC_SK_BN);
      showBigIntInfo('--- sk', sk);
    } else if (keyType == 'pubKey') {
      let pkX = key.getAsyKeySpec(cryptoFramework.AsyKeySpecItem.ECC_PK_X_BN);
      showBigIntInfo('--- pkX', pkX);
      let pkY = key.getAsyKeySpec(cryptoFramework.AsyKeySpecItem.ECC_PK_Y_BN);
      showBigIntInfo('--- pkY', pkY);
    }
  } catch (error) {
    console.error('getAsyKeySpec error');
    let e: BusinessError = error as BusinessError;
    console.error(`getAsyKeySpec failed, ${e.code}, ${e.message}`);
  }
}

// 根据EccCommonSpec实例生成ECC密钥对,获取密钥规格
function testEccUseCommKeySpecGet() {
  try {
    let commKeySpec = genEccCommonSpec(); // 使用参数属性,构造ECC公私钥公共密钥参数对象
    let generatorBySpec = cryptoFramework.createAsyKeyGeneratorBySpec(commKeySpec); // 使用密钥参数对象创建生成器
    let keyPairPromise = generatorBySpec.generateKeyPair(); // Generate an ECC key pair.
    keyPairPromise.then(keyPair => { // 使用生成器创建ECC密钥对
      showEccSpecDetailInfo(keyPair.priKey, 'priKey'); // 对私钥获取相关密钥参数属性
      showEccSpecDetailInfo(keyPair.pubKey, 'pubKey'); // 对公钥获取相关密钥参数属性
    }).catch((error: BusinessError) => {
      // 逻辑错误等异步异常在此捕获
      console.error('generateComm error');
      console.error('error code: ' + error.code + ', message is: ' + error.message);
    })
  } catch (error) {
    // 参数错误等同步异常在此捕获
    console.error('testEccUseCommSpec error');
    let e: BusinessError = error as BusinessError;
    console.error(`ecc comm spec failed, ${e.code}, ${e.message}`);
  }
}

参考链接:https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/crypto-generate-asym-key-pair-from-key-spec-0000001774120454#ZH-CN_TOPIC_0000001811157294__%E6%8C%87%E5%AE%9A%E5%AF%86%E9%92%A5%E5%8F%82%E6%95%B0%E7%94%9F%E6%88%90ecc%E5%AF%86%E9%92%A5%E5%AF%B9

需要使用私钥的公共参数 生成私钥的公钥

更多关于HarmonyOS鸿蒙Next Ecc的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


HarmonyOS鸿蒙Next Ecc是华为推出的下一代鸿蒙操作系统版本,专注于提升系统的安全性、性能和用户体验。Ecc代表椭圆曲线加密(Elliptic Curve Cryptography),是一种现代加密技术,用于增强系统的数据安全性。鸿蒙Next Ecc通过集成Ecc加密算法,提供了更高级别的数据保护和隐私安全,适用于各种智能设备,包括手机、平板、智能家居和物联网设备。

鸿蒙Next Ecc在系统架构上进行了优化,支持更高效的资源管理和任务调度,提升了设备的运行速度和响应能力。此外,它还引入了新的开发工具和API,方便开发者快速构建和部署应用程序。系统还支持多设备协同,用户可以在不同设备之间无缝切换和共享数据,提升了整体使用体验。

鸿蒙Next Ecc的发布标志着华为在操作系统领域的技术进步,特别是在数据安全和隐私保护方面的创新。通过采用先进的加密技术和优化系统性能,鸿蒙Next Ecc为用户提供了一个更加安全、高效和便捷的操作环境。

HarmonyOS NEXT ECC 是华为最新推出的操作系统版本,专为智能终端设备设计。它采用了微内核架构,具备高安全性和高效能,支持多设备协同和分布式能力。ECC(Error Correction Code)技术则增强了系统的稳定性和数据可靠性,适用于对数据完整性要求极高的应用场景。该版本进一步优化了性能,提升了用户体验,是华为在操作系统领域的重要创新。

回到顶部