前言
所谓 滚动码(Rolling code) 是我们嗅探汽车遥控发射出来的射频信号,发现每一次的射频信号都是不一样的,并且每个信号只能被使用一次,这就是被称为滚动码的原因,本文以 Keeloq 举例,从设备工作频点,遥控信号编码,信号传输协议格式,来介绍滚动码是如何工作的,在介绍一下产生滚动码中最重要的 Keeloq加解密算法 ,以及Keeloq算法中使用的 编码秘钥生产规则 ,加密中 厂商秘钥泄露 的问题,到最后教大家如何打造一个像 HackCube-Special 的安全研究硬件去对滚动码进行安全研究。
设备工作场景
滚动码 相比于 固定码 较为安全一些,因此被部署到需要更强的 安全性 的设备上,例如 车库门 ,住户 门禁 , 拉伸门 之类的用的最多的估计就是 汽车 上面了,目前市面上的 汽车 基本都是采用 滚动码 的,所谓的滚动码其实遥控每一次发射的数据都是 唯一 且 不重复 的,因为数据是被经过 加密 后的 密文 在发射出来的,通常我们抓数据分析后会发现两次数据中会发生非常大的变化,目前已知在遥控器上常用的加密算法分别为 Keeloq , Hitag2 。
射频频点将 GQRX 设置在常用的几个频点上观察频谱图来确定遥控工作的频点,通常的工作在 315Mhz , 433Mhz 极个别的会采用868Mhz,915Mhz这几个频点,然后观察 433.92Mhz 附近的 频谱图 在遥控发射信号时候可以很明显的看到这个频谱的变化:
我们也可以通过遥控上的 FCC ID 在相关网站上查询设备的一些信息,或者是通过遥控上 标注 的信息,通过这个基本可以确定这个遥控工作的 频点 和采用的 调制方式 等等,实在不行还能查看PCB板子上的 晶体振荡器 来算出频率等等。 信号波形
我们将采样的原始数据导入 audacity 就可以看到遥控的信号大概是这样的,可以通过采样时候的频谱和波形看出来我们采用的钥匙是经过 ASK调制 ,其中 前导码 作用是让汽车知道将有信号到来注意接收,其中 同步引导码 的作用是同步时间,但是在后面审计程序代码中发现程序把这一段 同步引导码 来确定信号的 有效性 的,然后数据传输后会将滚动码序列号功能码状态码一并发送,间隔时间是担心干扰的原因让汽车没有接收到信号所以钥匙会把信号重复发射3-4次,间隔时间就是重复信号的间隔时间,这就是整个钥匙的周期。 编码规则
上图是 Bit 编码的格式一个 Bit 占 3TE ,2个TE高电平信号1个TE低电平信号为 Bit0 ,1个TE高两个TE低为 Bit1 ,先发送Lsb 下面为解码实例,假设二进制数据为 01011110 因为先发送最低有效位,所以二进制数据是 0111 1010 然后二进制转化成十六进制为 0x7A 。
根据每个芯片型号来决定发送 数据格式 和内容,但都是大同小异本文以 HC201 举例。
当按下对应的 功能键(打开车门) 时程序会将对应的 4Bit功能码 , 2Bit溢出码 , 10Bit识别码 , 16Bit同步计数值 通过 Keeloq加密 生成出所谓的 滚动码 ,这就是开头 32bit 滚动码
4Bit 功能码 :代表信号执行什么功能,当信号合法就执行对应的功能如 打开车门 ,在固定码区域也传输着4Bit 功能码,但最后还是根据32Bit滚动码中的功能码来执行; 2Bit 溢出码 :作用是当同步计数值到达65535+1后溢出码增一同步计数值清零,但在审计代码中发现并没有使用该溢出码; 10Bit 识别码 :此码是取 28Bit序列号 中 最后10Bit 作为设备的识别码; 16Bit 同步计数值 :每次判断信号合法后汽车执行对应功能并将同步计数值保存下来,当新的信号到来会对比汽车保存的同步计数值,如果小于或者等于将判断信号非法,不执行任何操作,当大于保存的同步计数值,汽车执行对应功能并将同步计数值保存下来,这个在验证作为最关键的一环,这就是为什么汽车能防止 重放攻击 的关键; 28Bit序列号 :相当于每一个遥控都有一个 独立的ID ,在出厂时就会让汽车进入学习模式来保存这遥控的id和同步计数值,以后汽车可以根据此id来判断是否与汽车内部存储器中存储的ID一致,一致为 合法设备 。一辆汽车可以学习多个ID; 4Bit功能码 :作用是传输着对应的功能如打开车门,打开行李箱等等最多代表16种功能,但在后面测试中发现汽车会根据 32Bit滚动码 中的功能码为准; 2Bit状态码 :1Bit表示电池是处于一种低电压状态就是表示电池快没电了,另外1Bit代表信号是否是重复的,前面有说的设备会根据键入的时长来发送多段信号,这就是表示信号的重复可以从上面介绍来看到;最关键的一步就是通过 64Bit 的 编码秘钥 将 同步计数值,识别码,功能码 进行加密的步骤,其中使用的就是Keeloq算法。
Keeloq 加密算法 现在我们来了解下这个Keeloq算法:加密流程如图所示,首先定义一个非线性表,这 个非线性表 有 5Bit 的输入码在数据寄存器中间隔均匀的取 Bit31,Bit26,Bit20,Bit9,Bit1 总共五个Bit通过NLF(Nonlinear Logic Function) 0x3A5C742E 产生 1Bit 的输出码,然后输出码在在与 Bit16,Bit0 与秘钥中的 Bit0 进行 异或运算 生成 1Bit 加密数据,然后每次生成出加密数据,秘钥位和数据位都会进行移位,秘钥作为循环移位,加密数据作为数据移位,重复上述步骤 528 次后,得到 4字节密文 。
解密运算方式与加密过程的运算方法基本一样,只是将输入码改变成 Bit30,Bit25,Bit19,Bit8,Bit0 ,总共五个Bit通过NLF (Nonlinear Logic Function) 0x3A5C742E 产生 1Bit 的输出码,然后 1Bit 输出码和 Bit31 与 Bit15 和秘钥中的 Bit15 进行 异或运算 产生出 1Bit 的解密数据,然后每次生成出解密数据,秘钥位和数据位都会进行位移,秘钥作循环移位,解密数据作为移位输入然后重复 528 轮还原 4字节明文 ,可以看出算法中最主要的就是 64Bit的编码秘钥 。 Keeloq 编码秘钥生产算法 我们来看看这个这个编码秘钥生成的机制是什么:
简单加密,直接把厂商秘钥当做设备的编码秘钥了。
标准秘钥 生成算法假设序列号为 0x1234567 ,通过标准的秘钥生成算法来定的话,首先会拿 2+序列号 通过 Keeloq的解密 操作得到 32Bit 的 Lsb 为 0x89074278 ,然后在拿 6+序列号 通过 Keeloq的解密 操作得到 32Bit Msb 值为: 0x0516FBE9 哪这个遥控的编码秘钥为 0x0516FBE989074278 ,与简单加密不同的是,使用简单加密的厂商生产出来的每个设备编码的秘钥都是 相同 的,而使用 标准秘钥 生成的根据每个遥控秘钥都 不会相同 ,意思说如果一辆车上学习了两个遥控,这两个遥控的编码秘钥都不是一样的。
安全秘钥生成算法假设 序列号 为 0x1234567 , 种子码 为 0x12345678 ,这个种子码是 随机 的,每个遥控的种子码都是不一样的,首先会用种子码进行 keeloq解密 操作得到 32Bit 的 Lsb 值为: 0x188646d6 ,然后在拿 6+序列号 通过 Keeloq的解密 操作得到 32Bit Msb 值为: 0xC3C83DA8 哪这个遥控的编码秘钥为 0xC3C83DA8188646d6 。简单说下这 三种加密算法 的区别,首先是简单加密直接拿厂商秘钥加密的话如果是通过 侧信道攻击 ,可以获取到 厂商秘钥 ,直接可以对其他的设备进行解密操作,然后如果是标准秘钥生成算法,因为每个遥控序列号都是不同的所以生出来的秘钥也是不同的如果使用侧信道攻击只能获取到编码秘钥就是只对这个设备有用然而对其他的设备都没有效果的,但是如果厂商秘钥被其他人获取了,因为发送信号时候会带着 28Bit的序列号 ,所以只要别人拿到了这个 厂商秘钥 就能 解密信号 ,而 安全秘钥生成算法 就不同了,即使是 厂商秘钥 被别人知道了,也只能拿到前 32位秘钥 ,后32位是根据 种子码 生成的,而种子码又是随机生成的,如果是hcs301那就要按住四个键才会把种子码给发射出来,这个种子码只有在学习模式下遥控才需要发射出来给汽车保存,之后就在也不会发射出这个 种子码 了。三种秘钥生成算法各不相同,很多厂商为了贪方便和效率认为只要有加密就可以,没有仔细的了解这三种的区别导致了安全隐患,这秘钥一旦被其他人获取,除了使用了安全秘钥生成算法能确保安全性,市面上的使用简单和标准生成算法的厂商,一旦厂商秘钥被泄露,所生产出出来的设备将不在安全,并且目前大多数是没有联网功能的,如果要升级程序更新秘钥和新的算法只能将设备回厂重新烧录或者找附近的4s店,大多数厂商因为成本和担心发生召回等事件后对名气之类的有负面影响,大多数厂商都是像鸵鸟一样把头埋在沙子了,假装听不到,一般的用户是没有办法自己升级设备程序的能力的,最关键的一环就是厂商秘钥,下面来讲讲下厂商秘钥的问题。
简单加密,直接把厂商秘钥当做设备的编码秘钥了。
标准秘钥 生成算法假设序列号为 0x1234567 ,通过标准的秘钥生成算法来定的话,首先会拿 2+序列号 通过 Keeloq的解密 操作得到 32Bit 的 Lsb 为 0x89074278 ,然后在拿 6+序列号 通过 Keeloq的解密 操作得到 32Bit Msb 值为: 0x0516FBE9 哪这个遥控的编码秘钥为 0x0516FBE989074278 ,与简单加密不同的是,使用简单加密的厂商生产出来的每个设备编码的秘钥都是 相同 的,而使用 标准秘钥 生成的根据每个遥控秘钥都 不会相同 ,意思说如果一辆车上学习了两个遥控,这两个遥控的编码秘钥都不是一样的。
安全秘钥生成算法假设 序列号 为 0x1234567 , 种子码 为 0x12345678 ,这个种子码是 随机 的,每个遥控的种子码都是不一样的,首先会用种子码进行 keeloq解密 操作得到 32Bit 的 Lsb 值为: 0x188646d6 ,然后在拿 6+序列号 通过 Keeloq的解密 操作得到 32Bit Msb 值为: 0xC3C83DA8 哪这个遥控的编码秘钥为 0xC3C83DA8188646d6 。简单说下这 三种加密算法 的区别,首先是简单加密直接拿厂商秘钥加密的话如果是通过