关于滚动代码,我有一些一般性问题。基本上有一个发送者和一个接收者。两者都有一个序列发生器。接收器检查接收到的序列是否与新生成的序列匹配。 KeeLoq就是一个例子。

假设有一个开门者(发送者)和一辆汽车(接收者):序列?想一想在超出汽车范围时按下了​​键。
他们如何同步序列点?如何实现?


评论

重点是防止重放攻击。否则,您将不必费心滚动代码,也不必处理由发送方和接收方之间的不匹配而引起的问题。

相关:“滚动代码表和接收器如何同步?”

#1 楼


如果发件人在序列中的另一点会发生什么? ...
超出汽车范围时,按下该键。


在滚动编码(跳码)系统中,
遥控钥匙发射器保持一个同步计数器C,
每按一次按钮都会增加。
汽车接收器存储已收到N的最新的
有效同步计数器。

滚动时代码接收器收到一条消息,消息中的密钥卡序列号似乎与其内部存储器中的授权密钥卡之一匹配,
它从消息中提取密钥卡的同步号C,并将其与最近验证的同步号N进行比较。

在正常情况下:


接受滚动窗口中的C-C大于最后验证的“几个”代码K传输(0
当消息中的计数器C在接受窗口中时,汽车将接受该消息作为真实消息,
汽车用最新的覆盖N值C,汽车将开门或执行消息指示的其他操作。

(只要您按住按钮,钥匙扣将一次又一次地重复发送相同的消息一秒钟又几次。直到您放开按钮并再次按下按钮,它才会发送带有下一个连续计数器编号的消息)。是
可接受的代码范围之内?


是。 AVR411接收器默认为WINDOW_SIZE =100。
因此,对于典型的AVR411系统,如果汽车没有听到连续100次按键的声音,
那么当汽车最终返回时,它将忽略钥匙扣。范围。

使用典型的KeeLoq系统,如果汽车没有听到连续16次按键的声音,那么当它最终回到范围内时,汽车将不会在钥匙扣的第一次按键上解锁车门。但是,如果汽车随后在重新同步窗口内听到两次连续的按钮按下(K 通常会超过一千次按钮按下,
汽车将重新同步并解锁车门。 br />对于典型的HCS301系统,如果汽车没有听到连续几千次按键的声音,那么
汽车将在最终返回范围内时忽略钥匙扣。


它们如何同步序列的点?
...
如何实现它们?
?在钥匙扣之前可以使用,汽车必须“学习”钥匙扣。
通常按住“学习按钮”(“学习开关”)10秒钟,会删除接收者对每个钥匙扣的记忆;然后松开该按钮,使接收器进入“学习模式”。
通常,同时按下钥匙扣上的锁定和解锁按钮可使钥匙扣将其唯一的秘密密钥发送给接收器。
接收器-在学习模式下-会将其听到的密钥卡序列号存储为授权密钥卡,
,还存储密钥和当前的同步计数器N。
安静10分钟后连续两秒钟不按任何按钮,接收器将退出学习模式,并进入正常模式。

之后,该接收器-处于正常模式-现在将与钥匙扣同步。 />
钥匙扣只能使用很少的电池电量,
钥匙扣只能发送-从未收到,这一事实使使用许多密码算法变得困难或不可能。

有关两种流行的滚动代码实现的详细信息,请参见:


维基百科:滚动代码
Atmel:“ AVR411 :无线链接的安全滚动码算法”

微芯片:“ HCS301:KeeLoq跳码编码器”

微芯片:“ AN661:”使用PIC16C56的跳码解码器“

微芯片:” AN1248:KeeLoq接收器系统“

Andy Carvell:RKE分析

Mike Szczys“密钥卡编程”



评论


$ \ begingroup $
真的值得阅读上面引用的AVR411的应用笔记。它包括设计目标,威胁模型,设计原理,弱点和参考实现。这是最新的(2019)链接:microchip.com/wwwAppNotes/AppNotes.aspx?appnote=en591226
$ \ endgroup $
– MZB
19年1月28日在15:07

#2 楼

值得指出的是,萨米·坎卡尔(Samy Kamkar)在2015年意识到并实现了现在回想起来很明显的事情-拥有无线电TX + RX单元监听合法代码,然后打开瞬时干扰发射器,这是完全可行的稍微破坏了它的末尾(因此接收者无法识别为有效)。然后,钥匙扣所有者会想“​​哦”,然后再次按下按钮,发送第二个密码。您再次做同样的事情(窥探它并稍微破坏它),然后重新传输第一个代码;导致汽车/车库打开。所有者只是简单地看到它第二次开始工作并开始工作。留下第二个(仍然有效)滚动代码以在您闲暇时重播。这就是所谓的“ Rolljam”攻击,并且几乎破坏了所有滚动代码的安全性。

#3 楼

在滚动代码中,发送方和接收方都始终按顺序前进。如果发送方已发送了第$ n $个代码,则它将发送下一个$(n + 1)$ th个代码。相反,如果接收方看到了$ n $ th码,它将仅接受$(n + 1)$ th码或某些后续代码。


如果发送方是在序列的另一点?想一想在超出汽车范围时按下了​​键。
他们如何同步序列的点?


接收器将不得不跳过那些中间点。一种策略是扫描下一个$ k $可能的代码并进行比较。如果接收到的代码在$ [n + 1,n + k] $范围内,则将被接受。


是否可以防止检测重放攻击?它们如何实现?


重播攻击将不起作用,因为捕获的代码不再在可接受的范围内-如果序列周期足够长,则永远不会。 >

评论


$ \ begingroup $
那么发送者有可能超出$ k $接受代码的范围吗?因此,汽车将无法再打开...针对环境污染的拒绝服务攻击;-)但是有没有一种方法可以防止这些攻击?
$ \ endgroup $
–matcauthon
2014年7月25日4:46



$ \ begingroup $
@matcauthon,假设它使用这种同步方法,那么可以,我认为大多数都可以。除了代码之外,可能还有其他算法可以发送一个序列计数器-那么您需要具有加密功能的原语,而不仅仅是混淆。
$ \ endgroup $
–otus
2014年7月25日在8:04



$ \ begingroup $
如果扫描仪或某物接收到信号而不是预期的接收者,那么可以不重播吗?例如,如果发送器按顺序发送了代码n,并且被除预期接收者以外的接收器接收,则预期接收者仍将等待,期望代码介于n和n + k之间。然后,扫描程序可以将捕获的代码n播放回接收者,并且它将解锁。这仅在扫描仪接收到信号而不是预期的接收者而不是接收到的信号时才起作用。还是我缺少其他安全功能?
$ \ endgroup $
–西蒙·图西(Simon Tewsi)
2015年12月13日在1:23



$ \ begingroup $
@SimonTewsi,是的。但是,一旦预期的接收者收到了以后的信号,捕获的信号将不再有效。因此,在正常使用中,仅在例如汽车需要打开,实际上不会有利用这种攻击的机会。
$ \ endgroup $
–otus
15年12月13日在7:57