查看: 111|回复: 3

HarmonyOS 6.1 Crypto Kit 实战:从私钥剥离公钥

[复制链接]
发表于 2 小时前 | 显示全部楼层 |阅读模式
在端云协同或离线通信场景中,非对称加密的密钥分发一直是个难题:传统上需要同时持有私钥和公钥,或者依赖网络从服务器下载密钥对。但在某些脱网环境(如智能卡读取、加密狗植入),终端往往只能拿到一串裸私钥二进制流。如何在本地安全地推导出对应的公钥,一度需要引入庞大的第三方库如 OpenSSL,导致应用体积膨胀且内存安全难以保障。

HarmonyOS NEXT 6.1(API 23)的 Crypto Architecture Kit 从架构层面解决了这一痛点——为 PriKey 对象新增了 getPubKey() 和 getPubKeySync() 两个方法。开发者仅凭一把私钥,就能在端侧安全无损地剥离重构出配套公钥,彻底摆脱“全量密钥对分发协议”的束缚。

核心机制与底层链路
新 API 并非直接对一段 Uint8Array 二进制调用 getPubKey,而是需要先通过 Crypto 引擎将裸私钥流转换为引擎可识别的 PriKey 对象。转换的关键步骤是使用 createAsyKeyGenerator 创建非对称生成器,然后调用 convertKeySync,并将公钥参数传入 null,表示只注入私钥。后续即可在 PriKey 对象上调用 getPubKey 或 getPubKeySync 获得公钥,再通过 getEncoded 导出公钥裸流。整个过程无需依赖网络,且基于系统级硬件加密库,保障安全与性能。

实战:构建密钥衍生控制舱
以下是一个完整的工程化示例,演示如何从裸私钥流异步/同步剥离公钥,并与预期公钥进行字节级比对。代码位于 CryptoDemo.ets 中。
  1. import { cryptoFramework } from '@kit.CryptoArchitectureKit';
  2. import { buffer } from '@kit.ArkTS';
  3. import { promptAction } from '@kit.ArkUI';
  4. @Entry
  5. @Component
  6. struct CryptoDemo {
  7.   @State log: string = '等待中控台指令...\n';
  8.   @State isExtracting: boolean = false;
  9.   @State extractedPubKeyData: string = '';
  10.   // 模拟从外部(如网络或本地安全区)加载的裸私钥二进制流 (RSA1024)
  11.   private readonly skData = new Uint8Array([48, 130, 2, 119, 2, 1, 0, 48, /* ...此处省略大量字节... */ 248, 148, 151]);
  12.   // 预期的裸公钥二进制流(用于比对验证剥离是否无损)
  13.   private readonly expectPkdata = new Uint8Array([48, 129, 159, 48, /* ...此处省略大量字节... */ 3, 1, 0, 1]);
  14.   async extractPubKey(useSync: boolean) {
  15.     this.isExtracting = true;
  16.     this.extractedPubKeyData = '';
  17.     try {
  18.       let rsaGenerator = cryptoFramework.createAsyKeyGenerator('RSA1024');
  19.       let skDataBlob: cryptoFramework.DataBlob = { data: this.skData };
  20.       // 关键:注入私钥,公钥传 null
  21.       let keyPair = rsaGenerator.convertKeySync(null, skDataBlob);
  22.       let priKey = keyPair.priKey;
  23.       let pubkey: cryptoFramework.PubKey;
  24.       if (useSync) {
  25.         pubkey = priKey.getPubKeySync();
  26.       } else {
  27.         pubkey = await priKey.getPubKey();
  28.       }
  29.       let pkBlob = pubkey.getEncoded();
  30.       // 字节级比对
  31.       let isValid: boolean = buffer.from(pkBlob.data).compare(this.expectPkdata) === 0;
  32.       if (isValid) {
  33.         this.extractedPubKeyData = Array.from(pkBlob.data).map(b => b.toString(16).padStart(2, '0')).join('').substring(0, 48) + '...';
  34.         promptAction.showToast({ message: '公钥提取成功' });
  35.       }
  36.     } catch (e) {
  37.       // 错误处理
  38.     } finally {
  39.       this.isExtracting = false;
  40.     }
  41.   }
  42. }
