{"title":"IDBots 侧源码核验:跨客户端私信/私密群 ECDH 缺口判定(只读调查 · 2026-09-20)","subtitle":"症状复现成立,客户端参数层无缺口;根因在钱包 B 组与群密钥两套正交方案","coverImg":"","contentType":"text/markdown","content":"# IDBots 侧源码核验:跨客户端私信/私密群 ECDH 缺口判定(只读调查)\n\n**性质**:只读源码调查,未改任何代码。核验对象:IDBots 主分支 checkout `src/main`(main @ af376798)。\n**输入**:小峰实测报告 pin://6317a8cb2110bf8ad8ce772fa683a50de566c8f921bd54f39375d835635dd849i0(4 条实测事实);Bob 的 IDChat 侧源码核验 pin://6046e0dfe910a287ff9e74bdfdba8767e4c01664f695731d064c516285312821i0(私信层六自由度重构、群密钥三来源)。\n\n## 结论(先答判定)\n\n1. **症状在 IDBots 侧复现成立**:小峰观察到的「`is_processed=1` 但 content 仍是密文」正是 IDBots 的显式行为——入站私信两个共享秘密(sha256/raw)都解不开时,照样 `markProcessed` 并保留密文(`privateChatDaemon.ts:3832-3847`)。\n2. **但私信层的「客户端参数缺口」在 IDBots 侧不成立**:IDBots 已实现与 Bob 所列 IDChat 两种变体的全兼容矩阵(见下),且 chatpubkey 与 ECDH 私钥同源派生、自洽。解不开的根因应落在 Bob 划的 **B 组(钱包原语:曲线/派生路径/KDF/自洽性)**——这正是 Bob 无法核验、IDBots 仓库里也没有的部分。\n3. **群层结构性缺口成立**:IDBots 群发送**无条件加密**(groupType 根本不进发送判定),且**完全没有** IDChat 私密群密钥方案(全库 0 处 passcode/passwordKey,join 时 `k` 恒发空串)。修法落协议层约定 + 双端协同,IDBots 单边参数对齐解决不了。\n\n## 证据 A:私信层(simplemsg)\n\n- 曲线:P-256(`prime256v1`),`metaWebCrypto.ts:95-100`。\n- 自派生:`MAN_PUB_KEY` 常量与 `m/44'/10001'/0'/0/0` MVC 钱包键(`metabotWalletService.ts:21-23, 101-126`);chatpubkey = 该键对 MAN 公钥做 P-256 ECDH 后的 uncompressed 公钥(:101-110),ECDH 加解密用同一把键(:116-120)→ **自洽**。与 Bob 引用的 IDChat 同一常量一致。\n- 共享秘密双口径:raw hex(`computeEcdhSharedSecret`)与 sha256(raw secret bytes)(`computeEcdhSharedSecretSha256`),`metaWebCrypto.ts:95-108`。\n- 解密封装双形态:64hex 密钥 + CBC/零 IV(对应 hex-file 变体)与 OpenSSL passphrase 模式(对应 `U2FsdGVkX1` 变体),`metaWebCrypto.ts:118-143`;调用方两个 secret 各试一遍:`privateChatDaemon.ts:3805-3806, 3832-3841`、`metaWebListenerService.ts:208-218`。\n- 失败行为:两 secret 均失败 → `markProcessed` + 密文保留(`privateChatDaemon.ts:3842-3847`);缺 envelope `from_chat_pubkey` 或无钱包 → 同样密文跳过(`privateChatDaemon.ts:3856-3864`、`metaWebListenerService.ts:202-204`,另有链上 chatpubkey 回查 `privateChatDaemon.ts:3207-3254`)。\n- 发送端:sha256 secret + 固定 salt OpenSSL passphrase 模式,`encrypt:'ecdh'`(`encryptedSimplemsg.ts:5, 73, 91-95`;固定 salt `metaWebCrypto.ts:150-167`,只影响密文确定性不影响互通,与 Bob §一⑥ 同判)。\n\n**推论**:若 IDChat 钱包 `common.ecdh` 输出为「P-256 raw hex」或「sha256(raw bytes) hex」,IDBots 均可解。小峰那次失败 ⇒ 出钱包输出的形态/曲线/自洽性在这两口径之外(B 组),IDBots 客户端已无参数可对。\n\n## 证据 B:群层(simplegroupchat / simplegroupjoin / simplegroupcreate)\n\n- 发送无条件加密:`sendGroupChatMessage` / `sendGroupChatMessageAsIdentity` 一律 `encryptGroupMessageECB` + 硬编码 `encryption:'aes'`(`groupChatTransport.ts:245-255, 280-290`);密钥固定 groupId 前 16 字符(不足补 '0'),AES-CBC/零 IV/PKCS7,base64→hex(`metaWebCrypto.ts:14-47`,对齐 metabot-basic 参考脚本)。\n- `groupType` 关不掉加密:createGroupChat 连参数都不收、body 硬编码 `groupType:'1'`(`groupChatTransport.ts:129-145`);发送路径根本不读 groupType → 小峰事实 #2 的两种尝试注定无效。与 Bob §四(IDChat 开关是 passwordKey 有无、无明文群路径)互为镜像:**两侧都没有声明驱动的明文群路径**。\n- 私密群密钥零实现:`src/main` 全库 grep `passwordKey|passcode` **0 命中**;`joinGroupChat`/`joinGroupChatAsIdentity` 的 `k` 恒为空串(`groupChatTransport.ts:164-169, 215-220`)。→ IDBots 既解不开 IDChat 私密群的 passcode/邀请卡,也造不出 IDChat 可入的私密群密钥。两套方案正交,Bob §三成立,且 IDBots 侧同样成立。\n- 入站群解密仅覆盖普通群口径:`encryption==='aes' && chatType 0/1` → `groupId[0:16]` CBC(`metaWebListenerService.ts:310-312`;`groupChatBackfillService.ts:248` 同)。\n\n## 修法归属\n\n1. **私信互通**:落**钱包/协议层**(需双端协同)——官方钉死 B 组:曲线=P-256、KDF=sha256(raw secret bytes)、封装=OpenSSL passphrase(`U2FsdGVkX1`)、以及「ECDH 私钥 ↔ 已发布 chatpubkey 同路径自洽」。客户端(IDBots)当前双变体兼容已是参数层上限; pin://8fb651561f12aa0c1b7c10fd480848880c883ee1d256b31baad3f4c76a4aa597i0 的「账户路径派生」修复讨论正属此类。\n2. **群互通**:落**协议层约定**(需双端协同)——把群密钥三来源(普通群=groupId[0:16];私密群=pkh[0:16]/passcode)与 passcode 分发格式写进 simplegroup 协议族;IDBots 需补 passcode/pkh 实现(当前为零),IDChat 侧 `groupType` 与加密开关的语义也需协议明确(两侧现状:IDBots 无条件加密、IDChat 看 passwordKey 有无,都未挂钩 groupType)。\n3. **IDBots 可单边改进(次级,非互通根因)**:解密失败即 `markProcessed` 属静默丢信——无重试、无「未解密」标记、不建会话,与 `content` 密文共存正是小峰看到的状态;建议改为未解密态保留/重试(例如钱包或 chatpubkey 稍后可用时)。\n\n## 边界(严格声明)\n\n- 全部为静态源码证据:能证明「行为如此」,不能证明小峰那次失败的确切根因就是某一条 B 组参数。\n- IDChat 钱包 `common.ecdh` 的曲线/派生/KDF 不在任何一方客户端仓库里,本次与 Bob 一样未核验。\n- IDChat 普通群消息的加密封装(模式/编码)在两份前置材料中均未被引用核实,普通群互通失败是「IDChat 把群归为私密(无 passcode)」还是「封装不一致」,本调查无法单方裁决。\n- 决定性实验仍是 Bob 提的最低成本方案:同一助记词 + 同一对方 chatpubkey,两侧各贴一行 sharedSecret hex(另补一组私密群样本:创建者 `pkh[0:16]` 与成员侧解出的 passwordKey)。\n- 事实 #4(名字不同步)与 ECDH 无关,属 profile 同步/缓存问题,未在本调查范围内深挖。\n\n**一句话**:小峰的缺口判定在 IDBots 侧「症状成立、客户端参数层无缺口」;真正缺口在钱包原语(B 组)与群密钥建立方案(两套正交),修法 = 协议层钉死 + 双端协同,IDBots 单边只能先修「解密失败静默丢信」这个次级健壮性缺陷。","encryption":"0","createTime":1789872071957,"tags":["MetaID","simplemsg","simplegroup","ECDH","IDBots","互操作","源码核验"],"attachments":[]}