引言
为了占据更大的市场份额,汽车生产厂家既要降低成本,又要不断地完善汽车的功能;同时,车主们对汽车的要求也越来越高,其中汽车安全和使用便捷成为性能之外人们关注的两个热点。无钥匙进入系统(Passive Keyless Entry,PKE)以其使用方便和安全性高两大特点,得到广大用户的接受和认可。但市场上的PKE技术,掌握在Microchip和Freescale等国外电子工业巨头手中,产品成本较高,致使大部分中端汽车和全部的低端汽车无法配备此系统。
本文在高级加密算法(AES)的基础上,参照Microchip和Freescale公司的PKE产品,提出了一种带实时计数器的通信协议,在降低计算量的同时,又能保证通信内容的安全性。此设计方案可运行在满足ROM(或Flash)和RAM空间的任意微控制器上运行,设计人员可依据实际情况选择适当微控制器并对程序进行相应修改,以达到产品要求。
1AES加密算法分析
美国国家标准和技术协会(NIST)在2000年10月选中Rijndael算法作为AES算法,并确定数据分组长度为128位。密钥长度有128位、192位和256位三种,本文应用密钥长度为128位的AES加密算法。
标准AES加密算法由10轮构成,每一轮有一个由原始密钥生成的轮密钥对数据进行加密。每一轮包括4个基本步骤(又称为层):ByteSub(BS)变换层、ShiftRow(SR)变换层、MixColumn(MC)变换层和AddRoundKey(ARK)层。每一轮的输入和输出都是128位。
将需要要进行加密的128位输入数据分成16个字节,记作:a0,0,a1,0,a2,0,a3,0,a0,1,a1,1,…,a3,3。将其排成一个4×4的矩阵:

在每一轮的加密操作中,针对每一个字节进行运算。
(1) ByteSub变换
此步骤是通过AES的S盒进行字节的非线性替换,以达到抵抗微分和线性攻击的目的。
方法是:将每一个字节记为abcdefgh,则abcd代表行,efgh代表列,通过查表法将变换字节替换成S盒第abcd行、第efgh列对应的字节,如下所示(在解密时对逆S盒进行同样处理):

(2) ShiftRow变换
在此步骤中,矩阵元素数值不变,只改变每行元素的位置,即:第0行的元素位置不变,第1行的4个字节循环左移1个字节,第2行的4个字节循环左移2个字节,第3行的4个字节循环左移3个字节,如下所示:

本步骤的目的是对加密数据的位进行混淆,抵抗截短差分和平方攻击;解密时,进行循环右移。
(3) MixColumn变换
此步骤中,将ShiftRow变换后的矩阵左乘上一个可逆4×4矩阵Ci,j,从而得到矩阵Di,j,达到字节扩散的目的。Ci,j如下所示:

(4) AddRoundKey变换
此步骤主要是把MixColumn变换后的矩阵同每轮中相应的轮密钥进行异或操作。
(5) 密钥扩展
在AES加密过程中,每一轮的加密都使用了不同的轮密钥,这些轮密钥都是通过特定的运算方法从给定的128位原始密钥中推导而来。密钥扩展运算增加了密钥位的非线性,使密码分析人员在知道部分密钥的情况下,不能推导出密钥的其余位,同时也保证了两个密钥的差异性,提高了密钥的安全性。
密钥扩展方法如下:将128位的原始密钥转换成4×4矩阵,将每列分别记为:W(0),W(1),W(2),W(3)。设密钥扩展结果为W(i)(i = 4,…,43),如果i不是4的倍数,则 W(i)=W(i-4)W(i-1);如果i是4的倍数,那么W(i)=W(i-4)T(W(i-1)),其中T(W(i-1))是对W(i-1)的变换。
变换过程如下:记列W(i-1)中的元素为a、b、c、d,左循环移位得到b、c、d、a;然后将这些字节用S盒中的相应元素替代,得到4个字节e、f、g、h。则T(W(i-1))=(e2(i-4)/4,f,g,h)。依据以上变换方法,可依次计算出每轮的轮密钥。
AES加密过程如图1所示。其中,W(0)~W(3)为原始密钥。

