HarmonyOS 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位,与服务端及其他客户端不能通用,有什么办法能转成通用的公私钥对?

阅读 551
1 个回答

这个是由于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));
}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进