明文导入密钥(ArkTS)
分别以导入AES256与RSA2048密钥为例,具体的场景介绍及支持的算法规格
开发步骤
- 指定密钥别名keyAlias。 密钥别名的最大长度为64字节。
- 封装密钥属性集和密钥材料。
- 密钥属性集同样与密钥生成中指定的密钥属性一致,须包含[HuksKeyAlg]、[HuksKeySize]、[HuksKeyPurpose]属性。
- 密钥材料须符合[HUKS密钥材料格式],并以Uint8Array形式赋值给[HuksOptions]的inData字段。
- 调用[huks.importKeyItem],传入密钥别名和密钥属性集,即可导入密钥。
- 开发前请熟悉鸿蒙开发指导文档 :[
gitee.com/li-shizhen-skin/harmony-os/blob/master/README.md]
/* 以下以导入AES256密钥的Callback操作使用为例 */
import { huks } from "@kit.UniversalKeystoreKit"
/* 密钥材料 */
let plainTextSize32 = new Uint8Array([
0xfb, 0x8b, 0x9f, 0x12, 0xa0, 0x83, 0x19, 0xbe, 0x6a, 0x6f, 0x63, 0x2a, 0x7c, 0x86, 0xba, 0xca,
0x64, 0x0b, 0x88, 0x96, 0xe2, 0xfa, 0x77, 0xbc, 0x71, 0xe3, 0x0f, 0x0f, 0x9e, 0x3c, 0xe5, 0xf9
]);
/* 1.确定密钥别名 */
let keyAlias = 'AES256Alias_sample';
/* 2.封装密钥属性集和密钥材料 */
let properties: Array< huks.HuksParam > = [
{
tag: huks.HuksTag.HUKS_TAG_ALGORITHM,
value:huks.HuksKeyAlg.HUKS_ALG_AES
},
{
tag: huks.HuksTag.HUKS_TAG_KEY_SIZE,
value: huks.HuksKeySize.HUKS_AES_KEY_SIZE_256
},
{
tag: huks.HuksTag.HUKS_TAG_PURPOSE,
value: huks.HuksKeyPurpose.HUKS_KEY_PURPOSE_ENCRYPT | huks.HuksKeyPurpose.HUKS_KEY_PURPOSE_DECRYPT
},
]
let options: huks.HuksOptions = {
properties: properties,
inData: plainTextSize32
};
/* 3.明文导入密钥 */
try {
huks.importKeyItem(keyAlias, options, (error, data) = > {
if (error) {
console.error(`callback: importKeyItem failed` + error);
} else {
console.info(`callback: importKeyItem success`);
}
});
} catch (error) {
console.error(`callback: importKeyItem input arg invalid` + error);
}
/* 以下以导入RSA2048密钥的Callback操作使用为例 */
import { huks } from "@kit.UniversalKeystoreKit"
let rsa2048KeyPairMaterial = new Uint8Array([
0x01, 0x00, 0x00, 0x00, // 密钥算法(小端表示)huks.HuksKeyAlg.HUKS_ALG_RSA = 1
0x00, 0x08, 0x00, 0x00, // 密钥大小(比特):2048
0x00, 0x01, 0x00, 0x00, // 模数n长度(字节):256
0x03, 0x00, 0x00, 0x00, // 公钥指数e长度(字节):3
0x00, 0x01, 0x00, 0x00, // 私钥指数d长度(字节):256
// 模数n
0xc5, 0x35, 0x62, 0x48, 0xc4, 0x92, 0x87, 0x73, 0x0d, 0x42, 0x96, 0xfc, 0x7b, 0x11, 0x05, 0x06,
0x0f, 0x8d, 0x66, 0xc1, 0x0e, 0xad, 0x37, 0x44, 0x92, 0x95, 0x2f, 0x6a, 0x55, 0xba, 0xec, 0x1d,
0x54, 0x62, 0x0a, 0x4b, 0xd3, 0xc7, 0x05, 0xe4, 0x07, 0x40, 0xd9, 0xb7, 0xc2, 0x12, 0xcb, 0x9a,
0x90, 0xad, 0xe3, 0x24, 0xe8, 0x5e, 0xa6, 0xf8, 0xd0, 0x6e, 0xbc, 0xd1, 0x69, 0x7f, 0x6b, 0xe4,
0x2b, 0x4e, 0x1a, 0x65, 0xbb, 0x73, 0x88, 0x6b, 0x7c, 0xaf, 0x7e, 0xd0, 0x47, 0x26, 0xeb, 0xa5,
0xbe, 0xd6, 0xe8, 0xee, 0x9c, 0xa5, 0x66, 0xa5, 0xc9, 0xd3, 0x25, 0x13, 0xc4, 0x0e, 0x6c, 0xab,
0x50, 0xb6, 0x50, 0xc9, 0xce, 0x8f, 0x0a, 0x0b, 0xc6, 0x28, 0x69, 0xe9, 0x83, 0x69, 0xde, 0x42,
0x56, 0x79, 0x7f, 0xde, 0x86, 0x24, 0xca, 0xfc, 0xaa, 0xc0, 0xf3, 0xf3, 0x7f, 0x92, 0x8e, 0x8a,
0x12, 0x52, 0xfe, 0x50, 0xb1, 0x5e, 0x8c, 0x01, 0xce, 0xfc, 0x7e, 0xf2, 0x4f, 0x5f, 0x03, 0xfe,
0xa7, 0xcd, 0xa1, 0xfc, 0x94, 0x52, 0x00, 0x8b, 0x9b, 0x7f, 0x09, 0xab, 0xa8, 0xa4, 0xf5, 0xb4,
0xa5, 0xaa, 0xfc, 0x72, 0xeb, 0x17, 0x40, 0xa9, 0xee, 0xbe, 0x8f, 0xc2, 0xd1, 0x80, 0xc2, 0x0d,
0x44, 0xa9, 0x59, 0x44, 0x59, 0x81, 0x3b, 0x5d, 0x4a, 0xde, 0xfb, 0xae, 0x24, 0xfc, 0xa3, 0xd9,
0xbc, 0x57, 0x55, 0xc2, 0x26, 0xbc, 0x19, 0xa7, 0x9a, 0xc5, 0x59, 0xa3, 0xee, 0x5a, 0xef, 0x41,
0x80, 0x7d, 0xf8, 0x5e, 0xc1, 0x1d, 0x32, 0x38, 0x41, 0x5b, 0xb6, 0x92, 0xb8, 0xb7, 0x03, 0x0d,
0x3e, 0x59, 0x0f, 0x1c, 0xb3, 0xe1, 0x2a, 0x95, 0x1a, 0x3b, 0x50, 0x4f, 0xc4, 0x1d, 0xcf, 0x73,
0x7c, 0x14, 0xca, 0xe3, 0x0b, 0xa7, 0xc7, 0x1a, 0x41, 0x4a, 0xee, 0xbe, 0x1f, 0x43, 0xdd, 0xf9,
// 公钥指数e
0x01, 0x00, 0x01,
// 私钥指数d
0x88, 0x4b, 0x82, 0xe7, 0xe3, 0xe3, 0x99, 0x75, 0x6c, 0x9e, 0xaf, 0x17, 0x44, 0x3e, 0xd9, 0x07,
0xfd, 0x4b, 0xae, 0xce, 0x92, 0xc4, 0x28, 0x44, 0x5e, 0x42, 0x79, 0x08, 0xb6, 0xc3, 0x7f, 0x58,
0x2d, 0xef, 0xac, 0x4a, 0x07, 0xcd, 0xaf, 0x46, 0x8f, 0xb4, 0xc4, 0x43, 0xf9, 0xff, 0x5f, 0x74,
0x2d, 0xb5, 0xe0, 0x1c, 0xab, 0xf4, 0x6e, 0xd5, 0xdb, 0xc8, 0x0c, 0xfb, 0x76, 0x3c, 0x38, 0x66,
0xf3, 0x7f, 0x01, 0x43, 0x7a, 0x30, 0x39, 0x02, 0x80, 0xa4, 0x11, 0xb3, 0x04, 0xd9, 0xe3, 0x57,
0x23, 0xf4, 0x07, 0xfc, 0x91, 0x8a, 0xc6, 0xcc, 0xa2, 0x16, 0x29, 0xb3, 0xe5, 0x76, 0x4a, 0xa8,
0x84, 0x19, 0xdc, 0xef, 0xfc, 0xb0, 0x63, 0x33, 0x0b, 0xfa, 0xf6, 0x68, 0x0b, 0x08, 0xea, 0x31,
0x52, 0xee, 0x99, 0xef, 0x43, 0x2a, 0xbe, 0x97, 0xad, 0xb3, 0xb9, 0x66, 0x7a, 0xae, 0xe1, 0x8f,
0x57, 0x86, 0xe5, 0xfe, 0x14, 0x3c, 0x81, 0xd0, 0x64, 0xf8, 0x86, 0x1a, 0x0b, 0x40, 0x58, 0xc9,
0x33, 0x49, 0xb8, 0x99, 0xc6, 0x2e, 0x94, 0x70, 0xee, 0x09, 0x88, 0xe1, 0x5c, 0x4e, 0x6c, 0x22,
0x72, 0xa7, 0x2a, 0x21, 0xdd, 0xd7, 0x1d, 0xfc, 0x63, 0x15, 0x0b, 0xde, 0x06, 0x9c, 0xf3, 0x28,
0xf3, 0xac, 0x4a, 0xa8, 0xb5, 0x50, 0xca, 0x9b, 0xcc, 0x0a, 0x04, 0xfe, 0x3f, 0x98, 0x68, 0x81,
0xac, 0x24, 0x53, 0xea, 0x1f, 0x1c, 0x6e, 0x5e, 0xca, 0xe8, 0x31, 0x0d, 0x08, 0x12, 0xf3, 0x26,
0xf8, 0x5e, 0xeb, 0x10, 0x27, 0xae, 0xaa, 0xc3, 0xad, 0x6c, 0xc1, 0x89, 0xdb, 0x7d, 0x5a, 0x12,
0x55, 0xad, 0x11, 0x19, 0xa1, 0xa9, 0x8f, 0x0b, 0x6d, 0x78, 0x8d, 0x1c, 0xdf, 0xe5, 0x63, 0x82,
0x0b, 0x7d, 0x23, 0x04, 0xb4, 0x75, 0x8c, 0xed, 0x77, 0xfc, 0x1a, 0x85, 0x29, 0x11, 0xe0, 0x61,
]);
/* 1.确定密钥别名 */
let keyAlias = 'RSA_sample';
/* 2.封装密钥属性集和密钥材料 */
let properties: Array< huks.HuksParam > = [
{
tag: huks.HuksTag.HUKS_TAG_ALGORITHM,
value:huks.HuksKeyAlg.HUKS_ALG_RSA
},
{
tag: huks.HuksTag.HUKS_TAG_KEY_SIZE,
value: huks.HuksKeySize.HUKS_RSA_KEY_SIZE_2048
},
{
// 此 tag表示密钥导入后的用途,导入后将不可更改
tag: huks.HuksTag.HUKS_TAG_PURPOSE,
value: huks.HuksKeyPurpose.HUKS_KEY_PURPOSE_ENCRYPT | huks.HuksKeyPurpose.HUKS_KEY_PURPOSE_DECRYPT
},
{
// 此 tag表示需导入的密钥类型
tag: huks.HuksTag.HUKS_TAG_IMPORT_KEY_TYPE,
// 此 value表示导入密钥对,若改为HUKS_KEY_TYPE_PUBLIC_KEY时表示仅导入公钥
value: huks.HuksImportKeyType.HUKS_KEY_TYPE_KEY_PAIR
},
]
let options: huks.HuksOptions = {
properties: properties,
inData: rsa2048KeyPairMaterial
};
/* 3.明文导入密钥 */
try {
huks.importKeyItem(keyAlias, options, (error, data) = > {
if (error) {
console.error(`callback: importKeyItem failed` + error);
} else {
console.info(`callback: importKeyItem success`);
}
});
} catch (error) {
console.error(`callback: importKeyItem input arg invalid` + error);
}
调测验证
调用[huks.isKeyItemExist]验证密钥是否存在,如密钥存在即表示密钥导入成功。

