HarmonyOS 鸿蒙Next:256bit 公钥在安卓及Java平台上正常,在HarmonyOS 鸿蒙Next上使用提示 ConvertEcPubKey: d2i_EC_PUBKEY fail
HarmonyOS 鸿蒙Next:256bit 公钥在安卓及Java平台上正常,在HarmonyOS 鸿蒙Next上使用提示 ConvertEcPubKey: d2i_EC_PUBKEY fail 256bit 公钥在安卓以及java平台上正常,在鸿蒙上使用提示 ConvertEcPubKey: d2i_EC_PUBKEY fail
当前SM2密钥生成的参数只支持封装并ASN.1序列化后的数据; 需要注意的是在生成ECC密钥时要保证配置参数与SM2一致。 第一步在生成ECC密钥前设置以上参数,生成一个ECCCommonParamsSpec对象,作为生成密钥对象的参数之一:
genSM2CommonSpec(): cryptoFramework.ECCCommonParamsSpec {
let fieldFp: cryptoFramework.ECFieldFp = {
fieldType: "Fp",
p: BigInt("0xFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFF")
}
let G: cryptoFramework.Point = {
x: BigInt("0x32C4AE2C1F1981195F9904466A39C9948FE30BBFF2660BE1715A4589334C74C7"),
y: BigInt("0xBC3736A2F4F6779C59BDCEE36B692153D0A9877CC62A474002DF32E52139F0A0")
}
let SM2CommonSpec: cryptoFramework.ECCCommonParamsSpec = {
algName: "ECC",
specType: cryptoFramework.AsyKeySpecType.COMMON_PARAMS_SPEC,
field: fieldFp,
a: BigInt("0xFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFC"),
b: BigInt("0x28E9FA9E9D9F5E344D5A9E4BCF6509A7F39789F515AB8F92DDBCBD414D940E93"),
g: G,
n: BigInt("0xFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFF7203DF6B21C6052B53BBF40939D54123"),
h: 1
}
return SM2CommonSpec;
}
ECC的密钥对象有公钥私钥和密钥对三种,将上面得到的ECCCommonParamsSpec参数对象,加上公钥或私钥等其他数据,构成密钥参数对象,各参数对象的模板如下:
// 64字节公钥数据
let pk: cryptoFramework.Point = {
x: BigInt("0x5A033A9DBEF84C0784C897D070E6608C5AEED39B806DF82853D64E2A686A3794"),
y: BigInt("0xF9233D20DD878F642D61C2B0344988AE284646226767A1631BBB0DBB6DF40D07")
}
// 32字节私钥数据
let sk: bigint = BigInt("0x3629EFF03FBC86711F6695CBF5590F0F2FCAAA3C269A1CA9BD64FB4C70DF9C9F");
// 下面列出公钥、私钥和密钥对的参数模板,根据实际场景三选一
// 公钥对象参数
let pubKey: cryptoFramework.ECCPubKeySpec = {
params: this.genSM2CommonSpec(),
pk: pk,
algName: "ECC",
specType: cryptoFramework.AsyKeySpecType.PUBLIC_KEY_SPEC // 指定公钥类型
}
// 私钥对象参数
let priKey: cryptoFramework.ECCPriKeySpec = {
params: this.genSM2CommonSpec(),
sk: sk,
algName: "ECC",
specType: cryptoFramework.AsyKeySpecType.PRIVATE_KEY_SPEC // 指定私钥类型
}
// 密钥对对象参数
let keyPair: cryptoFramework.ECCKeyPairSpec = {
params: this.genSM2CommonSpec(),
sk: sk,
pk: pk,
algName: 'ECC',
specType: cryptoFramework.AsyKeySpecType.KEY_PAIR_SPEC // 指定密钥对类型
}
之后便是密钥对象的生成,这里以密钥对为例,将上面代码得到的密钥对参数对象keyPair传入createAsyKeyGeneratorBySpec得到一个密钥生成器,然后调用generateKeyPair即可得到ECC密钥对
let KeyPairGenerator: cryptoFramework.AsyKeyGeneratorBySpec;
KeyPairGenerator = cryptoFramework.createAsyKeyGeneratorBySpec(keyPair);
let KeyPair: cryptoFramework.KeyPair = await KeyPairGenerator.generateKeyPair()
.then((keyPair) => {
return keyPair;
})
.catch((e: Error):null => {
console.log(JSON.stringify(e))
return null;
})
return KeyPair
需要注意,如果创建密钥生成器createAsyKeyGeneratorBySpec传入的参数是公钥参数或私钥参数时,后面生成密钥对象则需要调对应的generatePubKey或generatePriKey来得到对应的公钥对象或私钥对象。
完成ECC的密钥对象创建后,下一步就是将ECC的密钥数据传入convertKey中来生成SM2密钥对象
// 参数keyPair为ECC密钥对
async convertKey(keyPair: cryptoFramework.KeyPair){
// 获取公钥数据
let pubKey = keyPair.pubKey;
let pubKeyArr: Uint8Array = pubKey.getEncoded().data;
let pubKeyBlob: cryptoFramework.DataBlob = { data: pubKeyArr };
// 获取私钥数据
let priKey = keyPair.priKey;
let priKeyArr: Uint8Array = priKey.getEncoded().data;
let priKeyBlob: cryptoFramework.DataBlob = { data: priKeyArr };
// 传入公私钥数据生成密钥对象
let generator = cryptoFramework.createAsyKeyGenerator("SM2_256");
generator.convertKey(pubKeyBlob, priKeyBlob)
.then(keyPair=>{
console.log("convert SM2 keyPair success")
})
.catch(err => {
console.log(JSON.stringify(e));
});
}
更多关于HarmonyOS 鸿蒙Next:256bit 公钥在安卓及Java平台上正常,在HarmonyOS 鸿蒙Next上使用提示 ConvertEcPubKey: d2i_EC_PUBKEY fail的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
针对帖子标题中提到的问题,“HarmonyOS 鸿蒙Next:256bit 公钥在安卓及Java平台上正常,在HarmonyOS 鸿蒙Next上使用提示 ConvertEcPubKey: d2i_EC_PUBKEY fail”,以下是专业回答:
HarmonyOS 鸿蒙Next在处理256bit公钥时与安卓及Java平台存在差异,可能是由于底层加密库或API实现的不同导致的。d2i_EC_PUBKEY fail
错误通常表明在解析EC(椭圆曲线)公钥时遇到了问题。这可能是由于公钥格式不兼容、加密库版本差异或特定的API调用方式不正确。
确保在HarmonyOS上使用的公钥格式与安卓及Java平台上的一致,并检查是否遵循了HarmonyOS的公钥处理规范。此外,确认所使用的加密库(如OpenSSL)版本及其API在HarmonyOS上的兼容性和正确性。由于HarmonyOS可能采用了不同于传统Android的加密实现,因此可能需要调整公钥处理逻辑以适应新的环境。
如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html。在那里,你可以获得更专业的技术支持和解决方案。