背景

在整车安全方案制定的过程中,一般不会涉及到遥控车钥匙安全方案的设计,因为其中的协议和加解密算法已经非常成熟。但遥控车钥匙的攻防一直是行业内的高光领域,是车联网安全工程师理解车联网安全的重要起点之一。当我们理解了遥控车钥匙的攻击方式之后,我们才能够充分理解包含在遥控车钥匙之中的通信协议和加密算法的设计意图(实际上本人为了深入理解遥控车钥匙的通信协议,完整实现了整个攻击过程,并深入分析了协议内容,详见本人发表在看雪论坛上的相关文章《解锁一辆车的非“优雅”方式》)。从这个经典的模块出发,我们可以将相关的思路带入到ECU之间的安全通信,即SecOC的方案设计之中,也可以将其设计理念融入数字车钥匙的安全方案。

除了通信协议,遥控车钥匙的另一个安全重点是遥控车钥匙的加密算法,其中包含了两个经典的加密算法:keeloq和hitag。可能有人会问,加解密算法,无论是对称的还是非对称的,都有那么多经典的可选,为什么在遥控车钥匙的设计中搞出了两个闻所未闻的新算法,我觉得其中的重要原因是遥控车钥匙的算力和耗电。从美观和实用的角度出发,遥控车钥匙的体积一般较小,这也就意味着遥控车钥匙不会容纳大容量的电源,一般为一颗纽扣钥匙,并且一颗纽扣钥匙一般需要工作2年以上,因此整个PCB板的耗电量也严格受控,因此处理器芯片不可过于复杂,不能执行太复杂的计算。基于如上原因(我认为),遥控车要是领域的专用加解密算法应运而生。其中,keeloq 就是 mirochip 设计和拥有的专有分组密码算法,在RKE(Remote Keyless Entry)中广泛使用。

符号

在正式介绍Keeloq的算法原理之前,我们先了解下文中使用到的相关函数的定义:

算法

Keeloq为分组加密算法,分组密码的密钥长度为64位,分组长度为32位。算法使用两个寄存器运行:

一个64位的密钥寄存器,用来存储密钥;

一个32位的文本非线性反馈移位寄存器(NLFSR),用来存储运算过程中的文本。

密钥寄存器

密钥寄存器以简单的循环移位的方式运行,初始状态使用64位加密密钥填充。寄存器第i轮状态表示为:

在每一轮中,寄存器内容简单旋转,然后取最低位进行运算(表示r位的循环右移):

变量x循环右移n位之后取最低位的算法实现如下:

def bit_of(x, n):x = (((x)>>(n))&1)return x

文本寄存器

32位文本寄存器以非线性反馈寄存器的形式运行,第i轮的状态表示为:

如下流程图简单描述了整个keeloq加密过程的实现原理:

Keeloq加密算法

寄存器初始值由明文表示:

密文为文本寄存器进行528轮计算之后的结果:

在每一轮中,31个最高有效位(MSB)向右移一位,变成下一轮中的31个最低有效位;新一轮的MSB的生成,是由文本寄存器和密钥寄存器中一些比特位的非线性组合:

每一轮的计算过程实现如下,其中i代表轮数,index_tables表示NLF查找表系数,x依然代表明文消息:

(x>>1) ^ ((bit_of(x,0) ^ bit_of(x,16) ^ bit_of(key,i&63) ^ bit_of(0x3A5C742E, index_table(x,1,9,20,26,31)))<<31)

由于NFL函数接收的输入只有32种可能,所以通常通过查找表的方式定义。如果输入为5个比特位,那么就等于十六进制数LSB。或者,可能以代数的形式[2, 5, 9]写入NLF:

NLF查找表的实现(其中x代表明文消息):

def index_table(x, a, b, c, d, e):y = (bit_of(x,a) + bit_of(x,b)*2 + bit_of(x,c)*4 + bit_of(x,d)*8 + bit_of(x,e)*16)return y

加密过程

在指定的一轮计算中,对除了LSB以外的比特位进行的操作仅仅是移位:

在每一轮的计算过程中,没有必要保持对整个文本寄存器状态的跟踪,仅仅保持对每一轮中新生成的比特位的跟踪,即MSB,即可完整记录下一轮运算后的结果。经528轮计算中的每一轮计算后产生的文本寄存器的32位初始值及MSB被定义为比特流​​​​​​​,这个比特流被称为加密状态。

加密状态的32位LSB是原始明文:

第i轮后文本寄存器的MSB是(31+i)比特位的加密状态。

如上流程看起来有点复杂,我们可以通过观察计算过程来简化加密流程,在第i+1轮中,只有第​​​​​​​比特位需要计算(根据比特位​​​​​​​和密钥中的比特位​​​​​​​)。在第i轮中,比特位​​​​​​​将与文本寄存器中的内容完全相同。描述为:

在528轮计算之后,从加密状态的32位MSB中取得密文:

由于非常简单的密钥时间表,一个完整的KeeLoq加密仅仅采用64轮加密​​​​​​​次,使用同一个密钥k:

综上,加密函数实现如下:

def keeloq_encrypt(msg, key):x = msgfor i in range(528):x = (x>>1) ^ ((bit_of(x,0) ^ bit_of(x,16) ^ bit_of(key,i&63) ^ bit_of(KeeLoq_NLF,index_table(x,1,9,20,26,31)))<<31);return x

