要创建完整的副本,能够生成有效的传输数据包,您需要以下信息:
- 序列号
- 按钮按下映射
- 32 位 KeeLoq 加密数据
请参见数据表中右下角“传输的信息”附近的附图 1-2 :
使用这三条信息,您理论上可以创建自己的设备。
序列号
序列号是遥控器的唯一标识符,由于它是按原样发送的,因此可以通过捕获单个传输数据包轻松检索。OP 已经检索到它了。
稍后需要序列号,因为它也是加密数据的一部分,因此在我们创建加密部分时,无需先解密传输即可检索它的能力可能会帮助我们下线。
键映射
为了发送特定的键,您需要创建自己的值到键含义的映射。这不像获取任何传输消息的单个值那么容易,但并不困难,只需点击每个键并捕获它的按钮按下信息字段。OP 似乎也做到了这一点。
32 位 KeeLoq 加密数据
这就是狗屎变得严重的地方,除了密钥之外,我们还需要知道要加密什么:
- 按钮状态。
- DISC 位。
- OVR 位。
- 同步计数器(16 位字在控制器生命周期内每按一次按钮增加一次)。
- 加密密钥(在数据表中称为“Crypt Key”,听起来像 leet :D)
参见附图 4-2,来自数据表的右侧部分:
按钮状态位
这四位与未加密发送的相同,因此我们已经讨论了它们相当容易的检索。
盘位
鉴别值有助于解码器端的解密后检查。它可以是任何值,但在典型系统中,它将被编程为序列号的 10 个最低有效位。当学习发射器时,接收器必须单独存储除此之外的值。鉴别位是构成传输加密部分的信息的一部分(图 4-2)。接收器解密传输后,将对照接收器存储的值检查鉴别位,以验证解密过程是否有效。如果鉴别值被编程为序列号的 10 位 LSb,则它可能仅与接收到的序列号的相应位进行比较;节省
EEPROM空间。
这些位用于识别设备,根据数据表,通常是前面讨论的序列号的最低有效位。
OVR 位
溢出位用于扩展可能的同步值的数量。同步计数器的长度为 16 位,在循环重复之前产生 65,536 个值。在每天 10 次操作的典型使用情况下,这将提供近 18 年的使用时间,然后才会使用重复值。如果系统设计人员得出结论认为这是不够的,则可以利用溢出位来扩展唯一值的数量。这可以通过在生产时将 OVR0 和 OVR1 编程为 1s 来实现。编码器将在第一次同步值从 0xFFFF 回绕到 0x0000 时自动清除 OVR0,并在计数器第二次回绕时清除 OVR1。一旦清零,OVR0 和 OVR1 不能再次设置,从而创建计数器溢出的永久记录。这可以防止 64K 计数器的快速循环。如果解码器系统被编程为跟踪溢出位,那么唯一同步值的有效数量可以扩展到 196,608。
在正常情况下,这些位将为零。根据数据表,它们用于将整体同步计数器大小增加两位,但默认情况下未使用。
同步计数器
出数据表:
这是用于创建传输跳码的 16 位同步值。该值将在每次传输后递增。
这是每次按下按钮时递增的值,因此一旦我们得到它,我们将能够大致知道下一个预期值是多少(这将取决于此后按下按钮的次数)。
此外:
图 7-3 显示了一个 3 分区、旋转同步窗口。每个窗口的大小是可选的,但技术是基本的。每次传输经过验证时,都会执行预期的功能,并将传输的同步计数器值存储在 EEPROM 中。根据当前存储的计数器值,有一个 16 个代码的初始“单一操作”转发窗口。如果接收到的同步计数器与上次存储的计数器之间的差值在 16 以内,则只需按一下按钮即可执行预期功能,并存储新的同步计数器。存储新的同步计数器值有效地旋转整个同步窗口。
“双重操作”(重新同步)窗口进一步存在于从当前存储的计数器值向前最多 32K 代码的单一操作窗口。它被称为“双重操作”,因为在此窗口中具有同步计数器值的传输将需要在执行预期功能之前进行附加的顺序计数器传输。在接收到顺序传输时,解码器执行预期功能并存储同步计数器值。这种重新同步对用户来说是透明的,因为如果第一次不成功,第二次按下按钮是人类的天性。
这意味着我们不必命中确切的值,实际上可以猜测更远的 32k 值范围内的数字,几乎是值空间大小的一半。
有三种可能的方法来解决它。
读取 EEPROM
通过读取存储同步计数器的EEPROM。由于不先写入就无法使用 HCS301 读取 EEPROM,因此如果不修改硬件,您通常无法读取它。如果您设法做到了这一点,则可以轻松复制遥控器。对你有好处!
解密单个传输
通过解密单个传输,您可以获得当前使用的同步计数器,并有一个粗略的估计。由于计数器相对很少增加(数据表估计每天增加 10 次),因此您可以轻松猜测出足够的值来成功。
好老的暴力破解
通过对整个值进行暴力破解,您还可以获得正确的值。由于键空间是相对较小的 64k 值,您可以使用它。根据此密码分析和相关工作评论:
根据转发器的不同,收集2^16
明文/密文对需要 65 或 98 分钟。
请注意,他们引用的内容在这里有点断章取意。虽然最初的目的是为芯片的挑战-响应部分获取已知明文/密文的样本,但它们也提供了对协议速度的粗略估计。
这实质上意味着接收者可以在两分钟内处理这么多消息。
幸运的是,使用上面提到的 16 个值窗口,如果做得好,我们可以减少四位。
加密密钥
在上KEELOQ实用攻击本文介绍的KEELOQ加密espclifically作为用于车辆的远程控制和防盗不同的漏洞。如果您有兴趣使用密码分析检索密钥,这是一本很好的读物,它演示了几种可能可行的方法。为方便起见,它还审查了相关的作品。
我将迭代可能的方法:
读取 EEPROM(再次)
如果您已经这样做了,您就可以轻松地将密钥本身与Sync Counter放在一起。
密码分析
以加密方式检索密钥,如上述文章及其参考资料中的详细描述。
使用“学习”功能
根据数据表,该芯片具有称为“学习”的功能,可以使用 OP 提到的 SYNC 值来通信/共享密钥。
“学习”分为三种:
简单学习 - 这基本上意味着同一制造商的所有编码器(遥控器)和解码器(汽车)共享相同的密钥,并使用序列号关联。这很有用,因为它使暴力破解更有利,因为成功检索将为该制造商的所有汽车提供钥匙。它还可以很容易地并行使用多辆车。
正常学习
接收器使用在正常操作期间传输的信息来导出加密密钥并解密接收到的代码字的加密部分
安全学习
发射器通过一个特殊的按钮组合被激活,以传输一个存储的 60 位种子值,用于生成发射器的密钥。接收器使用这个种子值来导出相同的密钥并对接收到的代码字的加密部分进行解密。
可以使用“安全学习”功能,使用制造商密钥来计算密钥。为此,您需要对密钥生成算法(存储在接收器/汽车中)进行逆向工程,并从那里获取制造商密钥。
只提到了正常学习和安全学习,但在数据表中没有进行深入描述,这使得在没有手动分析的情况下更难绕过那些。
虽然数据表中没有描述“安全学习”的实现/设计细节,但在第 29 页提到了一项名为“安全自学系统”(美国专利 US 5686904 A)的专利申请。
该专利包括以下相关但含糊不清的段落:
在安全学习操作期间在密钥生成单元42中使用的密钥生成算法通常是非线性算法。该算法接受制造商的主密钥40(未知)和密钥生成信息作为输入。密钥生成信息可以由编码器序列号24或种子20或两者组成。该信息在学习操作中从编码器传输到解码器。解码器12使用密钥生成算法来生成用于解码正常跳码传输的密钥44。这种机制的安全性与以下事实有关:传输的种子和解码密钥之间的关系是未知的,使得任何类型的传输拦截都无用。非线性密钥生成函数也使得无法在密钥和密钥生成信息之间建立任何关系,使得可能的冒名顶替者无法复制非法编码器。编码器10的密钥22、序列号24和随机生成的种子20在制造过程中被加载。制造商使用种子、序列号、制造商主密钥和密钥生成算法生成密钥。密钥生成算法不公开。因为种子是一个随机数,所以制造两个密钥相同的编码器的可能性很小。考虑到在这个过程中也使用了序列号,这是极不可能的。使可能的冒名顶替者无法复制非法编码器。编码器10的密钥22、序列号24和随机生成的种子20在制造过程中被加载。制造商使用种子、序列号、制造商主密钥和密钥生成算法生成密钥。密钥生成算法不公开。因为种子是一个随机数,所以制造两个密钥相同的编码器的可能性很小。考虑到在这个过程中也使用了序列号,这是极不可能的。使可能的冒名顶替者无法复制非法编码器。编码器10的密钥22、序列号24和随机生成的种子20在制造过程中被加载。制造商使用种子、序列号、制造商主密钥和密钥生成算法生成密钥。密钥生成算法不公开。因为种子是一个随机数,所以制造两个密钥相同的编码器的可能性很小。考虑到在这个过程中也使用了序列号,这是极不可能的。序列号、制造商主密钥和密钥生成算法。密钥生成算法不公开。因为种子是一个随机数,所以制造两个密钥相同的编码器的可能性很小。考虑到在这个过程中也使用了序列号,这是极不可能的。序列号、制造商主密钥和密钥生成算法。密钥生成算法不公开。因为种子是一个随机数,所以制造两个密钥相同的编码器的可能性很小。考虑到在这个过程中也使用了序列号,这是极不可能的。