安全访问0x27Security Access1. 为什么需要安全访问2. 子功能成对设计3. 报文格式4. 常见NRC5. 解锁后的状态变化1. 为什么需要安全访问会话控制解决了能不能进这个模式的问题但还不够。进了 Extended 会话后写 DID、IO 控制、刷写这些操作还需要另一层保护——证明你有权限。安全访问就是这层保护Tester 必须向 ECU 证明我知道密码才能做敏感操作。但 UDS 不是直接发密码明文传输不安全而是用种子-密钥Seed-Key机制Tester 向 ECU 要一个随机数SeedECU 给一个随机数Tester 用算法把随机数算成密钥Key发回去ECU 用同样算法算一遍对比结果对了就解锁每次要的种子是随机的所以即使有人抓到了这次的种子和密钥下次也不一样没法重放攻击。下面是完整的种子-密钥交互流程ECUTesterECUTester用算法计算 Keyalt[密钥正确][密钥错误]27 奇数子功能请求种子67 奇数子功能 Seed返回随机种子27 偶数子功能 Key发送密钥67 偶数子功能验证通过解锁7F 27 NRC如 0x35 Invalid Key2. 子功能成对设计安全访问的子功能是奇偶成对的等级请求种子奇数发送密钥偶数Level 10102Level 30304Level 50506Level 11090ALevel 190D0E规律奇数 要种子偶数 发密钥偶数 奇数 1。3. 报文格式请求种子Tester ➡ ECU27奇数子功能种子正响应ECU ➡ Tester 67奇数子功能SeedSeed 长度由 ECU 决定通常是 4 字节、8 字节或 16 字节。发送密钥Tester → ECU27偶数子功能Key密钥正响应ECU ➡ Tester 67偶数子功能就回一个 SID 子功能没数据 “验证通过你解锁了”负响应ECU➡ Tester 7F27NRC整体报文交互流程如下正确错误Tester 请求种子27 奇数子功能ECU 返回种子67 奇数子功能Tester 计算密钥Key 算法(Seed)Tester 发送密钥27 偶数子功能ECU 校验密钥解锁成功67 偶数子功能返回负响应7F 274. 常见NRCNRC名称什么意思什么时候遇到0x22Conditions Not Correct条件不满足比如没进对会话就要解锁0x24Request Sequence Error请求顺序错了没要种子直接发密钥或用了不配对的子功能0x35Invalid Key密钥错了算法不对、种子过期、密钥截断错误0x36Exceeded Number Of Attempts尝试次数超限连续多次密钥错误ECU 锁住了0x37Required Time Delay Not Expired延迟未到种子和密钥之间间隔太短或被锁定后还没到解锁时间5. 解锁后的状态变化解锁成功后整个会话期间有效 — 不用每次操作都重新解锁直到切会话或会话超时开放敏感操作权限 — 写 DID2E、IO控制2F、刷写34/36/37等种子作废 — 解锁成功后种子清掉要再解锁必须重新要种子