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

阅读 553
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));
}