总结

Keeloq的运算主要为异或和移位,因为这两种操作使用硬件电路可以简单高效地实现。我们可以简单地将Keeloq的算法抽象为一句话,作为本文的结尾:明文与密钥基于移位、查找表和异或的运算。

参考

[1] http://ww1.microchip.com/downloads/en/devicedoc/40209c.pdf

[2] https://en.wikipedia.org/wiki/KeeLoq

遥控车钥匙算法之KeeLoq相关推荐

  1. 如何给奥迪 Q3 遥控车钥匙更换电池?

    车钥匙的背面(无按键的一面)有一个盖板,这个盖板看其结构应该是往外一推就能开启,我试了一下实在推不动,于是用美工刀在盖板与外壳的缝隙处用美工刀轻轻敲开.估计这个敲的过程,改版就会自动外移. 打开后,就 ...

  2. 实现手机蓝牙解锁电脑_解答如何实现手机控车 蓝牙无感解锁方案

    当你准备骑电动车出门,无需到处翻找车钥匙,只需带上手机,当你靠近电动车的时候自动解锁,坐上电动车自动启动. 一部手机就能玩转电动车多么方便. 目前市场上已经出现一些高端智能电动车,用手机APP一键启动 ...

  3. c++ 11 锁_内江开车锁电话-老友网

    发布用户:yyz138829发布时间:2020-10-21 14:28:15 内江开车锁电话简阳开锁专注于匹配汽车智能钥匙.遥控车钥匙.开锁修锁换锁.以及指纹锁安装,锁具销售为一体的专业性单位,是经备 ...

  4. 算法刷题-钥匙与房间

    钥匙和房间 有 n 个房间,房间按从 0 到 n - 1 编号.最初,除 0 号房间外的其余所有房间都被锁住.你的目标是进入所有的房间.然而,你不能在没有获得钥匙的时候进入锁住的房间. 当你进入一个房 ...

  5. 传统汽车无钥匙进入具体功能详细描述

    描述 普通的遥控钥匙进入系统,英文名称是Remotekeylessentry,简称RKE,这需要人主动去操作钥匙从而进行开锁.而无钥匙进入系统具有无钥匙进入并且启动的功能,英文名称是PassiveKe ...

  6. 2021论文_汽车无钥匙进入系统中的抗干扰-重放攻击的防御机制

    A Defense Mechanism Against Replay Attack in Remote Keyless Entry Systems Using Timestamping and XOR ...

  7. 这是我见过最卡通的 Python 算法了,通俗易懂

    普通程序员,不学算法,也可以成为大神吗? 对不起,这个,绝对不可以. 可是算法好难啊~~看两页书就想睡觉-- 所以就不学了吗?就一直当普通程序员吗? 如果有一本算法书,看着很轻松--又有代码示例--又 ...

  8. 图解Python算法

    普通程序员,不学算法,也可以成为大神吗? 对不起,这个,绝对不可以. 可是算法好难啊~~看两页书就想睡觉-- 所以就不学了吗?就一直当普通程序员吗? 如果有一本算法书,看着很轻松--又有代码示例--又 ...

  9. 最萌算法学习来啦,看不懂才怪!| 码书

    普通程序员,不学算法,也可以成为大神吗? 对不起,这个,绝对不可以. 可是算法好难啊~~看两页书就想睡觉-- 所以就不学了吗?就一直当普通程序员吗? 如果有一本算法书,看着很轻松--又有代码示例--又 ...

最新文章

  1. Python 标准库之 commands
  2. java swing计算机_使用java swing仿window7标准计算器界面
  3. Docker 学习笔记之二
  4. Netron开发快速上手(一):GraphControl,Shape,Connector和Connection
  5. Java中SeparatedListAdapter类的实现
  6. 【Envi风暴】Envi 5.1平台下植被覆盖度(VFC)的遥感估算
  7. 内核堆栈 用户堆栈_堆栈痕迹从何而来?
  8. 最近,老王又Get了CDN的新技能
  9. linux 下 安装 node.js 详细步骤
  10. 怎么多快好省地学习中文自然语言处理
  11. 权重分析——CRITIC权重法
  12. 手把手教你学会用C语言编写井字棋小游戏
  13. node 常用 npm 命令
  14. collapse组件样式 react_antd源码分析之——折叠面板(collapse)
  15. 西门子em235模块的功能_多图细讲,模拟量模块与变送器的接线
  16. 公钥基础设施 PKI 技术与应用发展
  17. 7 进度指示器(LinearProgressIndicator、CircularProgressIndicator)
  18. PHP后端跨域HEADER头的设置
  19. java 最大子序列和
  20. 换个格式输出整数(Java)

热门文章

  1. SSD或者机械硬盘的读取速度查询
  2. TECH数字中国2021技术年会 | 神州控股、神州信息、神州数码集团合力打造 “神州信创云”
  3. Centos7命令行方式安装DM
  4. 美国ZIP Code 一览表
  5. java项目开发的工具选型对比,这10条建议你一定要关注!
  6. Gym 100712G Heavy Coins
  7. 如何将 PDF 转换为 JPG、PNG、TIFF、BMP、GIF?
  8. 小福利,用selenium模块爬取qq音乐歌单!
  9. 简单的文本编辑器C语言实现
  10. 步步为营二 C语言基本概念 和 数据类型