【关键字】
SM2 / HUKS / 长度不对 / ConvertX509ToECPublicKey / 提取公钥
【问题描述】
App需要使用密钥库生成SM2密钥,对数据进行签名,然后把SM2公钥传送给服务端,服务端使用公钥进行验签,但服务端解析公钥失败。
密钥库(HUKS)生成SM2密钥对,导出公钥(x509)是92字节,我们的后端无法通过ConvertX509ToECPublicKey来提取公钥,提示长度不对如下图所示。
但用加解密算法框架生成的SM2公钥长度91字节如下图所示,是可以提取的。
提取密钥库公钥代码如下:
public static CreateKeyTest() {
let keyAlias = "sm2KeyTest"
//================option============================//
let properties: Array<huks.HuksParam> = new Array();
properties[0] = {
tag: huks.HuksTag.HUKS_TAG_ALGORITHM,
value: huks.HuksKeyAlg.HUKS_ALG_SM2
};
properties[1] = {
tag: huks.HuksTag.HUKS_TAG_KEY_SIZE,
value: huks.HuksKeySize.HUKS_SM2_KEY_SIZE_256
};
properties[2] = {
tag: huks.HuksTag.HUKS_TAG_PURPOSE,
value: huks.HuksKeyPurpose.HUKS_KEY_PURPOSE_SIGN | huks.HuksKeyPurpose.HUKS_KEY_PURPOSE_VERIFY
};
let options: huks.HuksOptions = {
properties: properties
}
//================option============================//
huks.generateKeyItem(keyAlias, options, (error, data) => {
if (!error) {
huks.exportKeyItem(keyAlias, options).then((data) => {
let huksPubKey = data.outData as Uint8Array;
let base64 = new util.Base64Helper();
let result = base64.encodeToStringSync(huksPubKey);
})
}
});
}
【解决方案】
加解密算法框架生成秘钥是ECC格式的,秘钥库生成的秘钥是SM2格式的。当前使用的ConvertX509ToECPublicKey方法不支持SM2格式的。
建议直接使用加密算法框架的,或者将秘钥库生成的秘钥格式转成ECC的来解决此问题。