之前由于网络安全的问题,系统升级或者功能维护的频率越来越快,我们在对系统设备进行升级的时候真的是不得不做出一些防护措施。为有效保护企业产品机密,根据嵌入式系统的MCU存储结构和更新原理,提出了通过加密方式升级设备功能的方法。
1、MCU的ISP和IAP功能
现在MCU已经普遍采用Flash型的EEPROM作为程序存储器,Flash结构的存储器写入时可以按字节操作把1写成0,擦除时都是按扇区操作,把0写成1。它的流行与普及为ISP/IAP功能的实现提供了技术基础。
ISP,In System Programming,它的意思是“在系统编程”,即MCU不需要从电路板上取下就可以编程写人最终用户代码,已经编程的器件也可以用ISP方式擦除或再编程,从而改变了单片机系统的固化程序升级需拔插单片机芯片、使用专用编程器进行烧录的麻烦方式,轻松实现在单片机系统电路板上对单片机芯片内固化的程序进行升级。
IAP,In Application Programming,它的意思是“在应用编程”,即MCU在运行时程序存储器可由程序自身进行擦写。也就是说程序自己可以往程序存储器里写数据或修改程序。这种方式的典型应用就是程序运行中的数据存储。ISP/IAP的区别是:ISP通常是在手工操作下整片擦除、编程,需要简单的硬件资源;而IAP却是在某段程序的控制下对另外一段程序Flash进行读写,可以控制对特定地址的读写操作。实际上单片机的ISP功能就是通过IAP技术来实现的,即芯片在出厂前就已经有一段芯片制造商的boot程序在芯片里面,片子上电后,开始运行这段程序,当检测到上位机有下载要求时,便和上位机通信,然后下载数据到存储区。其实在系统编程是通过厂商的boot程序对片内Flash存储器进行擦除/编程的方法,而在应用编程是用户的应用代码对片内Flash存储器进行擦除/编程的方法。正是因为有了IAP,从而使得MCU可以将数据写入到程序存储器中,数据如同烧入的程序一样,掉电不丢失。IAP技术的普及对于高档仪器仪表的智能化意义重大,使得仪器的程序可以根据实际情况进行改变和调整。
2、数据加密
加密就是把明文变成别人看不懂的密文,然后发送给自己想要的人,接收方用配套的解密算法又把密文解开成明文,这样就不怕在传送的路上被别人截获而泄密,以此来防止非授权用户使用该数据。
数据加密中的明文是指原始的或未加密的数据,需要通过加密算法对其进行加密,加密算法的输入信息为明文和密钥;密文,即明文加密后的格式,是加密算法的输出信息。加密算法是公开的,而密钥则是不公开的。密文,不应为无密钥的用户理解,用于数据的存储以及传输。传统的加密方法有两种,替换和置换。替换是使用密钥将明文中的每一个字符转换为密文中的一个字符。而置换仅将明文的字符按不同的顺序重新排列。单独使用这两种方法的任意一种都是不够安全的,但是将这两种方法结合起来就能提供比较高的安全程度。
加密方式分为对称加密和不对称加密。对称,就是采用这种加密方法的双方使用同样的密钥进行加密和解密。在对称加密算法中,数据发送方将明文和加密密钥一起经过特殊加密算法处理后,使其变成复杂的加密密文发送出去。接收方收到密文后,若想解读原文,则需要使用与加密相同的密钥及相同算法的逆运算对密文进行解密,才能使其恢复成可读明文。这就要求加密密钥能够从解密密钥中推算出来,同时解密密钥也可以从加密密钥中推算出来。而在大多数的对称算法中,加密密钥和解密密钥是相同的,使用的密钥只有一个,发收信双方都使用这个密钥对数据进行加密和解密,这就要求发送方和接收方在安全通信之前,商定一个密钥。对称算法的安全性依赖于密钥,泄漏密钥就意味着任何人都可以对他们发送或接收的消息解密,所以密钥的保密性对通信安全至关重要。由于其计算量小、加密速度快、加密效率高,对称性加密通常在消息发送方需要加密大量数据时使用。如果用户每次使用对称加密算法时,都使用其他人不知道的惟一密钥,安全性是可以得到保证的。
不对称加密算法的基本原理是,如果发信方想发送只有收信方才能解读的加密信息,发送方必须首先知道接收方的公钥,然后利用接收方的公钥来加密原文;接收方收到加密密文后,使用自己的私钥才能解密密文。显然,采用不对称加密算法,收发双方在通信之前,接收方必须将自己早已随机生成的公钥送给发送方,而自己保留私钥。由于不对称算法拥有两个密钥,因而特别适用于分布式系统中的数据加密。非对称加密算法的保密性比较好,它消除了最终用户交换密钥的需要,但加密和解密花费时间长、速度慢,它不适合于对文件加密而只适用于对少量数据进行加密。广泛应用的不对称加密算法有RSA算法和美国国家标准局提出的DSA。以不对称加密算法为基础的加密技术应用非常广泛。
3、常用加密算法
由于受限于MCU的运算能力,并非所有的加密算法都适用于嵌入式系统。TEA(Tiny Encryption Algorithm)是一种小型的对称加密解密算法,由剑桥大学计算机实验室的David Wheeler和Roger Needham于1994年发明。它以加密解密速度快、效率高、实现简单著称。该算法的可靠性是通过加密轮数而不是算法的复杂度来保证的,TEA算法主要运用了移位和异或运算,密钥在加密过程中始终不变。它是一种分组密码算法,其明文密文块为64比特,密钥长度为128比特。TEA算法利用不断增加的Delta(黄金分割率)值作为变化,使得每轮的加密不相同,有很强的抗差分分析能力。
DES算法又被称为美国数据加密标准,是上世纪七十年代美国IBM公司研制的对称密码体制加密算法,并在1977年成为美国官方加密标准。DES的工作原理为:明文按64位进行分组,每个块用64位密钥进行加密,密钥事实上是56位参与DES运算(第8、16、24、32、40、48、56、64位是校验位,使得每个密钥都有奇数个1),分组后的明文组和56位的密钥按位替代或交换的方法形成密文组。每块先用初始置换方法进行加密,再连续进行16次复杂的替换,最后再对其使用初始置换的逆。第i步的替换并不是直接利用原始的密钥K,而是由K与i计算出的密钥Ki。其入口参数有三个:key、data、mode。key为加密解密使用的密钥,data为加密解密的数据,mode为其工作模式。当模式为加密模式时,明文按照64位进行分组,形成明文组,key用于对数据加密,当模式为解密模式时,key用于对数据解密。攻击DES的主要形式被称为蛮力或彻底密钥搜索,即重复尝试各种密钥直到有一个符合为止。如果DES使用56位的密钥,则可能的密钥数量是2的56次方个。随着计算机系统能力的不断发展,DES的安全性比它刚出现时会弱得多,然而从非关键性质的实际出发,仍可以认为它是足够的。不过在实际使用中更多地选择新的加密标准一高级加密标准。
密码学中的高级加密标准(Advanced Encryption Standard,AES),是美国联邦政府采用的一种区块加密标准。这个标准用来替代原先的DES,已经被多方分析且广为全世界所使用。经过五年的甄选流程,高级加密标准由美国国家标准与技术研究院(NIST)于2001年11月26日发布于FIPS PUB 197,并在2002年5月26日成为有效的标准。2006年,高级加密标准已然成为对称密钥加密中最流行的算法之一。AES的区块长度固定为128比特,密钥长度则可以是128,192或256比特,分别称为AES—128,AES—192,AES—256,如果数据块及密钥长度不足时,则补齐之。AES算法是基于置换和代替的,置换是数据的重新排列,而代替是用一个单元数据替换另一个。AES算法使用了多重循环实现置换和替换,在规范中被称为Bytes Sub(字节替换)——对数据的每个字节应用非线性变换;Shift Rows(行位移变换)——对每一行字节循环重新排序;Mix Columns(列混合变换)——对矩阵的列应用线性变换;Add Round Key——对状态和每轮的子密钥进行异或操作。该算法对内存的需求非常低,使得它很适应于资源受限制的环境。
4、加解密在升级中的应用
“在线升级”实际上是Flash数据存储的一个特例。完成这样的功能首先要求芯片提供的EEPROM的地址与程序空间是连续的,一致的,在用户应用程序中可以对另外一部分程序区进行擦除写入操作;再者芯片内部Flash程序存储器容量必须足够大,使之可以分为几个区域相互独立。第一部分是用户的boot程序,完成上电初始化和解密,并将接收的数据写入指定地址。第二部分是程序标识区,标记当前用户程序的运行地址。第三部分是应用程序区1和应用程序区2,当程序运行在程序区1时可以对程序区2进行升级,反之亦然。这两个区域的大小必须不小于用户的目标代码。
在用户程序区可以存放几组密钥信息,与PC下传的随机数按照一定的规则生成解密所需的密钥以保证每次加解密的密钥信息有差异,只要保证每次密钥是唯一的,数据的安全性是可以保证的。需要升级芯片中的程序时,PC机按照通信协议的格式下传指令,用户boot程序接收到指令后初始化各个变量和寄存器,关闭不需要的中断,下传的数据包交叉使用两种加密算法,包号是奇数时用TEA算法加密并同时下传两组随机数共16个字节,一组是本次解密所用,另一组是下一包解密所用,下传的数据包号是偶数时用AES算法加密。为提高运算速度,对AES算法的字节替换过程采用查表的方法。只要保证每次下传的有效数据长度相同,足以达到欺骗性,即使所有数据被截获,由于芯片内部的密钥无法读出,截获者也无法得到正确的明文。同时考虑到程序中数据容易处理,每次下传的有效字节数选择16的整数倍。boot程序将数据正确写入存储器后应向上位机返回正确状态,否则应返回出错信息以便处理。程序升级完成后上位机发出结束命令并下传校验字符,boot程序核对正确后擦除程序标志区并重新写入标识。
图1 流程图
用户程序升级成功之后,可以通过函数指针的方式调用该程序。函数在编译时都会被分配一个入口地址,该地址就是函数的指针。只要用一个指针变量指向这个函数的入口地址,就可以通过指针变量调用这个函数。函数指针的本质是指针变量,只不过该指针变量指向函数,读出程序标志区的运行地址就可以通过指针变量调用新写入的程序。
5、结束语
为应对网络安全,有效保护知识产权,本文提出了固件升级的数据加密方案,对于具有IAP功能的芯片具有普遍意义,不仅适用于网络远程升级,同样适用于本地升级。至于加密算法可以根据MCU的能力进行灵活选择。