尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

UDS诊断服务-27服务

UDS诊断服务-27服务 一、27 服务的本质对暗号把 ECU 想象成一栋有门禁的大楼。你想进去干活刷写、写参数、清码得先跟保安对暗号。你说我要对暗号。→ ECU 给你一个随机数种子 / Seed你按约定规则把随机数变换一下报回去→ 这就是密钥Key保安核对你报的跟它算的一样吗→ 一样就放行不一样就拒绝就这么简单。27 服务是单向的诊断仪向 ECU 证明我是自己人。ECU 不需要反过来向你证明它是谁。如果你需要验证 ECU 身份比如确认对面不是伪造节点那是读 DID、走 TLS 握手、或者 OEM 自定义协议的事不是 27 的事。二、报文格式就那几个字节多一个都是错请求种子27 奇数子功能 [可选附加数据]没有附加数据时就 2 个字节27 01有附加数据时比如 OEM 要求携带设备标识直接跟在子功能后面27 01 12 34没有数据长度字段。没有填充零。没有保留字节。报文总长度由传输层隐式确定ECU 通过总长度推断数据部分有多少字节。发送密钥27 偶数子功能 密钥数据27 02 BA EF 21 70子功能 0x02安全等级 1 的发送密钥后面跟 4 字节密钥。没有长度字段。ECU 响应场景响应种子响应67 奇数子功能 种子数据密钥验证通过67 偶数子功能否定响应7F 27 NRC具体示例你发27 01 ECU回67 01 AB CD 12 34 ← 种子4字节 你发27 02 BA EF 21 70 ECU回67 02 ← 验证通过就2字节 你发27 02 00 00 00 00 ← 故意发错 ECU回7F 27 35 ← 密钥不对种子长度种子多长由 OEM 定义4 字节、8 字节、16 字节都有可能。你从响应总长度减去 2SID 子功能就知道种子有几字节。不需要额外的长度字段告诉你。三、子功能配对奇偶规则27 服务唯一需要记的规则安全等级请求种子奇数发送密钥偶数10x010x0220x030x0430x050x0640x070x08………………630x7D0x7E规律同一等级请求种子 2n−1发送密钥 2n。最多 63 个安全等级。但每个等级能干什么标准不管ISO 14229-1 只规定了编号配对规则。每个等级对应什么权限、需要什么会话前提、用什么算法——全是 OEM 在诊断规范CDD/ODX里定义的。你看到的等级 1 读 VIN、等级 2 清 DTC、等级 3 刷写——那是某个 OEM 自己的划分。换一个品牌等级 1 可能压根不存在等级 3 可能是清码权限。永远查诊断规范。别记等级含义。四、安全等级隔离解锁了不等于万能这是很多人踩过的坑以为解锁了一个安全等级就能干所有事。标准规定安全等级之间互相独立ISO 14229-1 明确说每个安全等级是独立的权限域。解锁等级 1 不代表你拥有等级 2 的权限解锁等级 3 也不代表你自动拥有等级 1 和 2 的权限。实际表现你解锁了等级 127 01/02 → 可以执行等级 1 允许的操作 → 尝试执行等级 2 的操作 → 7F xx 33securityAccessDenied 你又解锁了等级 327 05/06 → 可以执行等级 3 允许的操作 → 等级 1 的权限还在吗取决于 OEM 实现 → 有些 ECU解锁新等级后旧等级权限保留 → 有些 ECU解锁新等级后旧等级权限被替换三种常见的 OEM 实现策略策略行为典型场景累加型解锁等级 N 后等级 1~N 的权限全部可用老车型、低安全需求替换型解锁等级 N 后只有等级 N 的权限可用旧权限失效高安全需求、新能源 BMS独立型每个等级完全独立互不影响需要分别解锁最严格的安全架构怎么知道你的 ECU 是哪种查规范。或者实测解锁等级 3 后试着执行一个等级 1 的操作看是否返回 0x33。实操建议如果你的诊断流程需要多个安全等级的权限查规范确认隔离策略如果是替换型或独立型按顺序从低到高解锁或者在需要时重新解锁目标等级不要假设高等级包含低等级——这个假设在很多 ECU 上是错的五、种子不过期。安全访问不过期。这是流传最广的两个误解必须掰清楚。种子没有倒计时标准不规定种子有效期。种子在以下情况失效事件种子是否失效你又请求了一个新种子✅ 旧种子被替换会话切换如10 01切回默认✅ 失效ECU 复位11 01✅ 失效你拿着种子想了 30 秒再发密钥❌ 不失效你拿着种子想了 5 分钟再发密钥❌ 不失效只要会话还在种子没有5 秒有效期、10 秒有效期这种说法。只要你不做上面前三件事种子一直有效。安全访问没有独立的权限有效期安全访问的生命周期与会话绑定事件安全访问是否失效会话存续中你啥也不干不失效你发3E 00保活不失效S3 超时TesterPresent 超时会话退回默认失效会话变了你主动切会话失效ECU 复位失效诊断仪拔线失效会话无法保活最终 S3 超时不是30 秒没操作就回收。只要会话活着靠3E 00保活安全访问一直在。实操建议解锁后如果你要连续做很多操作写 VIN、写标定、跑例程每隔 3~4 秒发一次3E 00。不是为了保活安全访问是为了保活会话——安全访问跟着会话走。六、NRC 速查别望文生义27 服务相关的 NRC完整版NRC标准名称人话翻译你大概干了什么0x12subFunctionNotSupported这个安全等级我不认识请求了 ECU 没定义的等级0x13incorrectMessageLengthOrInvalidFormat报文格式不对多塞了零或少了字节0x22conditionsNotCorrect现在不是时候前提条件不满足0x24requestSequenceError你步骤错了没请求种子就直接发密钥或发了密钥后又发密钥0x31requestOutOfRange超出范围安全等级编号超了0x33securityAccessDenied权限不够没解锁或解锁的等级不对0x35invalidKey密钥算错了算法不对、密钥值不对、字节序反了0x36exceededNumberOfAttempts你错太多次了连续 N 次 0x35 后触发0x37requiredTimeDelayNotExpired惩罚时间没到别急触发了 0x36 后等待期内又来请求0x78requestCorrectlyReceived-ResponsePending在处理等一下别重发等最终响应0x7FserviceNotSupportedInActiveSession当前会话不允许 27没切到对的会话重点讲讲 0x24requestSequenceError这个 NRC 专门针对违反 27 服务交互顺序的情况。触发场景你干了什么为什么错没发27 01就直接发27 02没请求种子就想发密钥ECU 不知道你要验证哪个种子发了27 02后又发27 02密钥只能发一次第二次就是序列错误发了27 01拿到种子后又发27 01同等级有些 ECU 认为这是序列错误旧种子被丢弃新种子生成有些 ECU 允许视为刷新种子。查规范确认解锁成功后又发27 01同等级已经解锁了还请求种子部分 ECU 返回 0x240x24 vs 0x35 的区别0x35 你发了密钥但算错了格式对内容错0x24 你发的时机就不对根本不该在这个时候发这个报文实操排查收到 0x24 时检查你的诊断仪状态机是不是乱了。最常见的原因是上一轮解锁失败后诊断仪没有重置状态直接又发了一个27 02。最容易搞混的三个0x35 vs 0x360x35 你这一次算错了还能再来0x36 你已经连续错了好几次了ECU 触发惩罚0x36 vs 0x370x36 你错太多次了触发惩罚的那一刻0x37 惩罚时间还没过你急什么惩罚期内0x12 vs 0x310x12 ECU 压根不支持这个子功能比如 ECU 只实现了等级 1 和 2你请求等级 50x31 子功能编号超出 ECU 定义的范围惩罚机制Delay Time第 1 次密钥错误7F 27 35算错了再来 第 2 次密钥错误7F 27 35又算错了 第 3 次密钥错误7F 27 36你错太多次了等 10 秒 ↓ 等待期内 你又来请求7F 27 37我说了等 10 秒你急什么 ↓ 10 秒后 重新来27 01 → 拿新种子 → 算密钥 → 27 02注意尝试次数上限和惩罚时间都是 OEM 定义的标准不规定具体值惩罚期间请求种子也会被拒绝回 0x37惩罚结束后必须重新请求种子旧种子已经无效七、完整实操解锁安全等级 1从头到尾场景我要解锁安全等级 1然后写一个配置参数。先查规范这个 ECU 的安全等级 1 需要扩展会话10 03。算法是简单异或固定密钥 11 22 33 44。第 1 步切会话 你发10 03 ECU回50 03 00 32 01 F4 好扩展会话已开 第 2 步请求种子 你发27 01 就 2 个字节 ECU回67 01 AB CD 12 34 好种子AB CD 12 344 字节 第 3 步算密钥 异或算法固定密钥 11 22 33 44 AB ^ 11 BA CD ^ 22 EF 12 ^ 33 21 34 ^ 44 70 密钥 BA EF 21 70 第 4 步发送密钥 你发27 02 BA EF 21 70 ECU回67 02 验证通过。你进来了。 第 5 步干活 你发2E 02 00 03 20 ECU回6E 02 00 第 6 步保活如果还有后续操作 你发3E 00 ECU回7E 00 第 7 步搞定切回默认会话 你发10 01 ECU回50 01 安全访问随会话结束而失效整个 27 服务交互核心就 4 个报文27 01→67 01 seed→27 02 key→67 02。八、AES 算法详解高安全等级的标配当 OEM 觉得异或、CRC 不够安全时就会上 AES。这是目前车载 ECU 高安全等级的主流选择。AES 在 27 服务中的角色AES 是对称加密算法。在 27 服务中它被当作一个伪随机函数使用——不是用来加密数据而是用来把种子变换成密钥。输入种子Seed 预共享密钥Secret Key 输出密钥Key Key AES_Encrypt(Secret_Key, Seed)ECU 和诊断仪持有相同的 Secret Key。诊断仪用 Secret Key 加密 Seed 得到 Key发给 ECU。ECU 用同样的 Secret Key 加密同一个 Seed对比结果。一致就通过。AES-128 vs AES-256参数AES-128AES-256密钥长度16 字节32 字节块大小16 字节固定16 字节固定安全强度足够应对当前车载威胁更高面向未来ECU 计算开销较低较高约慢 30%~40%典型应用多数乘用车 ECUADAS、BMS、网关等高安全 ECU注意AES 的块大小永远是 16 字节。这和密钥长度无关。AES-128 和 AES-256 的区别只在密钥长度不在块大小。种子长度与 AES 块大小的匹配问题AES 每次处理 16 字节。但种子不一定是 16 字节。怎么办种子长度处理方式说明16 字节直接加密完美匹配一次 AES 运算 16 字节填充Padding到 16 字节常见填充方式见下文 16 字节分块处理CBC 模式或截断取前 16 字节填充方式Padding当种子不足 16 字节时必须填充到 16 字节才能送入 AES。常见填充方式填充方式规则示例种子 AB CD 12 344 字节Zero Padding末尾补 0x00AB CD 12 34 00 00 00 00 00 00 00 00 00 00 00 00PKCS#7补 N 个值为 N 的字节AB CD 12 34 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0COEM 自定义补固定值或特定模式查规范填充方式由 OEM 定义。用错了填充方式算出来的密钥一定不对但你不会收到 0x13格式错误只会收到 0x35密钥错误——因为报文格式是对的只是内容错了。工作模式AES 有多种工作模式。在 27 服务中模式是否常用说明ECB✅ 最常用种子作为明文块直接加密。简单、快速、无需 IVCBC少见需要 IV初始化向量增加复杂度CTR / GCM极少见通常用于数据传输加密不用于 27 服务绝大多数 OEM 在 27 服务中使用 AES-ECB。原因很简单27 服务只需要一个确定性变换不需要流加密或认证加密的特性。ECB 在这个场景下完全够用。密钥派生Secret Key 从哪来AES 的 Secret Key 不是硬编码在代码里的字符串。通常有两种来源来源说明OEM 统一分配同一平台所有 ECU 使用相同 Secret Key诊断仪内置ECU 个体绑定Secret Key 与 ECU 序列号/DID 绑定每个 ECU 不同。诊断仪需要从 OEM 服务器动态获取后者更安全一个 ECU 的密钥泄露不影响其他 ECU但诊断工具的实现也更复杂。AES 调试排查清单当你用 AES 算法却总是收到 0x35 时按这个顺序排查Secret Key 对不对版本是否匹配是否用了旧的密钥文件种子有没有看错是不是把上一个种子当成了当前的填充方式对不对Zero Padding 还是 PKCS#7工作模式对不对ECB 还是 CBC如果用 CBCIV 是什么字节序对不对Secret Key 和种子的字节序是大端还是小端输出截取规则对不对AES 输出 16 字节但 ECU 可能只取前 4/8 字节作为密钥。取哪几个字节第 6 点是最容易忽略的。AES-128-ECB 输出永远是 16 字节但很多 ECU 只取前 4 字节或前 8 字节作为最终密钥。剩余字节丢弃。查规范确认截取规则。一个完整的 AES-128-ECB 示例已知 Secret Key 00 11 22 33 44 55 66 77 88 99 AA BB CC DD EE FF 种子 AB CD 12 344 字节 填充方式 Zero Padding 工作模式 ECB 输出截取 前 4 字节 步骤 1. 填充种子到 16 字节 AB CD 12 34 00 00 00 00 00 00 00 00 00 00 00 00 2. AES-128-ECB 加密 Plaintext AB CD 12 34 00 00 00 00 00 00 00 00 00 00 00 00 Key 00 11 22 33 44 55 66 77 88 99 AA BB CC DD EE FF Ciphertext 6B 1C 4E 8A ...16 字节输出 3. 截取前 4 字节 Key 6B 1C 4E 8A 4. 发送 27 02 6B 1C 4E 8A九、会话与安全等级的关系标准不规定哪个会话支持哪个安全等级默认会话支持等级 1扩展会话支持等级 2/3编程会话支持等级 4——这不是标准规定是某个 OEM 的配置。实际情况千差万别可能的配置说明默认会话不允许 27很常见。想解锁先切会话扩展会话允许等级 1~3常见编程会话允许等级 1~5常见默认会话允许等级 1少见但存在查规范。别猜。读 VIN 需要安全验证吗大多数 OEM不需要。你发22 F1 90 ECU回62 F1 90 4C 5A 57 41 ...默认会话无安全验证直接读。VIN 是车辆标识年检、保险、二手车交易都要读。写 VIN 才需要编程会话 安全验证 通常只允许写一次。十、常见问题排查发27 01ECU 回7F 27 7F当前会话不允许 27。→ 先切会话10 03或 10 02查规范 → 再发27 01发27 01ECU 回7F 27 12这个安全等级 ECU 不支持。→ 查规范确认 ECU 支持哪些等级 → 也许只支持等级 127 01/02你发了 27 05 它不认识发密钥ECU 回7F 27 24步骤错了。→ 检查状态机是不是没请求种子就发了密钥 → 是不是发了密钥后又发了一次密钥 → 重置诊断仪状态重新走完整流程27 01 → 67 01 → 27 02发密钥ECU 回7F 27 35密钥算错了。排查清单算法对不对异或AESCRCSecret Key / 固定密钥对不对是不是用了旧版本字节序对不对大端还是小端种子有没有看错密钥长度对不对AES 专属填充方式对不对AES 专属工作模式对不对AES 专属输出截取规则对不对发密钥ECU 回7F 27 36连续错太多次了。→ 等。等惩罚时间过去查规范通常 10 秒~10 分钟 → 等完了重新走27 01 → 拿新种子 → 算密钥 → 27 02 → 旧种子已经废了必须重新请求惩罚期内发27 01ECU 回7F 27 37惩罚时间没到。→ 继续等。别反复请求 → 等够了再发 27 01解锁成功了但执行操作时报7F xx 33安全等级不对或权限已被替换。→ 查规范确认操作需要什么等级 → 确认 ECU 的安全等级隔离策略累加/替换/独立 → 如果是替换型重新解锁目标等级十一、传输层CAN ID 不是 27 服务的一部分有些资料把报文写成18 DA F1 00 27 01让人以为18 DA F1 00是 27 服务报文的一部分。不是。那是传输层的事层内容标准CAN 传输层CAN ID 0x18DAF100 / 0x18DA00F1ISO 15765-4UDS 应用层27 01/67 01 AB CD 12 34ISO 14229-127 服务的报文就是27 01。CAN ID 负责路由跟 27 服务的格式无关。以太网DoIP上27 服务的报文还是27 01只是搬运方式变了。十二、27 服务在诊断流程里的位置10 03 ← 切扩展会话 ↓ 27 01 / 27 02 ← 解锁安全等级 1 ↓ 22 F1 90 ← 读 VIN如果需要 ↓ 10 02 ← 切编程会话如果需要更高权限 ↓ 27 05 / 27 06 ← 解锁安全等级 3 ↓ 2E F1 90 ... ← 写 VIN ↓ 31 01 02 02 ← 校验写入如果 OEM 定义了 ↓ 10 01 ← 切回默认会话安全访问自动失效27 在这个链条里是门禁卡——它本身不干活但没有它后面的活干不了。十三、速查卡┌──────────────────────────────────────────────────────────────┐ │ 27 服务SecurityAccess速查 │ │ │ │ 请求种子27 奇数 2 字节起步 │ │ 发送密钥27 偶数 key │ │ │ │ 种子响应67 奇数 seed │ │ 密钥确认67 偶数 就 2 字节 │ │ 否定响应7F 27 NRC │ │ │ │ 没有数据长度字段 │ │ 没有种子有效期标准不规定 │ │ 没有独立的权限有效期与会话同生命周期 │ │ 单向验证诊断仪 → ECU │ │ 安全等级互相独立隔离策略由 OEM 定义 │ │ 安全等级含义、算法、尝试次数、惩罚时间 → 全是 OEM 定义 │ │ │ │ 子功能配对 │ │ 0x01/0x02 等级1 0x03/0x04 等级2 │ │ 0x05/0x06 等级3 ……最多到 0x7D/0x7E 等级63 │ │ │ │ NRC │ │ 0x12 子功能不支持 │ │ 0x24 步骤错了没请求种子就发密钥 / 重复发密钥 │ │ 0x33 权限不够等级不对或被替换 │ │ 0x35 密钥错了 │ │ 0x36 错太多次了 │ │ 0x37 惩罚时间没到 │ │ 0x7F 会话不对 │ │ │ │ AES 调试优先级 │ │ Secret Key → 种子 → 填充 → 模式 → 字节序 → 输出截取 │ │ │ │ 生命周期 │ │ 会话在 → 安全访问在 │ │ 会话断 / 切换 / 复位 → 安全访问失效 │ │ 用 3E 00 保活会话 │ └──────────────────────────────────────────────────────────────┘写在最后27 服务的报文格式是 UDS 里最简单的之一——请求 2 个字节起步响应 2 个字节起步没有子功能嵌套没有掩码没有例程参数。它之所以让人觉得复杂是因为三样东西叠在一起安全的神秘感 OEM 的自定义 算法的细节。但只要拆开看格式就那几个字节标准写得清清楚楚权限查规范别猜算法AES 也好异或也好本质都是确定性变换调通了就是调通了下次在台架前坐下打开诊断工具发一个27 01看着 ECU 回一串种子——那一刻你会觉得所谓安全访问也不过就是两个字节的事。剩下的不过是耐心和细心。
返回列表