`HarmonyOS与OpenHarmony鸿蒙文档籽料:mau123789是v直接拿`
import { huks } from "@kit.UniversalKeystoreKit";
let keyAlias = 'AES256Alias_sample';
let isKeyExist = false;
let keyProperties: Array< huks.HuksParam > = [
{
tag: huks.HuksTag.HUKS_TAG_ALGORITHM,
value: huks.HuksKeyAlg.HUKS_ALG_AES
}
]
let huksOptions: huks.HuksOptions = {
properties: keyProperties, // 非空填充
inData: new Uint8Array(new Array()) // 非空填充
}
try {
huks.isKeyItemExist(keyAlias, huksOptions, (error, data) = > {
if (error) {
console.error(`callback: isKeyItemExist failed` + error);
} else {
if (data !== null && data.valueOf() !== null) {
isKeyExist = data.valueOf();
console.info(`callback: isKeyItemExist success, isKeyExist = ${isKeyExist}`);
}
}
});
} catch (error) {
console.error(`callback: isKeyItemExist input arg invalid` + error);
}
审核编辑 黄宇
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。
举报投诉
-
密钥
+关注
关注
1文章
153浏览量
21041 -
鸿蒙
+关注
关注
60文章
3021浏览量
46178
发布评论请先 登录
相关推荐
热点推荐
在SE050C1中生成 ECC NIST p-521 密钥对遇到的疑问求解
我正在尝试使用即插即用中间件在 ESP32 的SE050C1中生成 NIST p-521 密钥对。
我尝试打开一个安全会话并尝试生成密钥,但我未能打开一个安全会话 SCP03,然后我尝试使用普通会话
发表于 04-20 06:50
i.MX93 ELE 密钥存储持久密钥生成 NVM 错误怎么办?
密钥存储 (0xabcd/0x1234)
打开密钥管理服务
将尝试生成持久密钥
SAB 错误:SAB CMD [0x42] Resp [0x
发表于 03-18 07:04
探索TDK SmartMotion DK-UNIVERSAL-I开发套件:硬件用户指南
探索TDK SmartMotion DK-UNIVERSAL-I开发套件:硬件用户指南 在当今的电子科技领域,开发套件对于工程师们快速评估和开发基于传感器的解决方案至关重要。今天,我们
DES轮密钥产生模块结构设计
DES轮密钥产生模块中的置换选择PC-1、循环左移、置换选择PC-2均采用assign语句实现,配合一个二选一选通器和一个十六选一选通器实现。其中二选一选通器以mode模式判断信号为选通信
发表于 10-30 07:13
非对称密钥生成和转换规格详解
当前章节将说明系统目前支持的算法及其对应的规格。密钥生成有两种指定规格的方式,分别是:
字符串参数:以字符串的形式描述开发者需要生成的密钥规格。
密钥参数:使用
发表于 09-01 07:50
RIGOL示波器支持GHz级量子密钥分发测试
一、引言 1.1量子密钥分发技术的重要性 在信息时代,数据安全至关重要。传统加密技术虽广泛应用,但存在被量子计算机破解的风险。量子密钥分发技术基于量子力学原理,能实现无条件安全的密钥传输。它使通信
根据Datasheet里cyT2B5L有1024位otp,全部都能用来存储密钥吗?
1)项目上有要求把密钥存在安全模块存储区域的要求
2)根据Datasheet里cyT2B5L有1024位otp,全部都能用来存储密钥吗?还是其中的192位能用来储存密钥。
3)有详细的说明文
发表于 07-14 07:17
鸿蒙5开发宝藏案例分享---穿戴开发宝藏指南
太棒了!鸿蒙官方文档里竟然藏着这么个大宝藏!之前开发智能穿戴应用时感觉资源匮乏,没想到在“最佳实践”里藏着这么多 现成的、高质量的案例和代码 !今天必须跟大家好好分享一下这个“轻量级智能穿戴开发实践
发表于 06-12 16:12
使用DevEcoStudio 开发、编译鸿蒙 NEXT_APP 以及使用中文插件
的一站式集成开发环境(IDE),专为鸿蒙操作系统(HarmonyOS Next)应用和服务开发设计 DevEco Studio,掌握基本操作和开发
发表于 06-11 17:18
HarmonyOS5云服务技术分享--ArkTS开发函数
等打包
✅ 支持Node.js 14.x/18.x和Java 1.8
✅ 支持HTTP触发器调用
✅ 持续开发调试一条龙
?️ 准备工作:
安装AGCLI工具(华为应用分发服务命令行工具)
准备测试
发表于 05-22 17:29
HarmonyOS5云服务技术分享--ArkTS开发Node环境
能力,尤其适合需要快速响应、弹性扩容的场景。通过ArkTS API 9+,你可以轻松实现:
事件驱动:比如用户登录、数据更新时自动触发逻辑。
零运维:无需管理服务器,专注业务代码
发表于 05-22 17:21
HarmonyOS5云服务技术分享--账号登录文章整理
嘿,各位开发者朋友!今天咱们来聊一聊鸿蒙生态中备受关注的ArkTS(API 12),尤其是如何用它快速实现华为账号登录功能。不管你是刚接触HarmonyOS的新手,还是想升级现有项目的技术咖
发表于 05-22 16:16
HarmonyOS5云服务技术分享--认证文档问题
各位开发者朋友好!本文将详细讲解如何基于HarmonyOS ArkTS框架集成华为AppGallery Connect(AGC)认证服务,涵盖从项目创建到SDK集成全流程。无论您是首次接入AGC
发表于 05-22 13:20
鸿蒙开发:Universal Keystore Kit密钥管理服务 明文导入密钥 ArkTS
评论