HarmonyOS SM2 密钥生成怎么和其他平台对齐?

使用系统创建的 SM2 私钥和公钥长度和其他平台生成的不一致。

需要生成公钥提供给其他平台如Java用于验签,私钥用于签名。同时也要用私钥来进行解密。

export function generateSM2Key(): Record<string, string | undefined> {
  // 创建一个AsyKeyGenerator实例
  let sm2Generator = cryptoFramework.createAsyKeyGenerator('SM2_256');
  // 使用密钥生成器随机生成非对称密钥对
  let keyPair = sm2Generator.generateKeyPairSync();
  let pubKey = keyPair.pubKey;
  let priKey = keyPair.priKey;
  // 获取非对称密钥对的二进制数据
  let pkBlob = pubKey.getEncoded();
  let skBlob = priKey.getEncoded();
  console.info('pk bin data' + pkBlob.data);
  console.info('sk bin data' + skBlob.data);
  let pubKeyBase64 = base64.encodeToStringSync(pkBlob.data);
  let priKeyBase64 = base64.encodeToStringSync(skBlob.data);
  let result: Record<string, string> = {};
  result["pubkey"] = pubKeyBase64;
  result["privatekey"] = priKeyBase64;
  return result;
}
阅读 415
1 个回答

使用下面代码即可:

let keypairGenerator = cryptoFramework.createAsyKeyGenerator("SM2_256")
let key = keypairGenerator.generateKeyPairSync();
let x = key.pubKey.getAsyKeySpec(cryptoFramework.AsyKeySpecItem.ECC_PK_X_BN);
let y = key.pubKey.getAsyKeySpec(cryptoFramework.AsyKeySpecItem.ECC_PK_Y_BN);
let sm2Key = x.toString(16)+y.toString(16)
console.log(sm2Key);
let sk = key.priKey.getAsyKeySpec(cryptoFramework.AsyKeySpecItem.ECC_SK_BN);
console.log("sm2Key===>"+sk.toString(16));