在多层停车场中,用户用来抬起横竿的红外线通行卡就是身份验证设备的一个简单实例,它首先发送自身的序列号,之后再发送一个身份验证块,其中包括与之前序列号相同的序列号,后跟一个随机数——?所有这些信息都用该设备独有的密钥进行加密。我们暂不讨论如何对数据进行加密以及密文应该具备什么特性,这里用符号{X}K简单地表示用密钥K对消息X加密。
以上面的约定为基础,汽车通行卡和停车场之间的协议可以写成如下形式:
T→G:T,{T, N}KT
这是标准的协议工程表示法,刚开始了解时可能不太明白,所以我们将慢慢地对其进行讲解。
汽车内的通行卡发送其名称T,其后跟加密的T,之后是N,这里N代表“一次性使用的数字”或Nonce,花括号内的所有信息都是加密的,通过加密,将T与N绑定在一起并使其值难于理解。使用Nonce是为了向接受者保证消息是新鲜(fresh)的,也就是说,不是重放攻击者观察到的旧消息。身份验证过程很简单:停车场服务器读到T,获得相应的密钥KT,把余下的消息解密,确认Nonce N是第一次出现,最后确认明文中包含T(这种身份验证方式将有效阻止停车场中的窃贼使用连续的密文猜测对所有汽车进行并行盗窃尝试)。
上面的表示法导致很多人混淆的原因之一是,在冒号左侧,T代表主体(用户的令牌),而在冒号右侧,T代表令牌的名字(序列号)。另一个原因是,在本书开始讨论攻击协议时,我们发现从令牌T发往停车场G的消息实际上被中间人F截获了,并在之后进行重放。所以这种表示法在这里并不合适,但是由于一直的习惯使得现在难以更改。专业人员一般只把冒号左边的T→G简单地看成是协议设计者头脑中的一种示意表示。
术语Nonce可以指代任何能保证消息新鲜性的信息。根据不同的上下文,Nonce可以是随机数、序列号、第三方发出的随机质询信息,甚至可以是时间戳。这些方法有微小的差别,比如,它们抵抗各种重放攻击的能力不同,提高系统复杂性的方式也不同。但在低成本的系统中,前两种占优势,因为它们可以更廉价地建立单工通信信道,并且廉价设备通常也没有时钟。
这种设备的密钥管理非常简单。典型的停车场令牌中,其密钥就是使用全局主密钥KM对其序列号加密得到的(只有中央服务器知道KM):
KT={T}KM
这就是密钥分散化(key diversification)。它给出了实现访问令牌的一个简单方法,并在以智能卡为基础的系统中得到了广泛应用,但仍然有很多地方会出现错误。有一种错误是因为序列号长度不够导致的,由于这一错误,人们偶尔会发现自己的遥控器可以对停车场内的其他汽车进行控制。即便对16位序列号进行加密得到128位的密钥,也不能解决这一问题。
弱密码也是一个问题。很多汽车制造商在其车锁与防盗系统的令牌技术中使用了一种称为Keeloq的分组密码,这种密码是在20世纪80年代晚期发明的,使用了最小数量的门。该算法中包含一个使用简单轮函数进行大量迭代的过程。然而,近些年来,对这种密码的攻击方法已经涌现出来,其中就包括Keeloq,要进行这种攻击,需要拥有一个小时左右的密钥访问权,以便收集攻击所需的足够数据,之后在PC机上对其进行大概一天时间的处理,就可以恢复其中包含的加密密钥[172]。或许你认为这是一种不可行的攻击,因为攻击者要想具备对密钥的访问权,首先要拥有汽车驾驶权。然而,在有些实现中,还有严重的协议漏洞,因为密钥分散化不是使用分组密码本身实现的,而是使用异或计算方法:KT=T?KM。因此,在破解了某种类型汽车的单车密钥后,就可以马上计算出该类型其他汽车的密钥。发现这种攻击者的研究者表示:“很快,密码破译者就会开上好车了”。