HarmonyOS 鸿蒙Next SM2生成秘钥对的长度问题

发布于 1周前 作者 itying888 最后一次编辑是 5天前 来自 鸿蒙OS

HarmonyOS 鸿蒙Next 关于SM2生成秘钥对的长度问题

export function generateSM2Key() {
  let sm2Generator =
    cryptoFramework.createAsyKeyGenerator('SM2_256'); // 使用密钥生成器随机生成非对称密钥对 
  let keyGenPromise = sm2Generator.generateKeyPair();
  keyGenPromise.then(keyPair => {
    let pubKey = keyPair.pubKey;
    let priKey =
      keyPair.priKey; // 获取非对称密钥对的二进制数据 
    let pkBlob = pubKey.getEncoded();
    let skBlob = priKey.getEncoded();
    console.info('pk bin data' + pkBlob.data.length);
    console.info('sk bin data' + skBlob.data);
  });
}

如上,生成的公私钥长度为91位,与服务端及其他客户端不能通用,请问有什么办法能转成通用的公私钥对?


更多关于HarmonyOS 鸿蒙Next SM2生成秘钥对的长度问题的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html

2 回复

由于openssl底层返回的数据直接透传返回的,中间不作任何操作,是为了防止数据在拼接的时候被截取到,保证安全性。openssl底层返回的数据规范是,高位是0的情况下默认不显示,即在返回的时候需要业务实现下,x、y的长度是固定的64长度即32字节,判断是否满足进行首位高位补0即可,修改后代码如下,在生成公钥的时候,需要做补位判断:

function generateSM2Key() {
  let sm2Generator = cryptoFramework.createAsyKeyGenerator('SM2_256');
  // 使用密钥生成器随机生成非对称密钥对
  let keyPair = sm2Generator.generateKeyPairSync();
  let pubKey = keyPair.pubKey;
  let priKey = keyPair.priKey;
  let x = pubKey.getAsyKeySpec(cryptoFramework.AsyKeySpecItem.ECC_PK_X_BN);
  let y = pubKey.getAsyKeySpec(cryptoFramework.AsyKeySpecItem.ECC_PK_Y_BN);
  let C1x = x.toString(16)
  let C1y = y.toString(16)
  if (C1x.length != 64) {
    C1x = '0' + C1x
  }
  if (C1y.length != 64) {
    C1y = '0' + C1y
  }
  let sm2PubKey = C1x+C1y
  console.log('SM2 pubkey length : ', sm2PubKey.length)
  console.log('SM2 pubkey : ', sm2PubKey);
  let sm2PriKey = priKey.getAsyKeySpec(cryptoFramework.AsyKeySpecItem.ECC_SK_BN);
  console.log('SM2 priKey : ', sm2PriKey.toString(16));
}

更多关于HarmonyOS 鸿蒙Next SM2生成秘钥对的长度问题的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


关于HarmonyOS 鸿蒙Next SM2生成秘钥对的长度问题,通常SM2算法生成的公钥和私钥长度是固定的。然而,在不同框架或库中实现时,可能会因为编码方式、格式封装等因素导致长度有所差异。

在HarmonyOS中,如果使用密钥库(HUKS)生成SM2密钥对,导出的公钥(x509格式)可能是92字节,这与某些服务端期望的公钥长度(如使用ConvertX509ToECPublicKey方法时期望的ECC格式公钥,通常为91字节)不符。这可能是因为HUKS生成的密钥对是SM2格式,而服务端的方法不支持该格式。

为了解决这个问题,可以考虑以下几种方法:

  1. 确认服务端支持的公钥格式,并尝试将HUKS生成的SM2公钥转换为相应的格式。
  2. 使用HarmonyOS提供的加解密算法框架生成SM2密钥对,该框架生成的公钥通常与服务端期望的格式兼容。

如果以上方法无法解决问题,可能是由于其他技术细节或配置问题导致。建议仔细检查相关代码和配置,或参考HarmonyOS官方文档和开发者社区以获取更多帮助。

回到顶部