基于跳码技术的无线密码锁设计
扫描二维码
随时随地手机看文章
无线电子锁系统相比传统机械锁系统具有无接触性、方便快捷、易于管理等优点,伴随着RF器件的价格逐步降低和各种数控系统的集成化要求,无线电子锁在更多的领域得到了应用。早期的无线电子锁系统,钥匙向锁发送的或者是没有加密的固定密码,或者是经过PT2262,VD5026等编码芯片编码的密码,但这些方式产生的密码都是固定的内容,且长度较短(一般不超过16位),入侵者只要利用"拷贝重发"或者"扫描跟踪"等方法就可轻而易举地破解,因此这样的方案都应用于对安全性要求不高的场合。
为满足对更高安全性的要求,本文提出一种基于"跳码"的无线锁解决方案。所谓跳码,是指钥匙每次向锁发送的密码都是唯一而随机的,入侵者无法预测,即使记录了原来的开锁密码也不能用于下次开锁,因此安全性极高。
1 跳码的软件实现
目前跳码的实现多借助于专用的处理器硬件,如Microchip的HCSXXX系列,美国MACRSTAR公司的TR13XX,ACM公司的ACM1330E系列,这些产品都是专利产品,内部算法对外不公开。设计者要想使用这些产品,必须学习新的处理器,并且付出一定的专利费。这里提出一种跳码的完全软件实现,使用合适的普通单片机就可运行这种跳码软件。
跳码的实现核心是非线性加密算法,利用32位非线性反馈移位寄存器(NLFSR)和64位密钥组成的加密单元,可实现对输入32位二进制数据的加密,加密后的输出是32位二进制随机数。输入有一位变化,加密后的输出统计上将有一半以上的位发生变化,具有相当高的随机性。图1是跳码加密和解密的示意图:
注意,对于同一套加密系统,加密单元和解密单元的64位密钥是相同的,且是不公开的,这是典型的私钥加密系统。
1.1 加密单元
依据上图,加密时,将欲加密的32位二进制数据X存入32位移位寄存器(shift register,SR)中,选取32位SR的1、9、20、26、31位和固定32位二进制数据OX3A5C742E组成非线性函数(NLR)的输入,NLR的输出、SR的0、16位、以及64位密钥移位寄存器(key FSR)移位后的0位,这些位数据异或(XOR)后产生的1bit数据作为32位SR的31位。循环此操作528轮后,32位SR 中的数据即为X经加密后的跳码数据Y。这里给出用VC6.0对该加密算法的实现:
1.2 解密单元
跳码解密单元是加密单元的逆操作。依据图3,解密时,将欲解密的32位二进制跳码Y存入32位SR中,选取32位SR的0、8、19、25、30位和固定32位二进制数据OX3A5C742E组成非线性函数NLR的输入,NLR的输出、SR的15、31位、以及64位key FSR移位后的15位,这些位数据异或(XOR)后产生的1bit数据作为32位SR的0位。循环此操作528轮后,32位SR中的数据即为解密后的数据X。这里给出用VC6.0对该解密算法的实现:
1.3 跳码加解密算法在单片机中的实现
上述跳码算法,即加密函数Encrypt()和解密函数Decrypt(),接收的参数为32位无符号整数和64位无符号整数,返回的是32位无符号整数。单片机大多是8位机,其编译开发环境所定义的同样数据类型的长度与PC机有所不同,如unsigned int在PC上定义为32位无符号二进制数,而在单片机上常定义为16位无符号二进制数。假设单片机的unsigned int和unsigned long分别表示16位无符号二进制数和32位无符号二进制数,可将上述函数改为:
这里,用两个32位无符号整数key_high和key_low分别表示64位无符号整数的高32位和低32位,程序的实现也要做相应的改变。
针对不同编译器所定义的数据类型,可采用相似方法移植跳码算法程序。
2 基于跳码的无线锁方案
这里选用Atmel公司的AVR单片机作为锁和钥匙的处理器,无线收发模块采用普通的RF模块即可。下面给出基于跳码的无线锁方案的硬件框图:
图4中,钥匙和锁进行单向通信,即按下钥匙按键1时,钥匙向锁发送加密后的跳码数据,锁收到后解密,并判断执行。钥匙是低功耗模块,它大部分时间处于休眠状态,每当按键1按下时,钥匙被唤醒,发送加密后形成的跳码数据。钥匙要便于携带,因此要求体积小,待机时间长,故这里选用Atmel公司的Atiny系列单片机,并由钮扣电池供电。锁对功耗和尺寸不敏感,故这里选用Atmega8L单片机,供电方式可以灵活一点。
2.1 钥匙工作原理
通过对跳码算法的介绍,可以知道对于给定的任意32位二进制数,利用跳码加密算法Encrypt ()加密后得到的跳码是个固定的32位二进制数,这样不能应付"拷贝重发"的入侵手法。所以钥匙每次加密的数据都应该是不同的,这可以在钥匙内部维持一个计数器来实现,每当钥匙的按键被按下一次时,钥匙内部的计数器就自动加1,并将新计数器值保存在内部EEPROM中,作为下次计数器增加的起点。同时,利用加密算法加密新计数器值,加密后生成的跳码作为开锁命令发送出去。这里,将该计数器定义为32位无符号二进制数。钥匙发送的信息帧格式为:
其中,一个字节的前导符是固定的位序列0b01010101,它没有加密,主要目的是防止非本产品系列的无关产品发送的无线数据的干扰,即接收端只认可第一字节为0b01010101的字节序列。32位跳码部分是钥匙加密计数器后的值,这是开锁命令,具有极高的安全性。
2.2 锁的工作原理
锁平时处于监听状态,当接收了字节0b01010101时,锁进入接收32位跳码程序,否则重新进入监听状态。当接收到32位跳码数据后,锁利用Decrypt()解密后得到发端送来的计数器值,发端如何依据此计数器值判断是否开锁呢?接收端也维持一个计数器CNT1,它保存的是上次成功开锁的计数器值。参见图5,每当接收端解密跳码后,得到的是32位计数器值CNT2,接收端操作如下:
若CNT2<CNT1,或CNT2=CNT1,可能是以前的数据被"拷贝重发",不动作。
若0<CNT2-CNT1<256,或CNT2=256,CNT2落在了当前同步窗口中,是合法的命令,则接收端动作(即开锁),同时将此CNT2存入EEPROM中,作为新的同步起点。
若CNT2-CNT1>256,不动作。
锁和钥匙在首次使用时,或者钥匙的多次不合适操作导致钥匙和锁的计数器差值超过了同步窗口,这时就必须通过学习,让锁记住钥匙的计数器值,实现同步。学习的操作是:按下锁按键2,然后再按下钥匙按键1(同时放开锁按键2),这样锁就接收了钥匙来的信息,解密后得到计数器值,然后存储此计数器值。为保证安全,学习时必须保证锁处于开启状态,即说明发起学习者是锁的合法拥有者。
2.3 方案的安全性分析
常见的攻击无线遥控系统的方式有:a.拷贝重发:即入侵者通过仪器记录下本次通信的无线电信号,然后重发这些数据实施主动攻击。因此采用固定的密码,无法抵御这种攻击。本方案在每次接收到合法的计数器CNT2后,将CNT2存入EEPROM,并作为下次匹配的起点,入侵者记录的计数器值均小于或等于此值,只要设定只有CNT2>CNT1时锁才动作,就可有效抵御这类攻击。b.扫描式攻击:入侵者通过依次发送所有可能有效密码实施攻击。这里,我们设定了密码长度为32位,有效窗口大小为2 5 6,入侵者通过扫描攻击成功的概率为256/232=1/224,这是微乎其微的。
这里,将同步窗口大小定义为256,是为了保证一定的容错。当使用者在不能与接收端有效通信时,按下钥匙按键导致钥匙单方面动作,从而使钥匙和锁的计数器差值增大。同步窗口大小要合适,太大会降低安全性,太小会因多次误操作导致锁和钥匙不能再自动同步。
3 结束语
利用本文介绍的跳码算法和设计的无线遥控解决方案,能设计出具有高度安全性的无线遥控系统,可广泛应用于对安全性要求较高的场合,如各种报警防盗系统、住宅、办公楼、汽车及车库门卫管理系统,因此具有一定的应用市场。