图1AES加密过程
2硬件架构
如图2所示,PKE系统由遥控钥匙模块和集成在车身控制系统中的接收模块组成。遥控钥匙模块将用户数据分组、加密、组帧、编码后通过射频电路发射出去;接收模块则对接收到的数据进行解码、解密、验证后,依据命令执行相应操作。

图2系统结构框图
2.1遥控钥匙模块
遥控钥匙由4个部分组成:核心控制器、按键模块、315 MHz高频发射模块和125 kHz低频接收模块。本设计选用Atmel公司的ATA5773和奥地利Microsystem公司的AS3933作为核心部件。其中,ATA5773是一款集成4 KB Flash、256字节SRAM、256字节 EEPROM的AVR微控制器和315 MHz的UHF发射器,在满足控制系统各项资源要求的同时,又可提供高性能的UHF发射模块。ATA5773能接收125 kHz信号,验证通过后用于唤醒遥控钥匙的微控制器,同时也能接收相应数据。
2.2接收模块
接收模块由核心控制器、数据存储模块、CAN/LIN总线通信模块、315 MHz UHF接收模块、125 kHz低频发射模块以及其他外设组成。本设计中选用Freescale公司的8位单片机MC9S08DV32作为核心控制器。该控制器集成CAN总线通信模块,只需少量外设便可与汽车其他功能模块安全通信。93C56A是一款256×8位的EEPROM存储器,用于存储本系统中需要保存的相关数据。Atmel公司的ATA8201是一款UHF接收芯片,用于接收315 MHz的高频信号。ATA5276是一款125 kHz的低频信号发射芯片,用于发送相应通信数据。
3软件构架及通信协议
依据PKE系统的特点及应用环境,本文将系统中的重要功能模块设计为单个的子系统,通过特定入口参数和出口参数与主系统和其他系统通信。子系统分别为:密钥发生子系统、AES加密子系统、钥匙学习子系统、通信子系统、底层驱动系统。其中,密钥发生子系统和AES加密子系统由遥控钥匙模块和车身上的接收模块共用。设计人员可以依据实际情况调用以上子系统,完成自己的设计,也可以替换不合理的子系统。
3.1密钥发生子系统
密钥的保密性是保障PKE系统通信安全的重要环节,为了提高密钥的保密级别,本文专门设计了密钥发生子系统。在遥控钥匙首次启动时,密钥发生子系统会随机产生一个本地密钥,既保障了密钥的保密性,又避免不同钥匙的密钥发生冲突。
密钥分为两部分:本地密钥和可变密钥。
每次通信的加密密钥由本地密钥和可变密钥按特定格式进行异或运算后得到,具体操作如下:在产品生产时,生产商向车身接收模块和遥控钥匙的程序空间写入相同128位的OEM(Original Equipment Manufacturer)码。当钥匙进行学习时,系统会产生一个128位的伪随机数,以事先写入的OEM码为加密密钥,对伪随机数进行加密,得到的128位加密数据作为遥控钥匙的本地密钥。车身接收模块通过对同一伪随机数进行加密得到与遥控钥匙相同的本地密钥。
在钥匙系统中存在一个随时间和按键变化的32位计数器,此处称为可变密钥。本地密钥和可变密钥通过一定变换后产生每次发送数据时的加密密钥,变换过程如下:系统产生4个大小在0~15的伪随机数,称为加密密钥发生标志。每一个发生标志与可变密钥的4个字节一一对应,指示出可变密钥与本地密钥对应的字节位置,两者进行异或运算后得到加密密钥。加密密钥的发生过程如图3所示。

