我对Keeloq安全性有疑问。我有一个原装的汽车遥控器(BFT Mitto 2),我知道此芯片使用带有Keeloq实现的HCS301。 。我知道通用遥控器可以像这样复制遥控器(http://www.amazon.fr/T%C3%A9l%C3%A9commande-Copieuse-T%C3%89L%C3%89COMMANDES-t%C3%A9l% C3%A9commandes-descriptif / dp / B00GTV5SUQ),但我很好奇,我认为这是一个有趣的电子项目。因此,我研究了该组件的数据表。我已经欺骗了两个连续的命令,并保存了种子代码(通过按所有按钮进行检索)。 br />数据2:
地穴部分:0xFD32DEBA序列号:0x719A00

种子代码:0xB1755164

如何使用此信息学习新的遥控器?我不知道通用遥控器的工作原理,但是根据数据表,我需要知道制造商ID才能创建设备密钥。您能告诉我如何进行吗?

谢谢!

#1 楼

要创建完整的副本,能够生成有效的传输数据包,您需要以下信息:


序列号
按钮按下映射
32位KeeLoq加密数据

请参见数据表中所附的图1-2,位于右下角“已传输的信息”附近:从理论上讲您可以创建自己的设备的信息。数据包,因为它是按原样发送的。 OP已检索到它。

以后也需要该序列,因为它也是加密数据的一部分,因此无需首先解密传输即可检索它的功能可能会帮助我们简化工作。创建加密的部分。

键映射

为了发送特定的键,您需要创建自己的值到键含义的映射。这不像获取任何已传输消息的单个值那么容易,但是并没有证明任何困难,只需按下每个键并捕获其“按钮按下信息”字段即可。 OP似乎也可以做到这一点。

32位KeeLoq加密数据

这是很严重的问题,我们除了需要了解什么还要加密键:


按钮状态。
DISC位。
OVR位。
同步计数器(每按一次按钮,16位字增加一次)控制器的寿命)。
加密密钥(在数据表中叫“ Crypt Key”,以确保声音:D)

请参见数据表中的图4-2,右部分: />


按钮状态位

这四个位是未加密发送的相同位,因此我们已经讨论了它们相当容易的检索。

DISC位


鉴别值有助于后解密
检查解码器端。它可以是任何值,但是在典型系统中,它将被编程为序列号的10个最低有效位。学习了
发送器后,
以外的其他值必须由接收器分别存储。鉴别位是构成
传输的加密部分的信息的一部分(图4-2)。接收者
对传输进行解密后,将根据接收者的存储值对鉴别位进行检查,以验证解密过程是否有效。如果将判别值编程为序列号的10 LSb,则可以将其仅与接收到的序列号的相应位进行比较;
节省EEPROM空间。


这些位用于标识设备,根据数据表,这些位通常是先前讨论的序列号的最低有效位。

OVR位


溢出位用于扩展可能的同步值的数量。同步计数器的长度为16位,在循环重复之前产生65,536个值。在通常每天使用10次操作的情况下,这将提供将近18年的使用时间,然后再使用重复的值。如果
系统设计人员得出结论认为不够充分,则可以利用溢出位来扩展唯一值的数量。可以通过在生产时将OVR0和OVR1编程为1来完成。
编码器将在第一次将同步值从0xFFFF包装到
0x0000时自动清除OVR0,并在第二次计数器
包装时自动清除OVR1。一旦清除,将无法再次设置OVR0和OVR1,从而创建
计数器溢出的永久记录。这会阻止64K快速循环
计数器。如果将解码器系统编程为跟踪溢出位,则唯一同步值的有效数量可以扩展到196,608。


通常情况下,这些位将为零。根据数据表,它们通常用于将整体同步计数器的大小增加两位,但默认情况下未使用。

同步计数器

数据表之外:


这是16位同步值,用于创建要传输的跳跃代码。该值在每次传输后都会增加。


这是每次按下按钮时都会增加的值,因此一旦获得,我们就可以大致知道下一个期望值

另外:


图7-3显示了一个3分区的旋转同步
/>窗口。每个窗口的大小是可选的,但是
技术是基本的。每次对传输进行验证时,都会执行预期的功能,并且将传输的同步计数器值存储在EEPROM中。从当前存储的计数器值
,有一个初始的“单一操作”前向窗口,该窗口包含16个代码。如果接收到的
同步计数器与最后存储的计数器之间的差是
在16之内,则按
一次按下按钮即可执行预期功能,新的同步
计数器被存储。存储新的同步
计数器值可以有效地旋转整个同步
窗口。

