키 매개변수를 사용하여 SM2 키 쌍 생성 (암호화 및 복호화)
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바이트 개인키)를 요구할 때.