算法跟着设备走:把 Seed & Key 编成 VCI 能跑的动态库

推广组
2026-09-30

摘要

标定管理器可把 Seed&Key 安全算法编译为 VCI 设备可用的 ARM 版 so 动态库,解决离线脚本因 Windows DLL 不兼容卡在安全解锁的问题:编辑算法代码,本机验证密钥,工具自动交叉编译生成 so,校验后配置到 ECU,随同离线脚本下发 VCI,设备本地完成解锁;也可导出工程编译上位机 DLL,同源维护,实现脱离电脑的离线标定采集。



你是否也遇到过这样的场景?


标定流程在台架上已经跑通,安全访问也解锁了。可一旦把测量流程下到 VCI 做离线运行,脚本就停在 Seed & Key。上位机用的是 Windows DLL,VCI 是 ARM 设备,这份库加载不进去。受保护的标定页和 DAQ 采集通道打不开,离线脚本卡在安全门前。工程师只好把算法改成另一套函数签名,再自己找交叉编译器出 .so,签名一对就错,库一换就得重编。


可靠的做法,是在标定管理器里直接写好安全算法,先在本机用种子算出密钥做验证,再一键交叉编译成 VCI 能加载的 .so。这份动态库就是离线解锁的载体:生成离线脚本时,.so 会按路径写进流程,并随脚本一起下到设备,由 VCI 自己完成取种子、算密钥、解锁。



从算法到设备:完整链路长什么样


第一步:在标定管理器打开动态库编辑。


标定管理器工具栏点「动态库」→「VCI设备运行so库生成」。编辑器里已经放好 VCI 侧函数模板,函数名必须是 XCP_ComputeKeyFromSeed。上位机 DLL 走 ASAM 标准签名,带权限字节;VCI 当前执行的是设备侧签名:int XCP_ComputeKeyFromSeed(const uint8_t* seed, uint16_t seedlen, uint8_t* key, uint16_t* keylen, void* pvoid)。在函数体里写本 ECU 的密钥算法,返回 0 表示计算成功,并在返回前把 keylen 写成实际密钥长度。


1.png


第二步:本机先测代码。


点「测试代码」,输入一串十六进制测试种子。工具在本机即时编译并执行这段 C,弹出算出的 key。算法对不对,不用上设备就能看出来。


2.png


第三步:生成 VCI 动态库。


点「生成VCI库」,选择保存路径(默认文件名 vciSafe.so)。工具用内置 ARM 交叉编译器把这段 C 编成位置无关的共享库 .so。编译通过会提示「编译成功」,失败会直接报错。函数名必须与编辑器当前定义一致,标定入口下就是 XCP_ComputeKeyFromSeed。


3.png


第四步:用生成的库再验一遍。


点「测试库」,选中刚才的 .so,再输入同一颗种子,核对 key 与第二步一致。同一菜单里的「测试dll库」可以按标准签名核对 Windows DLL:选择库文件、函数名、权限和种子,生成密钥并写进日志。在线用 DLL、离线用 .so,两份库可以对照同一组种子。


4.png


第五步:挂到 ECU,让离线脚本自己解锁。


在 ECU 配置的基础项里,把「安全算法文件」指到这份 .so,并勾选需要解锁的资源(解锁标定、解锁数据采集、解锁编程访问)。生成测量流程,或使用「离线脚本一键同步」时,工具按库类型选择调用方式。若安全算法文件仍是 .dll,会提示「当前安全算法库为dll文件,离线脚本使用时请更换为so文件」——上位机在线可以加载 DLL,VCI 离线需要 .so。若已换成 .so,生成的流程会在安全验证里调用 com.run_so_library,函数名为 XCP_ComputeKeyFromSeed:先读保护状态,再对标定页(CAL/PAG)和数据采集(DAQ)取种子、算密钥、解锁。一键同步会把脚本连同 .so 下到所选 VCI,并设置触发方式(按键、上电重启或命令行)。之后设备自己跑脚本,解锁在设备侧完成。


需要给上位机在线标定单独准备 Windows 算法库时,同一窗口可点「生成DLL样板库」,把 VSARFunctionsSDK 样板工程导出到指定目录,按标准签名编译 DLL。在线和离线各用各的库,算法逻辑仍由同一处维护。


5.png

6.png



这条链路解决了什么问题


  • 离线不再停在安全门:Seed & Key 在 VCI 上算完,标定页和 DAQ 可以在没有上位机驻留的情况下解锁。


  • 不用手搓交叉编译:ARM 目标、Thumb、共享库参数由工具带好,标定工程师只改算法本身。


  • 签名按设备来:编辑器默认就是 VCI 能执行的函数签名,避免把带权限字节的标准 DLL 签名直接塞进设备。


  • 先测后编:同一段代码可以先在本机对种子算出 key,生成 .so 后再测一遍,两步对得上再往设备送。


  • 和离线脚本是一条链:库类型决定调用方式,.so 路径写进流程,一键同步时和测量脚本一起下到 VCI。



写在最后


离线标定能不能跑起来,往往取决于安全算法能不能在 VCI 里被调用。把 Seed & Key 编成设备可运行的动态库,是连接「上位机调通」和「设备独立跑」的那一道门。门开了,后面的测量和采集才能真正离开电脑。



分享