图3加密密钥发生过程
3.2钥匙学习子系统
遥控钥匙模块与车身接收模块要正常通信,车身接收模块需保存对应钥匙的钥匙号、本地密钥、加密密钥发生标志以及低频唤醒序列。钥匙号是该钥匙的编号,同批次产品中每个钥匙的序号是不同的,由钥匙生产商固化在产品中。车身接收模块存储的本地密钥是通过与遥控钥匙相同的加密模块对同一伪随机数进行加密后得到,伪随机数由钥匙通过UHF发送到车身接收模块。加密密钥发生标志是4个0~15的随机数;低频唤醒序列是一个16位数值,鉴于曼彻斯特码不能存在连续3个相同的位,因此,低频唤醒序列由系统对产生的16位伪随机数进行加工后形成。拥有这个随机数后,只有低频唤醒电路接收到低频唤醒序列时,主系统才会被唤醒,从而减少了唤醒误操作。
综上所述,学习过程中,钥匙需向车身接收模块发送以下数据:
◆ 伪随机数,128位,由遥控钥匙产生;
◆ 钥匙号,32位,由钥匙生产商固化在产品中,同批次中序号唯一;
◆ 加密密钥发生标志,16位,由4个0~15的数组合而成;
◆ 低频唤醒序列,16位,同遥控钥匙产生;
◆ 消息验证码,64位,从数据加密结果中截取。
以上数据共32字节,分为2个学习帧发送,每帧中加1字节的学习标志,则每个学习帧有17字节数据。第一帧和第二帧发送数据格式如下:

车身接收模块接收到学习帧数据后,通过AES加密算法计算出本地密钥,通过消息验证后存储到系统中,同时存储钥匙号、低频唤醒序列以及加密密钥发生标志。
3.3通信子系统
对于通信系统,本文分为两部分描述:信息发送部分和信息接收部分。两者之间的通信安全由以下机制保证:数据发送端对相关信息进行加密,把加密结果或加密结果的特定数据段作为消息验证码,再将未加密的数据、可变密钥和消息验证码发送到接收端;接收端在接收到数据后,用同样的密钥对同一数据进行加密,并将加密结果与消息验证码进行对比,如果两端加密结果相同,则接收该数据。该机制的优点是:实现安全通信,不用设计AES解密算法,降低了工作量,同时减少了接收端运算量(AES解密算法占用时间较长)。
3.3.1信息发送端
当有按键触发或低频唤醒信号时,遥控钥匙依据当前可变密钥计算出加密密钥,对钥匙号和命令字节进行加密。由于AES加密长度为128位,故需要对钥匙号和命令字节进行扩展,把5字节的数据扩展为16字节,扩展算法由发送端和接收端共用。对于消息验证码有两种选择:一种是把加密结果全部作为消息验证码;另一种是从加密结果中截取特定字节作为验证码。本设计中截取加密结果的64位数据段作为消息验证码,截取算法由发送端和接收端共用。信息发送端数据准备流程如图4所示。

图4信息发送端数据准备流程
命令数据以帧形式发送,每个数据帧包括:钥匙号(4字节)、命令字节(1字节)、可变密钥(4字节)、消息验证码(8字节)、和校验(1字节)。可依据实际情况增加每帧数据内容,如帧识别等。
3.3.2信息接收端
车身接收模块在接收到数据后,分为4个步骤进行操作:
① 检测钥匙号是否存在,如果存在则进入下一步,否则丢弃该帧。
② 检测此信号是否已经接收到,如果尚未接收到,则进入下一步,否则丢弃该帧。
③ 将接收到的可变密钥与本地密钥进行异或后获得加密密钥,对接收到的钥匙号和命令数据进行数据扩展后加密,与消息验证码进行对比。如果验证通过,进入下一步,否则丢弃该帧。
④ 记录此次通信的可变密钥,并接收命令数据,执行相关命令。
结论
通过C语言实现本系统提出的AES加密算法以及通信协议,发送端和接收端程序分别在AVR单片机和Freescale单片机上运行成功,通过人工输入数据检验,所有功能工作正常。