키 매개변수를 사용하여 SM2 키 쌍 생성 (암호화 및 복호화)

발행: (2026년 2월 4일 오후 05:08 GMT+9)
3 분 소요
원문: Dev.to

Source: Dev.to

Question

SM2 암호화와 복호화에서 HarmonyOS는 ASN.1 직렬화된 키 데이터(91바이트 공개키, 51바이트 개인키)를 요구합니다. 하지만 대부분의 SM2 키 데이터는 원시, 비직렬화된 형태(64바이트 공개키, 32바이트 개인키)로 제공되며, 이를 바로 사용할 수 없습니다.

원시 SM2 키를 HarmonyOS 플랫폼에서 사용할 수 있는 ASN.1 직렬화된 SM2 키 쌍으로 변환하려면 어떻게 해야 할까요?

Short Answer

원시 파라미터를 이용해 SM2 키를 재구성하고, cryptoFramework를 사용해 적절한 ASN.1 사양으로 공개키와 개인키를 생성합니다.

Generate the SM2 public key from raw parameters

/**
 * Generate SM2 public key based on public key parameters
 * @param keyStr The general format of the public key parameter is 04 + x + y.
 * @returns SM2 public key
 */
async function convertStrToPubKey(keyStr: string): Promise {
  let pubKeyStr = keyStr.startsWith("04") ? keyStr.slice(2) : keyStr;
  let pkPart1 = pubKeyStr.slice(0, pubKeyStr.length / 2);
  let pkPart2 = pubKeyStr.slice(pubKeyStr.length / 2);
  // Enter hexadecimal in the corresponding position
  let pk: cryptoFramework.Point = {
    x: BigInt("0x" + pkPart1),
    y: BigInt("0x" + pkPart2),
  };
  // Public key object parameters
  let pubKeySpec: cryptoFramework.ECCPubKeySpec = {
    params: cryptoFramework.ECCKeyUtil.genECCCommonParamsSpec('NID_sm2'),
    pk: pk,
    algName: "SM2",
    specType: cryptoFramework.AsyKeySpecType.PUBLIC_KEY_SPEC,
  };
  let keypairGenerator = cryptoFramework.createAsyKeyGeneratorBySpec(pubKeySpec);
  return await keypairGenerator.generatePubKey();
}

Generate the SM2 private key from raw parameters

/**
 * Generate SM2 private key based on private key parameters
 * @param keyStr The private key parameter is generally a 128‑bit string.
 * @returns SM2 private key
 */
async function convertStrToPriKey(keyStr: string): Promise {
  let sk = BigInt("0x" + keyStr);
  // Private key object parameters
  let priKeySpec: cryptoFramework.ECCPriKeySpec = {
    params: cryptoFramework.ECCKeyUtil.genECCCommonParamsSpec('NID_sm2'),
    sk: sk,
    algName: "SM2",
    specType: cryptoFramework.AsyKeySpecType.PRIVATE_KEY_SPEC,
  };
  let keypairGenerator = cryptoFramework.createAsyKeyGeneratorBySpec(priKeySpec);
  return await keypairGenerator.generatePriKey();
}

자세한 내용은 SM2 Encryption and Decryption 문서를 참고하세요.

Applicable Scenarios

  • 원시 SM2 키 데이터(64바이트 공개키, 32바이트 개인키)가 제공될 때.
  • HarmonyOS에서 SM2 암호화·복호화를 위해 ASN.1 직렬화된 키 데이터(91바이트 공개키, 51바이트 개인키)를 요구할 때.
Back to Blog

관련 글

더 보기 »

🔒 HTTPS를 5살 아이에게 설명하듯

Full deep‑dive with code examples https://sreekarreddy.com/learn/eli5/https Postcard vs. Sealed Letter HTTP no S: 포스트카드와 같이 – 이를 다루는 누구든지 읽을 수 있다.