写在开篇:
上回说到,黄蓉去敲门,门房回了句“缺少认证”(响应码0x04),还扔给她一串数字——“先对暗号!”
黄蓉拿了数字回来,却不知道怎么算。
郎中捋着胡子笑了:“黄姑娘,这就是咱们要讲的——安全访问三板斧:拿种子、算密钥、27服务,三样全都要,一样不能少。”
黄蓉撸起袖子:“行!靖哥哥都能学得会,今天我就把这三板斧全抡明白了!”
一、三板斧是哪三板斧?
郎中在白板上写下三行字:
第一板斧:拿种子
第二板斧:算密钥
第三板斧:27服务
“这三板斧,少了哪一把,门都不开。”
| 板斧 | 干什么 | 缺了会怎样 |
|---|---|---|
| 拿种子 | 从门房那里拿一个随机数 | 没题目,怎么答题? |
| 算密钥 | 用自家算法把种子算成密钥 | 有题目不会算,白搭 |
| 27服务 | 按规矩交卷、验证 | 算出来不会交,门房不知道 |
黄蓉点点头:“哦~~所以这三板斧是链条,一环扣一环,哪环断了都不行!”
郎中竖起大拇指:“对头!”
二、第一板斧:拿种子
“黄姑娘,门房扔给你的那串数字12345678,就叫种子。”
| 属性 | 说明 |
|---|---|
| 谁给的 | 网关(门房) |
| 长啥样 | 一串随机数,通常4-8字节 |
| 有啥特点 | 每次都不一样 |
| 为啥要它 | 防重放攻击——这次是1234,下次是5678,录下来也没用 |
“种子就像门房随口说的‘天王盖地虎’。今天说‘天王盖地虎’,明天说‘宝塔镇河妖’——切口天天换,你如果只会背昨天的,今天就进不去。”
黄蓉一拍大腿:“明白了!种子就是每次对暗号的题目。每次题目不一样,防止有人录下来以后冒充我!”
郎中竖起大拇指:“第一板斧,拿种子——黄姑娘过关!对头!”
三、第二板斧:算密钥
“拿了种子,接下来得算。”
“你得用你家祖传的算法,把种子算成一个新数字,这玩意儿就叫密钥。”
| 谁 | 种子 | 算法 | 密钥 |
|---|---|---|---|
| 门房 | 12345678 | 每位数乘2,取个位 | 24680246 |
| 黄蓉 | 12345678 | 同样的算法 | 24680246 |
| 坏人 | 12345678 | 不知道算法 | ??????? |
“两边用同样的算法,算出同样的密钥,暗号就对上了。坏人不知道算法,算出来的对不上,门就不开。”
郭靖挠挠头:“那这个算法是啥?能不能告诉我?”
郎中笑了:“郭大侠,算法是厂家预置的——4S店的诊断仪出厂时就烧录了算法,路边随便的电脑没有。这算法通常是国际标准,比如AES、SHA-1,厂家也可以自己定,反正保密就行。”
黄蓉咬了一口糖葫芦:“那我家桃花岛要是做诊断仪,就用‘五行八卦算法’!谁也别想猜着!”
郎中竖起大拇指:“第二板斧,算密钥——黄姑娘再过关!对头!”
四、第三板斧:27服务
“前两板斧抡完了,种子拿到了,密钥算出来了。但你还得按规矩交卷——这就是27服务。”
“27服务是UDS协议(ISO 14229)定的安全访问服务,服务ID是0x27,专门负责‘给种子、收密钥、做验证’这套流程。”
黄蓉问:“那27服务具体咋走?”
郎中画了一张时序图:
诊断仪(黄蓉) 网关(门房) │ │ │ ① 路由激活请求(SA=0x0E80) │ │ “我是黄蓉,工号0x0E80” │ │──────────────────────────────────────────>│ │ │ │ ② 响应码0x04:“缺少认证!” │ │ “先对暗号!” │ │<──────────────────────────────────────────│ │ │ │ ③ 27 01 RequestSeed(请求种子) │ │ “给我一个随机数” │ │──────────────────────────────────────────>│ │ │ │ ④ 27 01 ResponseSeed(返回种子) │ │ “种子:12345678” │ │<──────────────────────────────────────────│ │ │ │ ⑤ 黄蓉用算法算出密钥 │ │ 12345678 → 算法 → 24680246 │ │ │ │ ⑥ 27 02 SendKey(发送密钥) │ │ “我的密钥是24680246” │ │──────────────────────────────────────────>│ │ │ │ ⑦ 门房用同样算法算一遍 │ │ 12345678 → 算法 → 24680246 │ │ 一致:→ ⑧ │ │ │ │ ⑧ 27 02 Response(验证通过) │ │ “暗号对上了!” │ │<──────────────────────────────────────────│ │ │ │ ⑨ 重新发送路由激活请求 │ │ “暗号对完了,让我进!” │ │──────────────────────────────────────────>│ │ │ │ ⑩ 响应码0x10:“请进!” │ │<──────────────────────────────────────────│ │ │ ▼ ▼
27服务的子功能(多级关卡)
“而且,27服务不止一套——有多级关卡。”
| 子功能 | 值 | 访问级别 | 能干啥 | 江湖版 |
|---|---|---|---|---|
| RequestSeed | 27 01 | 级别1 | 读数据(VIN、版本) | 进客厅,看摆设 |
| SendKey | 27 02 | 级别1 | — | — |
| RequestSeed | 27 03 | 级别2 | 写数据(改配置、清故障码) | 进书房,动笔墨 |
| SendKey | 27 04 | 级别2 | — | — |
| RequestSeed | 27 05 | 级别3 | 刷写固件、解锁BootLoader | 进密室,动家底 |
| SendKey | 27 06 | 级别3 | — | — |
“你想进客厅,过级别1就行;想进密室,得过级别3。过哪级关,进哪级门。”
黄蓉恍然大悟:“哦~~原来27服务是流程标准——‘怎么拿种子、怎么交密钥、怎么分级别’,全是它定的!没这套规矩,就算有种子、会算密钥,也不知道咋交卷!”
郎中竖起大拇指:“第三板斧,27服务——黄姑娘三关全通!这三板斧,全都要,一样不能少!对头!”
五、一张图看懂:三板斧全流程
郎中在白板上画了一张总结图:
┌─────────────────────────────────────────────────────────────┐ │ 安全访问三板斧:拿种子、算密钥、27服务 全都要 │ ├─────────────────────────────────────────────────────────────┤ │ │ │ ┌─────────────────────────────────────────────────────┐ │ │ │ 第一板斧:拿种子 │ │ │ │ 诊断仪:27 01 RequestSeed(请求种子) │ │ │ │ 网关:种子 = 12345678 │ │ │ └─────────────────────────────────────────────────────┘ │ │ ↓ │ │ ┌─────────────────────────────────────────────────────┐ │ │ │ 第二板斧:算密钥 │ │ │ │ 诊断仪用预置算法:12345678 → 算法 → 24680246 │ │ │ └─────────────────────────────────────────────────────┘ │ │ ↓ │ │ ┌─────────────────────────────────────────────────────┐ │ │ │ 第三板斧:27服务 │ │ │ │ 诊断仪:27 02 SendKey(密钥=24680246) │ │ │ │ 网关用同样算法算一遍 → 一致 → 验证通过 │ │ │ └─────────────────────────────────────────────────────┘ │ │ ↓ │ │ 三关全过! │ │ ┌─────────────────────────────────────────────────────┐ │ │ │ 诊断仪:重新发送路由激活请求 │ │ │ │ 网关:响应码0x10——“请进!” │ │ │ └─────────────────────────────────────────────────────┘ │ │ │ └─────────────────────────────────────────────────────────────┘
六、如果缺了一板斧呢?
黄蓉问:“郎中,那如果我缺了一板斧,会咋样?”
郎中捋着胡子:“黄姑娘,您试试看——”
| 缺了哪把 | 结果 | 江湖版 |
|---|---|---|
| 缺种子 | 没有题目,怎么算答案? | “你连暗号都不问,就想进?” |
| 缺算法 | 有题目,不会算 | “题目给你了,你算不出来,怪我咯?” |
| 缺27服务 | 算出来了,不知道怎么交 | “算出来了不交卷,我怎么知道你对不对?” |
| 三把全有 | 门开了 | “郭大侠请进!” |
黄蓉拍拍胸脯:“还好我三把全抡了,一把没缺!”
七、如果密钥算错了呢?
郭靖问:“郎中,那如果蓉儿算错了密钥,会咋样?”
郎中笑了:“郭大侠,您想啊——您去山寨对暗号。第一次说‘天王盖地虎’,您说‘地瓜烤红薯’——门房一听不对,说‘再给你一次机会’。”
“二次不对,再给一次。三次不对……”
黄蓉抢答:“门房说‘滚’?”
郎中点头:“对头!UDS规定,连续多次失败后,ECU会锁定一段时间。这叫防暴力破解。”
| 重试次数 | 结果 | 江湖版 |
|---|---|---|
| 第1次错 | 还能再试 | “听错了,再来!” |
| 第2次错 | 最后一次 | “最后一次机会了!” |
| 第3次错 | 锁定N秒 | “滚!明天再来!” |
黄蓉拍拍胸脯:“还好我算得准!不然三把斧子抡空了,门就锁死了!”
八、这些坑,靖哥哥替你先踩了
坑1:以为“种子是固定的”。
后来才搞明白,种子每次随机生成,防重放攻击。
坑2:以为“密钥是提前配好的”。
后来才搞明白,密钥实时计算——种子 + 算法 = 密钥。算法预置,密钥不是。
坑3:以为“27服务只有一关”。
后来才搞明白,27服务有多级关卡(01/02、03/04、05/06……)。过哪级进哪门。
坑4:以为“三板斧可以缺一把”。
后来才搞明白,种子、密钥、27服务,三样全都要。缺一把门都不开。
坑5:以为“一辈子只过一次27就行”。
后来才搞明白,每次诊断会话可能需要重新认证。刷固件时,每刷一个块可能都要重新过。
黄蓉补刀:“靖哥哥,你是不是以为对一次暗号,就能一辈子进人家密室?”
郭靖憨笑:“蓉儿说得对……降龙十八掌也不是一天练成的!”
九、下步目标
安全访问三板斧搞清楚了——拿种子、算密钥、27服务,三样全都要,一样不能少。
郭靖点点头:“郎中,我现在知道为什么蓉儿进不去了——她没算法,算不出密钥,过不了27服务。三板斧缺了两把,门当然不开。”
黄蓉白了他一眼:“靖哥哥,你这是在说我笨?我要是有了算法,三把全抡给你看!”
郎中笑了笑:“安全门禁过了,就可以正式开始诊断了——发UDS命令、读故障码、刷固件。这就是咱们下一篇要讲的——诊断消息。”
黄蓉把最后一颗糖葫芦咬下来,含混不清地说:“靖哥哥,你今天学会了‘三板斧全都要’,明天是不是该学学‘看病’了?”
郭靖憨憨一笑:“蓉儿说得对。明天,学诊断消息去!”
于是,小两口开心地开着国产智能网联新车,幸福地回家喽。
微风吹过,郎中捋着胡子,望着他们远去的背影,微微一笑。
他看得出来,靖哥哥今天虽然抡明白了三板斧,但眼里总还有几分似懂非懂的疑惑——
“种子是随机数,算法是预置的,可这算法到底咋写的?”
“27服务过了,进去之后,UDS命令又该咋发?”
“读故障码、刷固件……这些‘看病’的活,跟今天的‘进门’又有啥不一样?”
郎中轻轻摇了摇头,眼里满是欣慰。
他知道,这个憨小子,一定会再过来的。
呵呵。
十、写在最后
这一篇最大的收获:
安全访问三板斧——拿种子(随机数)、算密钥(算法计算)、27服务(标准流程)。三样全都要,一样不能少。缺了种子,没题目;缺了算法,算不出答案;缺了27服务,不知道咋交卷。
郭靖感叹:原来对个暗号都得三板斧抡圆了——种子、密钥、27服务,关关都要过,少一把都不行!
打完收工,886。