复制代码

避坑指南
- 类型强校验:传入 convertKeySync 的数据必须是合法的 Uint8Array。如果服务端返回 Base64 编码的密钥,务必先使用 util.Base64Helper 解码,切忌用 any 绕过类型检查。
- 同步 vs 异步:对于 RSA1024 等短密钥,getPubKeySync 可瞬间完成;但对于 RSA4096 或国密 SM2 等复杂算法,推荐使用基于 Promise 的 getPubKey(),避免主线程卡顿甚至触发 Watchdog 超时。
- 算法严格匹配:用 RSA1024 生成器只能处理 RSA1024 规格的私钥数据流。若传入 RSA2048 的数据,底层在 convertKeySync 时会抛出错误码 17620002(参数转换失败),务必严格对齐算法与密钥长度。

总结
Crypto Architecture Kit 在 API 23 的私钥剥离公钥能力,看似是微小函数新增,实则为端侧密码学架构带来重要突破。它让终端设备仅需最核心的 Private Key 种子,就能本地安全衍生出配套公钥,大幅降低带宽与存储开销。在无网、离线、近场认证等严苛场景中,该特性成为开发者的利器。
回复

使用道具 举报

发表于 2 小时前 | 显示全部楼层

Re: HarmonyOS 6.1 Crypto Kit 实战:从私钥剥离公钥

感谢楼主的详细实战分享!这个新 API 确实精准切中了离线场景的痛点,尤其是在智能卡、加密狗这类脱网设备上,以前靠 OpenSSL 自解析不仅体积大,还容易引入安全漏洞。您给出的示例代码逻辑清晰,特别是同步/异步选择的提醒很实用——对于短密钥用同步减少异步开销,长密钥用异步避免阻塞主线程,这个建议很关键。 我有一个小疑问:文中提到 convertKeySync 的公钥参数传 null,那如果开发者不小心传入了一个错误的公钥数据(非 null),API 会直接报错还是会尝试合并导致异常?另外,针对 SM2 这类国密算法,这个 getPubKey() 是否也同样可用?期待后续能有 SM2 的实战例子。
回复 支持 反对

使用道具 举报

发表于 2 小时前 | 显示全部楼层

Re: HarmonyOS 6.1 Crypto Kit 实战:从私钥剥离公钥

这个 API 的推出确实很实用,尤其是在资源受限的国产设备上,能省去引入 OpenSSL 这类重量级库的麻烦。看完代码示例后有个小疑问:对于 SM2 这类国密算法,convertKeySync 注入私钥时公钥传 null 的写法是通用的吗?另外,getPubKey 异步方法在高负载场景下会不会有额外的资源回收问题?期待楼主后续分享更多关于不同算法的兼容性测试。
回复 支持 反对

使用道具 举报

发表于 2 小时前 | 显示全部楼层

Re: HarmonyOS 6.1 Crypto Kit 实战:从私钥剥离公钥

感谢分享!这个 API 的引入确实很实用,尤其在离线或裸私钥场景下,省去了集成第三方库的麻烦。你提到的 `convertKeySync(null, skDataBlob)` 传 null 给公钥参数的细节很关键,之前没注意到这个用法。另外,关于同步异步的选择建议也很有价值,特别是长密钥场景下确实要注意主线程卡顿。 想请教一下:如果私钥是经过加密保护的(比如带密码的 PEM 格式),是否还需要先解密成裸流再调用这个流程?或者 Crypto Kit 有直接处理加密密钥的接口吗?
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

指导单位

江苏省公安厅

江苏省通信管理局

浙江省台州刑侦支队

DEFCON GROUP 86025

Hacking Group 021A

旗下站点

态势感知中心

应急响应中心

红盟安全

联系我们

官方QQ群:112851260

官方邮箱:security#ihonker.org(#改成@)

官方核心成员

关注微信公众号

Archiver|手机版|小黑屋| ( 沪ICP备2021026908号 )

GMT+8, 2026-7-28 13:26 , Processed in 0.026511 second(s), 18 queries , Gzip On, Redis On.

Powered by ihonker.com

Copyright © 2015-现在.

  • 返回顶部