从“单操作”窗口向上还存在一个“双重操作”(重新同步)窗口。到当前存储的计数器值的32K
代码。它被称为“双重操作”,因为在此窗口中具有同步计数器值的传输

在执行预期功能之前,将需要进行额外的顺序计数器传输。
接收到顺序传输后,解码器将执行预期功能并存储同步计数器值。这种重新同步
对用户来说是透明的,因为这是人类的天性
如果第一次不成功则第二次按下按钮。不必精确击中值,实际上就可以猜出一个数字,该数字的范围最远可达32k,几乎是值空间大小的一半。

有三种可能的计算方法

读取EEPROM

通过读取EEPROM,其中存储了同步计数器。由于必须先写入HCS301,才能使用HCS301读取EEPROM,因此,如果不对硬件进行修补,通常就无法读取它。如果您设法做到这一点,则可以轻松地复制一个遥控器。对您有好处!

解密单个传输

通过解密单个传输,您可以获得当前使用的同步计数器,并有一个粗略的估计。由于计数器的增加相对很少(数据表每天估计增加10次),因此您可以轻松猜测足够的值才能成功。您还可以获得正确的值。由于键空间的值相对较小,为64k,因此可以这样做。根据此密码分析和相关作品的评论,


根据应答器,收集2^16纯文本/密文对需要65或98分钟。


请注意,这里引用的内容略有脱离上下文。虽然最初的意图是为芯片的质询响应部分获取已知明文/密文的样本,但它们还提供了协议速度的粗略估计。

从本质上讲,这意味着接收方可以在不到两分钟的时间内处理大量消息。

通过上述16个值窗口,如果处理得当,我们可以削减4位。

加密密钥

《对KeeLoq的实际攻击》一文描述了KeeLoq加密的不同漏洞,尤其是用于车辆遥控器和防盗器的漏洞。如果您有兴趣使用密码分析来检索密钥,那么这是一本好书,它演示了几种可能可行的方法。为了方便起见,它还会回顾相关工作。这样,您就可以轻松地将密钥本身与Sync Counter一起获得。引用。已经提到。

有三种类型的“学习”:


简单学习-这基本上意味着所有编码器(远程控件)和解码器(汽车)通过同一制造商共享同一密钥,并使用序列号进行关联。这很有用,因为它使暴力破解更为有益,因为成功的检索将为该制造商的所有汽车提供钥匙。它还使使用多辆车的并行化变得容易。 br />密钥并解密接收到的代码字的
加密部分



安全学习通过特殊的
按钮组合来传输存储的60位
用于生成发射机的
加密密钥的种子值。接收者使用此种子值
导出相同的密钥,并对接收到的代码字的加密部分进行解密。



可以使用“安全学习”功能,并使用制造商密钥来计算密钥。为此,您需要对密钥生成算法(存储在接收器/汽车中)进行反向工程,然后从那里获取制造商密钥。

仅提到了正常学习和安全学习,但是没有提到

尽管数据表中没有描述“安全学习”的实现/设计细节,但专利文件名为“安全”自学习系统”(美国专利US 5686904 A)在第29页上提到。

该专利包括以下相关但模糊的段落:在安全学习操作期间在密钥生成单元42中使用的算法通常是非线性算法。此算法接受制造商的主密钥40(未知)和密钥生成信息作为输入。密钥生成信息可以由编码器序列号24或种子20或两者组成。
该信息在学习操作中从编码器传输到解码器。
解码器12使用密钥生成算法为
生成密钥44,该密钥44用于解码普通代码跳频传输。该机制的安全性涉及这样一个事实,即所传输的
种子与解码密钥之间的关系不被了解,从而使传输的任何形式的拦截均无用。非线性
密钥生成功能还使得无法建立
密钥与密钥生成信息之间的任何关系
,从而使可能的冒名顶替者
复制非法编码器。在制造过程中装入密钥22,序列号24
和随机生成的编码器10的种子20。制造商使用种子,序列号,制造商主密钥和密钥生成算法来生成密钥。密钥生成算法尚未公开。由于种子
是一个随机数,因此制造两个具有相同键的
编码器的可能性很小。考虑到
在此过程中也使用序列号,因此
不太可能。