引言
32位处理器诞生后,Blowfish算法在加密速度上超越了DES,引起了人们的关注。Blowfish算法没有注册专利,不需要授权,可以免费使用。正是由于这些特点,它广泛应用于很多产品中。到目前为止,使用Blowfish算法的产品已经超过150种。
单片机的计算能力有限,在其上实现的加解密算法要具有安全、快速、易于实现等优点,而且代码长度要短。Blowfish算法具有这些特点,其中加解密的运算部分主要由“异或”和“相加”构成,运行时仅需要4 KB多内存甚至更少。该算法使用可变长度(最长448位)的密钥,保障数据足够安全。
本文以单片机为核心,使用Blowfish算法设计一个智能加密盒,提供版权保护和加密功能。单片机芯片中存储加密算法和程序。使用软件时可将加密盒插入PC的串口或USB等 I/O接口中,对软件进行保护。PC机通过与加密盒的数据交换达到版权保护的目的。同时可以更换密钥设计,增强了软件的安全性。
1 Blowfish算法原理
Blowfish算法是一种对称的分组加密算法,每次加密一个64位分组,使用32位~448位的可变长度密钥,应用于内部加密。加密过程分为两个阶段:密钥预处理和信息加密。
该算法中使用两个盒 key_pbox[18]和key_sbox[4][256],以及一个核心的加密函数 Blowfish_Encrypt()。这两个盒所占存储空间为 (18×32+4×256×32)字节,即4 186字节。加密函数 Blowfish_Encrypt()输入 64位明文,输出 64位密文。
1.1 密钥预处理
Blowfish算法的原密钥pbox和sbox是固定的,初始化方法是用π的小数部分,按每32位一次分配给pbox和sbox,即:
pbox[0]=0x243F6A88;
pbox[1]=0x85A308D3;
sbox[3][254]=0x578FDFE3;
sbox[3][255]=0x3AC372E6;
当加密一个信息时,需要自己选择一个key(64~448位),用这个key变换sbox和pbox,得到加密信息所用的key_pbox和key_sbox(具体过程略——编者注)。
1.2 信息加密
信息加密采用加密函数Blowfish_Encrypt()。该算法是一个16层的Feistel网,加密一个64位分组需要16次的迭代,在迭代中使用key_pbox和key_sbox,最后得出64位的密文。由于计算中仅使用模232加、“异或”以及用key_sbox替代等操作,因此实现起来速度非常快。
算法中有以下两个基本运算:
加法: 字的模232相加,记为“+”。
按位“异或”: 记为“⊕”。
具体加密过程略——编者注。
1.3 解密
用Blowfish算法解密,同样也需要两个过程:
① 密钥预处理,与加密时相同;
② 信息解密,把信息加密过程中的 key_pbox逆序使用即可。
值得注意的是: 与大多数分组密码不同,Blowfish中解密顺序和加密顺序是相同的,而不能倒过来。
解密过程伪代码如下(i表示迭代次数):
对于i=1至16
xL=xL^P[i]
xR=F(xL)^xR
交换xL和xR(最后一轮取消交换运算)
xR=xR^P[17]
xL=xL^P[18]
重新合并xL和xR,得到64位的明文。
2 算法性能分析
Blowfish设计的基本原理既容易理解又实现简单。与其他算法不同,子密钥的生成都是由加密函数Blowfish_Encrypt()完成,每个子密钥都会受到密钥位的影响,这使得密钥和数据完全混合在一起,对密钥的分析显得十分困难。其中的F函数给Fesistel网络一个很好的雪崩效应。Blowfish算法的另一个特点是在每一轮中对两部分数据同时加密,增加了密码的强度。
Blowfish算法用C语言和汇编实现起来都很方便,每个操作均为XOR、MOV、ADD。Schneier将该算法与其他算法的执行时间进行比较,结果如表1所列。到目前为止,Blowfish算法的安全性还未受到挑战[2]。
表1 几种分组密码在奔腾机上的速度
3 单片机中的实现
本设计中加密盒选用8位单片机C8051F120(简称“120”)。C8051FXXX单片机是美国Cygnal公司推出的完全集成的混合信号系统芯片SoC(System on Chip),具有与8051指令集完全兼容的CIP51内核。120单片机的片内存储空间较大,具有128 KB Flash存储器,除了标准 8052的256字节的内部数据 RAM之外,还有外部数据存储器空间 8 KB的 RAM块(XRAM)[3]。
该算法在单片机实现中有几点值得注意:
① pbox[]和sbox[]一般定义为常量,存储在Flash中,不需要更改,因为每次字密钥 key_pbox[]和key_sbox[]的生成都要用到。如果只设置一次密钥,以后不再设置,则可以考虑节省存储空间,将key_pbox、key_sbox和pbox、sbox使用同一空间。
② 子密钥(key_pbox[],key_sbox[])大约需要4 KB的内存。如果内存小于4 KB,则可以在生成子密钥的同时也写入Flash,这时要根据Flash每次的擦除大小来控制分多少次写入Flash。
③ 如果密钥更换得不频繁,可以将生成的 key_pbox[]和key_sbox[]存储到Flash中,这样避免每次计算512次的生成子密钥。保存时所用存储空间共需4 186字节。
④ 若需频繁地更换密钥,最好选择具有或扩展到4 KB以上的RAM的单片机来处理,因为Flash写入寿命是有限的,一般为100 000次左右。
120单片机具有8 KB的RAM空间,128 KB的Flash,完全满足Blowfish算法的需要。因此本应用选用120单片机实现Blowfish加解密算法。系统中采用C语言实现,以便在不同型号的单片机中移植。
首先,定义sbox和pbox并初始化,将它们放入code中。
unsigned long code sbox[18] ={
0x243F6A88L,…,0x8979FB1BL
};
unsigned long code pbox[4][256] = {
0xD1310BA6L,…
};
其次,定义两个全局变量key_pbox和key_sbox,存储初始化后的子密钥。
unsigned long key_pbox[18];
unsigned long key_sbox[4][256];
再完成4个函数:
void Blowfish_Init(unsigned char *key, int keyLen);
//初始化子密钥
void Blowfish_Encrypt(unsigned long *xl, unsigned long *xr);//加密函数
void Blowfish_Decrypt(unsigned long *xl, unsigned long *xr);
//解密函数
unsigned long F(unsigned long x);//F函数
最后,初始化单片机,用TESTKEY作为密钥进行初始化,对算法进行测试。120单片机使用内部时钟(24.5MHz),设置锁相环预分频为PLL0DIV=0x01,倍频PLL0MUL=0x03。测试结果如表2所列。
表2 Blowfish算法在120单片机上测试数据
测试中发现使用TESTKEY初始化字密钥需要163 ms,相当于加密4 KB的数据。因此,Blowfish算法更适合于不经常更改密钥的应用。如果密钥不经常发生改变,可以在Blowfish_Init()初始化key_pbox[]和key_sbox[]后,将它们写入Flash中。
4 版权保护模块和主机程序的设计
版权保护模块可以有效地保护软件不被非法传播和使用,并且可以根据用户级别设置相应的使用权限。本模块设计需要在上位机的软件和加密盒中分别实现Blowfish算法。加密盒使用串行口和上位机进行全双工的通信。连接方式略——编者注。
加密盒有一个唯一的32位ID,用来区分不同的加密盒,上位机对准 ID后才能对其操作。当上位机软件启动后,首先扫描加密盒是否与PC相连,利用唯一的ID对加密盒确认;确认正确后,进行用户级别的确认。
用户级别确认过程采用“问答式”。用户级别可用16字节(128位)常量标示,但若只发送代表用户级别的常量数据,会使得传输的数据保持不变,很容易被猜出。一般的加密算法有扩散原则,即数据加密后,明文一位发生变化后就会引起密文的多处改变。利用这种特性,上位机随机生成一串512位的数据流,随同用户级别常量128位发送给加密盒;加密盒返回数据后,上位机便可判断用户的级别。为保证防止明文和密文在传输中分别被截获而有推算出密钥的可能,可分别设置两个密钥key1和key2。在传输过程中都使用密文,这样确保了数据的安全性。
上位机中用户权限确认过程如图1(a)所示,加密盒的工作流程如图1(b)所示。
图1 系统流程
5 其他问题
① 加密的一个重要思想就是构造随机性,本加密盒采用随机数和常量混合在一起,避免猜测的可能性。
② 为保证安全,随机产生的数据可以增加长度。
③ Blowfish算法的雪崩效应很好,即使知道明文和密文,在有效的时间内也不能破译出密钥,所以使用时也可以仅设置一个密钥,传输中为数据的明文和密文。这样做的好处是可以加快速度,一次计算子密钥key_pbox,而key_sbox不需要更改。对本应用来说,即使设置两个密钥,计算时间也是可以接受的。
④ 如果需要USB的加密盒,可使用CP2101(USB转串口芯片)把USB转化成串口,对用户提供 USB接口,其他操作均无须改变。
结语
Blowfish算法不仅安全,而且加解密速度非常快,可适合于不同的平台,因此在软件版权保护和嵌入式应用系统中会有很高的应用价值。这种加密盒保护的方式可以应用到各种软件、嵌入式系统、用户认证、数据采集以及其他需要保证信息安全的应用中。