altera

基于指纹识别的加密硬盘适配器

0
阅读(6707)


参赛信息 名次:一等奖 参赛队员:李伟 齐鹏 南龙梅   大学院校:解放军信息工程大学电子技术学院信息安全系   指导老师: 刘军伟


Project Paper

1. 设计概述
(Preliminary Paper)

1.      设计概述

1.1  设计意图

由于当今社会中个人电脑的普及,计算机已经成为人们工作、生活、学习不可分割的重要工具。而硬盘作为计算机中主要的外部存储器通常存储着用户大量的数据和资料,这些数据中有很多涉及到个人隐私、商业机密等,甚至有些是严格保密的。根据美国计算机安全研究所计算机犯罪和安全调查报告,笔记本和硬盘被盗导致硬盘上的数据泄密已经成为继电脑病毒感染后人们关心的第二大安全性问题。保障硬盘数据机密性的基本安全技术是硬盘数据加密,但是采用软件加密存在降低系统性能和自身安全性等问题,因此研究基于现代加密技术的硬盘数据加密系统具有很重要的意义。
本作品采用Altera公司提供的从Quartus到SOPC Builder再到NIOSII一条龙的集成开发环境,依托Cyclone FPGA丰富的可编程资源,将硬盘ATA标准、现代密码学、密钥管理方案与EDA技术进行了有机的结合,使设计的产品拥有更高的性能、更强的稳定性与更灵活的可扩展性。
本作品的设计意图即在双NIOS处理器的平台上实现一种基于指纹识别的加密硬盘适配器,对流向硬盘的数据进行实时加密,对流出硬盘的数据进行实时解密。加解密算法选用了3DES算法,采用NIOSII处理器自定义指令实现,提高了系统的可编程性与可扩展性。硬盘接口采用了Cyclone的FPGA实现,分别支持PIO的五种传输模式与DMA的三种传输模式,并且作品还专门设计了用于用户身份识别的“指纹钥匙”,只有通过指纹确认的用户才能正确的进行数据的读写操作,并且通过MD5杂凑算法为用户操作提供唯一的工作密钥。这种利用生物特征进行身份识别的方法具有更好的安全性和方便性。本作品实用性强,安全性高,升级灵活,具有很大的开发空间。
 
1.2  适用范围及用户群
在这个信息日益发达的时代里,信息安全和每个人的生活都是息息相关。本作品通过硬件加密方法对硬盘中的数据进行加密,只要得不到合法用户指纹信息的确认,就无法在任何电脑上读出该硬盘中被加密过的数据,防止他人使用非法手段窃取硬盘信息,本作品在笔记本、台式电脑以及工作站上具有普遍的应用价值。
本作品特别是对于政府、金融、交通、电信、电力、证券、税务等对信息安全要求级别高的部门具有非常重要的现实意义,能够有效的保障用户的数据安全。因此本产品的开发及推广和使用,必然会推动我国信息安全领域的发展,进而带来很大的经济效益。
 
1.3  本设计采用本款Altera器件设计的原因
Altera的CycloneII 2C20器件保持了用户定义的功能、业界领先的性能和低功耗等Cyclone架构的特色和优势,采用了更为先进的工艺设计,在密度、成本、性能等方面均具有显著的优势。
1. 嵌入式乘法器。CycloneII2C20拥有26个嵌入式18×18乘法器,是消费应用、无线和图像处理低成本DSP应用的理想解决方案。其乘法器能够运行在250MHz的频率上,消除复杂算术计算的性能瓶颈,极大提高了系统的吞吐率。
2. 专用的外部存储器接口。CycloneII器件既为低成本应用提供了丰富的嵌入式存储器,又可以满足某些应用对外部存储器的额外需求,能够与外部存储器进行高速可靠的数据传输。
3. 高性能的IO标准。CycloneII器件支持多种单端和差分I/O标准,给开发人员设计高性能的系统提供了更大的灵活性。
4. 串行匹配。CycloneII器件支持LVTTL、LVCMOS、SSTL-2和SSTL-18单端I/O标准的片内串行匹配,可以与DDR和DDR2 SDRAM存储器相连接。
5. 循环冗余码(CRC)自动校验。CycloneII2C20器件内部提供了片内CRC自动校验电路,利用QuartusII软件,只需单击操作即可启动CRC自动校验。
 
(Revision: 4 / 2008-06-16 20:40:58)

2. 功能描述 (Final Project Paper)
2.      功能描述
图1 作品功能框图
基于指纹识别的加密硬盘系统的功能框图如图1所示,利用了人体的指纹信息完成了身份的认证,并采用了数字签名算法MD5对256Byte的指纹信息进行签名,保证了对于每个用户具有唯一的工作密钥。对于硬盘加密的实现采用了3DES算法,提高了系统的安全性,同时,依托CycloneII FPGA实现了硬盘ATA接口,能够支持PIO与DMA数据传输。有效降低了由于加解密操作给系统性能带来的损失,提高了系统的整体性能,具有良好的应用前景。
本作品主要功能模块包括以下六个:指纹识别器控制模块、3DES加/解密模块、接口转换板、IDE接口模块、密钥产生模块与IDE驱动及应用程序模块。
1.指纹识别器控制模块:我们通过NIOSII对外部设备的强大控制能力,以命令模式的方式对杭州中正公司的SM-620指纹识别器进行了控制,完成了指纹登陆、指纹识别以及指纹上传等操作,为整个系统提供了“指纹钥匙”。
2.3DES加/解密模块:我们利用NIOSII处理器强大的运算功能,同时得益于C2H工具的加速功能,以自定义指令的方式实现了3DES算法;通过对3DES算法进行分析,对于算法中最耗时的关键模块,我们采取自定义相关的硬件外设进行加速,使3DES算法的核心工作频率达到500MHz;依托于NIOSII丰富的在线调试过程,缩短了开发周期。
3.接口转换板:由于DE1开发板具有的丰富外设扩展接口,我们利用其中的两个40针的扩展口,自行开发了与硬盘ATA接口相匹配的接口转换板,增强了系统的扩展性。
4.IDE接口模块:得益于CycloneII中丰富的可编程逻辑资源,考虑到接口模块与主机交互的实时性,我们采用了硬件实现的方法,设计了相应的读写时序发生器,能够支持PIO读写的五种模式与DMA读写的三种模式。
5.密钥产生模块:考虑到系统的安全性,利用现代密钥管理技术,我们利用NIOSII处理器实现了对指纹信息的签名,保证了合法用户密钥的唯一性。同样是在NISOII处理器中通过自定义指令实现的数字签名MD5算法,提升了整体系统的安全性。
6.IDE驱动及应用程序模块:考虑到系统应用中良好的人机交互性,自主开发了硬盘的驱动程序,并设计了与之相应的应用程序界面,为整体系统的应用推广提供了良好的基础。
综上所述,NIOSII处理器灵活的设计方法和SOPC领先的设计理念帮助我们完成了上述功能。通过SOPC Bulider提供的设计平台,使我们能够很轻松的实现多处理器的设计,并能根据实际的不同应用对处理器进行裁减,对耗时的关键操作能够自定义外设以达到加速的作用。此外IDE提供的软件调试平台,能够缩短复杂设计的开发周期。
 
 (Revision: 6 / 2008-06-16 20:41:24)

3. 性能参数
(Final Project Paper)
 
3.      性能参数
(1) 电源:
直流电压:7.5V
工作电流:800mA
(2) 环境:
工作温度:0~40C
相对湿度:8%~95%
(3) 接口:
硬盘与开发板接口符合IDE接口规范
指纹识别器与主机接口符合RS232接口规范
(4) 传输:
支持ATA协议中PIO的五种传输模式
支持ATA协议中DMA的三种传输模式
(5) 注册与认证过程
注册过程:<2.0秒
认证过程:<3.0秒
(6) 3DES加解密速度
3DES加解密最大工作频率:350MHz
3DES加解密吞吐率:44.8Mbps
(7) MD5杂凑速度
MD5杂凑最大工作频率:400MHz
3DES杂凑吞吐率:230Mbps
(8) 系统资源占用

 
 
上述参数都是本系统实际的性能参数,完全实现了设计的功能和参数要求。
本设计采用了双NIOSII核的处理方式,Altera的CycloneII器件提供了强有力的硬件支持,特别是将NIOSII软核处理器溶入以后,将FPGA的功能从单一地做一些并行、高速、逻辑性强、时序简单、操作繁琐的工作进行了极大的扩展,把以往需要外部控制单元做的工作全部集成到一片FPGA中,并且内部NIOSII软核的多种外设接口都可以随时删减与添加。同时,NIOSII软核针对低速控制、外设访问复杂、外设众多、修改频繁的工作具有极强的适应能力,而且正好与FPGA I/O口众多的特点相一致,使得软硬件的设计过程中不用再单独考虑FPGA和控制单元的工作协调及接口问题,所有数据处理、命令控制、时序协调、并行串口、低速高速设计都集中到一片FPGA中,利用它众多的I/O口,简单地完成系统设计和软件编程。
 
(Revision: 7 / 2008-09-13 13:29:24)

4. 设计结构 (Preliminary Paper)
 
4.      设计结构

4.1 系统总体框图

基于指纹识别的加密硬盘适配器主要由双NIOSII处理器、ATA接口控制器与指纹识别器构成,如图2所示,其中NIOSII 1为CPU_finger,自定义了与杂凑算法MD5相关的指令,主要完成对指纹识别器的控制,并对指纹信息进行签名,提供系统所需的加密主密钥。
NIOSII 2 为CPU_DES,自定义了与加解密算法3DES相关的指令,完成对数据的加解密操作,并控制ATA接口中的PIO与DMA时序发生器,实现数据在主机与硬盘之间的交互。
图2 基于指纹识别的加密硬盘适配器系统结构
 
在SOPC Builder的设置中,系统在双核CPU的基础上,通过三态桥接口芯片利用了DE1开发板上的Flash、SRAM等存储器,并通过提供的UART,控制指纹识别器模块,定义了相关的用户逻辑用于控制读写时序发生器的工作。具体细节祥见图3。
 
图3 SOPC Builder中模块设置
 
Quartus 软件下模块示意图如下:
图4 Quartus软件下模块示意图
 
4.2  软件设计流程
在IDE的环境下编写了相关的NIOSII代码,包括CPU_DES与CPU_finger。CPU_DES主要功能是完成数据在主机与硬盘之间的加解密传输。CPU_finger的主要功能是接收主机发送的命令,进而控制指纹识别器的工作过程,完成用户指纹的注册,认证以及为加解密提供指纹密钥。
 
 
图5 IDE软件中的NIOSII代码
4.2.1.    CPU_finger软件设计流程
 
 
图6 CPU_finger软件设计流程
 
CPU_finger的主要功能是为系统提供加解密所需的主密钥。系统初始化之后,CPU_finger开始对指纹识别器进行复位操作,之后循环发送检测手指命令,直到检测到有用户的手指录入,发送指纹采集命令,将用户的指纹信息进行采集,并与原始录入的合法用户的指纹信息进行比对。如果检测到非法用户,重新发送检测手指命令,对非法用户而言,没有获得正确的加解密密钥,无法读取硬盘中的数据;如若发现用户录入的指纹信息与初始合法用户的指纹一致,CPU_finger从指纹识别器中读取用户原始的指纹信息,并对信息值进行数字签名操作,采用MD5杂凑算法,产生128比特的杂凑值,作为系统的主密钥,用于加解密操作,同时将主密钥写入共享FIFO中。CPU_finger完成上述操作之后,继续向指纹识别器发送检测手指命令,等待下一个用户的身份识别。
 
4.2.2.    CPU_DES 软件设计流程
 

图7 CPU_DES软件设计流程
 
CPU_DES的主要功能是完成数据的加解密操作,同时控制PIO与DMA的读写时序发生器完成数据在主机与硬盘之间的交互。系统初始化之后,开始检测共享FIFO的空标志位,如若发现主密钥已经注入到共享FIFO中,CPU_DES执行读取主密钥的操作,并通过主机发送的读写信号判断将要执行加密或解密操作,并产生加解密所需的子密钥。如果是加密操作,通过输入FIFO将明文数据读入完成加密操作,并依据主机的传输模式(PIO/DMA)启动相应的读写时序发生器,将加密后的密文写入到硬盘中。相反,如果是解密操作,CPU_DES通过输出FIFO将硬盘中的密文读入,先执行解密操作,然后同样依据传输模式的不同启动相应的读写时序发生器,将解密后的明文发送给主机。循环上述过程,直至完成此次传输的全部数据,返回到等待下一次的加解密操作状态。
 
4.3 接口转换板设计
由于DE1开发板具有的丰富外设扩展接口,我们利用其中的两个40针的扩展口,自行开发了与硬盘ATA接口相匹配的接口转换板,增强了系统的扩展性。电路图如下所示。
 
 
图8 主机与DE1开发板之间的接口转换
 
 图9 DE1开发板与硬盘之间的接口转换
 
4.4  3DES设计与实现
4.4.1  3DES算法结构

 
3DES是一种较受欢迎的加密方案,目前还没有针对性的实用密码分析方法,因此具有较高的安全性。
3DES算法整体结构如下所示:
图10 3DES整体结构
3DES算法使用两个不同的密钥对明文进行三次DES或DES-1变换,加密函数采用一个加密-脱密-加密序列:
由上式可知,实现3DES算法的关键就是实现DES算法。DES加密流程如下所示:
 
图11 DES加解密流程
如图所示,待加密明文数据分组首先进行比特置换,然后将置换后的数据分为左半部分和右半部分各32比特L0和R0,接着进行16圈迭代,在第一圈中,R0在密钥的作用下进行f变换,得到的数据与L0按位异或,产生的数据作为下一圈迭代的R1,R0直接成为一下圈的L1。依据上述原理,循环进行16圈轮函数,但是在第16圈中不进行左右块对换。
在整个DES算法中f函数是核心。其结构如下所示:
 
 
 
图12 f函数结构
        64比特的初始密钥首先进行置换选择1,输出56比特数据被分为左半部分和右半部分;然后分别进行循环左移,最后经过置换选择2生成48bit子密钥。其中:置换选择1是将64bit的初始密钥中的奇偶校验位共8比特舍弃,然后对剩余的56bit数据进行比特置换;置换选择2是将56bit数据经过比特置换最后输出48bit作为圈子密钥。
图13 DES子密钥生成过程
 
4.4.2    自定义指令
可编程NIOSII处理器的特点之一就是使我们可以方便地增加用户自定义的指令,可以把系统中软件处理耗时多的关键模块用硬件逻辑电路来实现,大大提高系统的效率。
DES算法主要包括IP初始置换、E扩散、S-盒、P置换与IP逆置换运算模块;子密钥生成算法中主要包括置换选择1、置换选择2和移位运算模块。本设计采用用户自定义指令方式实现这些运算模块。
宏“ALT_CI_PERMH_GENERATER”定义为IP初始置换一,其功能为对明文进行初始置换后,输出高32bit数据;
宏“ALT_CI_PERML_GENERATER”定义为IP初始置换二,其功能为对明文进行初始置换后,输出低32bit数据;
宏“ALT_CI_EXTEND”定义为E扩散,其功能为对32bit的输入数据进行E扩散后输出;
宏“ALT_CI_P_EXCHANG”定义为P置换,其功能为对输入数据进行P盒比特置换后输出;
宏“ALT_CI_NIP”定义为IP逆置换,输出低32bit数据;
宏“ALT_CI_NIPH”定义为IP逆置换,输出高32bit数据。
宏“ALT_CI_PERMH_GENERATER”定义为置换选择1,输出高28bit数据;
宏“ALT_CI_PERML_GENERATER”定义为置换选择1,输出低28bit数据;
宏“ALT_CI_C_SHIFT”定义为移位指令,将输入数据按照规则进行循环左移;
宏“ALT_CI_PC2FRISTL”与“ALT_CI_PC2FRISTH”定义为置换选择2指令,分别输出低16bit和高32bit数据。
 
 
图14 3DES自定义指令
 
下面是完成一圈DES加密所使用的用户自定义指令程序,其中plaintexth与plaintextl为明文的高32bit与低32bit。
R0=ALT_CI_PERMH_GENERATER(plaintexth, plaintextl);
L0=ALT_CI_PERML_GENERATER(plaintexth, plaintextl);
//完成初始置换;
a=0;
e0=ALT_CI_EXTEND(R0,a);
a=1;
e1=ALT_CI_EXTEND(R0,a);
//完成E盒扩散,其中中间变量a=1时,输出高16bit,a=0时,输出低32bit;
ek0=ALT_CI_YIHUO(e0,k[i][1]);
ek1=ALT_CI_YIHUO(e1,k[i][2]);
s=ALT_CI_S_BOX(ek0,ek1);
//完成与子密钥异或与S盒的操作;
p=ALT_CI_P_EXCHANGE(s);
//完成P置换操作;
R1=ALT_CI_YIHUO(L0,p);
L1=R0;
//完成一圈DES操作。
下面是完成子密钥生成所使用的用户自定义指令程序,其中masterkey_h, masterkey_l分别为主密钥的的高32bit与低32bit。
alt_u32 key[16][2],masterkey_h,masterkey_l,D0,C0,D1,C1;
int b;
D0=ALT_CI_PCFRIST(masterkey_h, masterkey_l);
C0=ALT_CI_PCFRISTH(masterkey_h, masterkey_l);
//完成置换选择1操作;
for(b=1;b<17;b++)
{
D1=ALT_CI_C_SHIFT(D0,b);
C1=ALT_CI_C_SHIFT(C0,b);
//完成循环左移操作
k[b][1]=ALT_CI_PC2FRISTL(C1,D1);
k[b][2]=ALT_CI_PC2FRISTH(C1,D1);
//完成置换选择2操作,生成子密钥;
D0=D1;
C0=C1;
}
4.4.3       3DES算法实现
本设计根据3DES算法结构,在CPU_DES软核中采用用户自定义指令的方式对双密钥三重DES算法加以实现,并用ModelSim对该NIOSII进行了仿真,实验结果如下所示:
我们采用的测试向量是:
两个主密钥分别为key0=99aabbccddeeff11;key1=1122334455667788;
明文为plaintext=0102030405060708;
加密结果如红圈标注所示为:Cipertext=f8f6d10586275454。
 
 
 
图15 3DES加密仿真结果
3DES解密是加密的逆过程,我们采用与加密相同的方法对加密的结果进行了解密,用ModelSim对NIOSII进行了仿真,实验结果如下所示:
 
 
 
图16 3DES解密仿真结果
4.5   IDE接口设计
本设计包含以下几个部分:输入FIFO,输出FIFO,接口控制模块,加解密模块,PIO写时序发生器,PIO读时序发生器,DMA写时序发生器及DMA读时序发生器。其中输入FIFO用于截获主机发出的数据,以供加密模块对数据进行加密;输出FIFO用于截获硬盘发出的数据,以供解密模块对数据进行解密。接口控制模块用于产生截获主机和硬盘相应数据的控制信号,以控制主机和硬盘间的数据交互;加解密模块的作用是完成对主机写入数据的加密和硬盘读出数据的解密,并产生启动读写时序发生器的控制信号。PIO写时序发生器,PIO读时序发生器,DMA写时序发生器及DMA读时序发生器用来产生满足IDE读写协议的交互信号,使加解密后的数据成功地在主机和硬盘间传输。
 
 
图17 IDE接口模块框图
 
4.5.1       PIO读写时序发生器设计
在PIO模式下,主机与硬盘间的数据交互是通过数据寄存器进行的,涉及到的具体信号包括:ADDR地址信号用于选择操作的寄存器,DIOR/DIOW读写信号用于表明主机进行的读写操作;DD为16位的数据线用于传输读写过程中的数据;IORDY为设备准备有效信号,是主机与硬盘之间的握手信号。传输中的具体时序关系如下图所示:
 
 
   图18 PIO读写时序
在主机设置DIOR(读)/DIOW(写)有效之前,应首先设置操作使用的寄存器地址ADDR(由接口信号CS0、CS1、DA0~DA2确定)。在IORDY信号为有效的情况下,如果是读操作,硬盘根据ADDR所访问的寄存器,将数据放到总线上,主机在DIOR变为无效的瞬间,读取总线上的数据;如果是写操作,硬盘做好要写寄存器的准备工作,在主机将DIOW信号变为无效的瞬间,硬盘将总线上的数据写到相应的寄存器中。在传输数据的过程中,数据在总线上应满足一定的建立时间和保持时间,以便能可靠的传输数据。
在PIO数据传输方式下,合理设置IORDY信号可以延长PIO读写循环周期。周期是否延长,主要分为以下3种情况:
1.驱动器没有撤销IORDY信号:无等待发生,如图中说明1所示。
2.驱动在tA时间前撤销IORDY信号,但在tA之前使其有效:无等待发生,如图中说明2所示。
3.IORDY一直为无效状态,主机将会等待,直到在PIO周期内IODRY恢复有效。如图中说明3所示
在主机和硬盘数据交互过程中,依据IDE数据传输协议,设计以下PIO读写时序发生器,分别支持PIO写协议,PIO读协议。
(1) PIO写时序发生器
PIO写时序发生器的主要作用是产生PIO写协议所需要的交互信号,主要有以下四个:发向主机的设备是否准备就绪信号(IORDY_n);发向硬盘的写地址信号(Addr[4:0]_n);发向硬盘的写使能信号(DIOW_n);加密后发往硬盘的写数据(DATA)。具体工作过程如下图所示:
 
 
 
图19 PIO写时序发生器设计流程
 
1.在硬盘发出的IORDY信号有效的情况下,置IODRY_n信号有效,并检测主机发出的写使能信号,如果检测到四个写使能动作沿,说明输入FIFO已准备好一组加密数据,加密运算开始进行;
2.设置IORDY_n信号无效,主机发出的写信号自动进行延时以使主机自动暂停发送数据,进入写等待状态,直至IORDY_n信号再次有效,主机才会继续发送数据;
3.检测加密完成信号valid。若有效,说明加密已经完成,同时启动写时序发生器分四组准备发往硬盘的交互信号:Addr[4:0]_n、diow_n和加密后的数据DATA;
4.检测完成信号,如完成信号有效,则置IORDY_n有效,开始新一轮的传输。
在FPGA上,经Quartus6.0和Modelsim6.0验证,该设计支持PIO写数据协议。仿真结果如图所示,其中红色部分所标识的为由PIO写时序发生器向硬盘产生的一组写时序。
 
 
图20 写时序发生器仿真图
 
(2) PIO读时序发生器
PIO读时序发生器的主要作用是产生PIO读协议所需要的交互信号,主要有:发向主机的设备是否准备就绪信号(IORDY_n);发向硬盘的读地址信号(Addr[4:0]_n);发向硬盘的读使能信号(DIOR_n);解密后发往主机的读数据(DATA)。具体工作过程如下图所示:
 
 
图21 PIO读时序发生器
1.在硬盘发出的IORDY信号有效的情况下,置IODRY_n有效,检测主机发出的读使能信号,如果检测到读使能信号有效,表明主机准备读取数据;
2.设置IORDY_n无效,主机发出的读信号自动进行延时,以使主机自动进入读等待状态直至IORDY_n再次有效;
3.启动读时序发生器分四组准备发往硬盘的交互信号:Addr[4:0]_n、dior_n,此时硬盘会准备相应的数据并存至输出FIFO,供解密模块解密;
4.检测解密完成信号valid。若有效,说明解密已经完成,设置IODRY_n有效,通知主机可以读相应的解密数据;
5.检测完成信号,如完成信号有效,则开始新一轮的数据传输。
在FPGA上,经Quartus6.0和Modelsim6.0验证,该设计支持PIO读数据协议。仿真结果如图所示,其中红色部分所标识的为PIO读时序发生器向硬盘产生的一组读时序。
 
 
图22 PIO读时序发生器仿真图
4.5.2       DMA读写时序发生器设计
在DMA模式下,硬盘和主机间通过DMARQ和DMACK信号来完成DMA传输方式的“请求”和“应答”,波形如图所示。
 
 
图23 DMA读写时序
硬盘首先设置DMARQ信号有效,发出DMA数据传输请求。主机在接到DMA请求后,首先将地址线(CS0-、CS1-、DA0~DA2)设置为无效,其次设置DMACK信号有效,发出DMA数据传输应答,然后在读写信号的作用下通过专用的DMA数据端口直接传输数据。在传输了足够多的数据后,硬盘将设置DMARQ信号无效,在明确硬盘设置DMARQ无效后,主机将设置DMACK信号无效来终止此次DMA数据传输。由此可见,DMA与PIO传输的主要差别在于数据的传输没有经过数据寄存器,而是通过专用的DMA数据通道。
(1) DMA写时序发生器
DMA写时序发生器的主要作用是产生DMA写协议所需要的交互信号,主要有:发向主机的DMA请求信号(DMACK_m);发向硬盘的写地址信号(ADDR[4:0]_m);发向硬盘的写使能信号(DIOW_m);加密后发往硬盘的写数据(DATA)。具体工作过程如下:
 
 
图24 DMA写时序发生器设计流程
1.检测硬盘发出的DMARQ_d信号是否有效,如果有效,表明硬盘要求DMA数据传输。
2.DMA写时序发生器响应硬盘发出的DMA请求信号,置DMACK_m有效,硬盘进入准备接受DMA数据阶段;同时向主机发出DMARQ_m有效信号,要求主机进行DMA数据传输;
3.检测主机发出的DMACK_h响应信号是否有效,若有效,表明主机将进行DMA写数据协议;
4.检测主机发出的写使能信号,如果检测到四个写使能动作沿,说明输入FIFO准备好一组加密数据,加密运算开始进行;
5.设置DMARQ_m信号无效,使主机暂停发送数据;
6.检测加密完成信号valid。若有效,说明加密已经完成,同时启动写时序发生器分准备发往硬盘的交互信号:ADDR[4:0]_m、DIOW_m和加密后的数据DATA;
7.检测完成信号,如完成信号有效,则置DMARQ_m有效,开始新一轮的数据传输。
在FPGA上,经Quartus6.0和Modelsim6.0验证,该设计支持DMA写数据协议。仿真结果如图所示,其中红色部分所标识的为DMA写时序发生器向硬盘产生的一组写时序。
 
 
图25 DMA写时序发生器仿真图
(2) DMA读时序发生器
DMA读时序发生器的主要作用是产生DMA读协议所需要的交互信号,主要有:发向主机的DMA请求信号(DMACK_m);发向硬盘的读地址信号(ADDR[4:0]_m);发向硬盘的写使能信号(DIOR_m);加密后发往硬盘的写数据(DATA)。具体工作过程如下:
 
 
图26 DMA读时序发生器设计流程
1.检测硬盘发出的DMARQ_d信号是否有效,如果有效,表明硬盘要求DMA数据传输。
2.DMA读时序发生器响应硬盘发出的DMA请求信号,置DMACK_m有效,启动读时序发生器分四组准备发往硬盘的交互信号:ADDR[4:0]_m、DIOR_m,此时硬盘会准备相应的数据并存至输出FIFO,供解密模块解密;同时向主机发出DMARQ_m无效信号;
3.检测解密完成信号valid。若有效,说明解密已经完成,设置DMARQ_m信号有效,请求主机以DMA方式读相应的解密数据;
4.检测完成信号,如完成信号有效,则开始新一轮的数据传输。
在FPGA上,经Quartus6.0和Modelsim6.0验证,该设计支持DMA读数据协议。仿真结果如图所示,其中红色部分所标识的为DMA读时序发生器向硬盘产生的一组读时序。
 
 
图27 DMA读时序发生器仿真时序图
 
4.5.3      接口控制模块设计
经过对IDE接口仔细分析可以发现,虽然IDE接口协议和相关命令很多,也比较复杂,但本系统设计的主要功能是在主机对硬盘进行读写数据命令时,对要写入的数据进行截获并送入加密模块处理后再送入硬盘,对读出的数据进行截获并送入解密模块处理后再送给主机。所以大多数情况下,当主机和硬盘之间没有读写数据操作的时候(可能传送一些命令指令),可以让硬盘和主机进行直接交互而不需要进入加解密模块;当有数据操作的时候才截获主机与硬盘之间交互的数据,让数据流向加解密模块进行处理。这样既完成了加解密功能又减少了硬件的开销。所设计的接口控制模块能有效的支持PIO模式和DMA两种模式。具体设计过程如下:
(1) 在主机和硬盘间进行PIO数据传输时,用数据寄存器来进行数据交互,此时数据需要进行加解密操作。但是主机在通过PIO方式读取256字硬盘确认信息(IDENTIFY DEVICE)时也用数据寄存器来进行信息的交互,这时数据是不需要进行解密的,因此可以通过检测主机发出的地址和写入命令寄存器的命令来共同产生PIO传输控制信号。如下图所示:首先,检测到主机发出的地址为数据寄存器的地址时,译码器2输出译码有效信号;但同时检测写入命令寄存器的命令,如果为硬盘确认信息(IDENTIFY DEVICE)命令,则译码器1使能257循环计数器,并控制选择器的信号选通。在主机读信号DIOR_h作用下,保证主机与硬盘之间交互256word的硬盘信息。如若没检测到IDENTIFY DEVICE命令,则保证对主机与硬盘之间交互的数据进行加解密操作。
   (2) 在主机和硬盘间进行DMA数据传输时,可以对地址信号线CS0,CS1译码来实现DMA数据传输控制。此时仍需考虑另一个问题:主机同样会通过DMA方式读取硬盘确认信息(IDENTIFY DEVICE)。所以可以通过检测主机发出的地址信号CS0,CS1和写入命令寄存器的命令来产生DMA传输控制信号。方法同上,在此不再赘述。
   (3) 由于上述两路不可能同时有效,所以可以联合起来共同产生交互数据的控制信号,即区分PIO数据传输,DMA数据传输和直接传输。
 
 
图28 IDE接口控制模块框图
 
4.6 指纹识别器控制模块

 
 
图29 指纹识别器
指纹识别器控制模块由指纹采集设备和NiosⅡ处理器两部分组成。根据本设计的要求,从产品的性能、成本、接口等多方面综合考虑,我们最终选用杭州中正公司的SM-620K指纹识别器作为指纹采集设备。
SM-620K指纹识别器采用光学指纹传感器进行指纹数据采集,由DSP处理器和FLASH等芯片构成,具有指纹图像处理、模板提取、指纹搜索和模板存储等多项功能。该识别器外接口为标准的RS-232串口,可以直接与DE1开发板相接。识别器的工作模式分为独立模式与命令模式。在本设计中,我们是在指纹识别器的命令模式下,通过NIOSII处理器向指纹识别器发送一系列组合指令,实现指纹登陆、指纹识别和密钥生成等三个过程,从而完成该模块的各项功能。
 
4.6.1       指纹模板登陆过程

 
图30 指纹模板登陆流程
在指纹登录过程(流程如上图)中,NiosⅡ处理器通过串口向指纹识别器发送以下指令:初始化之后,NiosⅡ处理器不断发送指令Detect Finger用来检测光学传感器上是否有手指信息。若得到肯定应答,发送指令Get Image录入该指纹图像到指纹识别器的图像缓冲区;如若没有检测到用户手指信息,则继续循环发送该指令。
在检测到有用户录入指纹后,发送指令Gen Templet(Buffer A)对录入的图像进行特征提取,得到的特征数据暂时存放于模块缓冲区A中,第二组采集到的特征数据放于缓冲区B中。为了得到最能体现指纹特征的一组数据,NiosⅡ处理器发送指令Merge Two Templet对获得的两组特征数据进行合并,作为该枚指纹的模板暂时放于缓冲区内,并向NiosⅡ处理器返回状态信号。若合并不成功,则本次登陆以失败结束;若合并成功,发送指令Store Templet将指纹的模板文件存储于指纹识别器的Flash指纹库中,并为其分配唯一ID存储序列号,为下一步指纹匹配提供依据,完成一次模板登陆过程。
 
4.6.2       指纹模板匹配过程

 
图31 指纹模板匹配流程
指纹匹配流程如图30所示,在模板登陆的基础上,NiosⅡ处理器通过指纹识别模块的光学传感器,录入要识别的指纹图像,对录入的图像处理后提取特征,再发送Search指令将该特征数据与模板登录时生成的指纹模板进行模糊匹配比较,匹配结果分为通过和失败两种情况。若失败,则本次匹配结束;若匹配通过,NiosⅡ处理器发送指令Load Templet将Flash指纹库中的初始模板下载到指纹识别器的输出缓冲区中,完成后再发送指令Up Templet将缓冲区中的模板上传到NiosⅡ处理器的存储区域,这样就完成了一次指纹匹配过程。
下图为NISOII初始化之后通过串口向指纹识别器发送”检测手指“的仿真图。(Detect Finger命令包为:01H,00H,00H,00H,00H,00H,01H,00H,03H)

 
 
图32 Detect Finger检测命令仿真图
 
 
 4.7  密钥产生模块
4.7.1       MD5算法结构
MD5算法处理消息的比特长度为512比特的整数倍。指纹识别器上传的消息长度256Byte,可以分成4个数据包进行签名运算,此外依据MD5算法要求,还需要一个512比特的填充包用来表明数据包的长度,故对用户指纹信息的签名需要进行5轮MD5运算。
 
 
图33 MD5算法结构框图
 
 4.7.2      自定义指令
根据MD5算法组成,我们自定义了两条指令,分别为:
宏“ALT_CI_CLA_32”定义为加法指令,完成模232加法;
宏“ALT_CI_SHIFT”定义为循环左移指令,完成可重构移位操作。
 
 
图34 MD5算法中自定义指令
MD5算法一次主要轮操作运算程序如下:
Main()
{
alt_u32 a,b,c,d,s,t,m[17],F, temp;
a=0x01234567;
b=0x89abcdef;
c=0xfedcba98;
d=0x76543210;
F=(b & c) | ((~ b) & d);
temp=ALT_CI_CLA_32(a,F);
temp=ALT_CI_CLA_32(temp,m[1]);
t=0xd76aa478;
temp=ALT_CI_CLA_32(temp,t);
s=0x7;
temp=ALT_CI_SHIFT_32(temp,s);
a=ALT_CI_CLA_32(b,temp);
4.7.3       MD5算法实现
本设计根据MD5算法结构,在CPU_finger软核中采用用户自定义指令的方式对MD5算法加以实现,并用ModelSim对该NIOSII进行了仿真,实验结果如下所示:
测试向量我们选择为全’0’序列,杂凑结果为564d6152 e2641b99 fb994ad4 3386af99
 
 
图35 MD5算法杂凑结果仿真图
4.8  输入/输出缓存设计
本作品中输入输出缓存模块采用了先进先出队列FIFO进行实现,通过定义用户逻辑并设置与FIFO读写相匹配的时序,能够轻松的完成对FIFO的控制,仿真时序图如下所示。
 
 
 
图36 SOPC Builder中FIFO的控制时序图
 
 
 
图37 FIFO仿真时序图
 
4.9  验证软件系统设计
4.9.1       驱动程序设计

该验证软件系统的主要功能是通过对IDE控制器中相关寄存器进行读写操作来模拟主机对硬盘的操作过程,从而为加密硬盘适配器提供测试平台。
本文所设计的测试系统由两部分组成:高层应用程序及底层驱动程序。由于Windows NT不允许高层的应用程序直接访问硬件资源,所有涉及到端口读写的操作,需通过一个内核态的驱动程序完成,而Windows NT是通过位屏蔽矩阵(IOPM)来实现对端口的访问控制。该矩阵由0,1组成,每一个二进制位对应一个输入输出端口,这样65536个端口共需要8192个字节,如果某一二进制位值为0,那么程序对该端口的读写将不加阻拦。因而底层驱动程序的主要功能是通过调用系统服务KeI386SetGdtSelector()、KeI386AllocateGdtSelectors()、KeI386ReleaseGdtSelectors()对上述位屏蔽矩阵进行设置,将需要在应用程序中访问的I/O端口设置为1,使得上层应用程序能够直接对I/O端口进行操作。
该测试系统中应用程序利用CreateFile()、CloseHandle()、DeviceIOControl()等相关函数与驱动程序进行通信,实现对IO端口的读写。
应用程序与驱动程序进行通信以前,首先需要加载驱动程序。下图说明了驱动程序动态加载以及应用程序与驱动程序交互的过程。
 
图38 动态加载驱动程序
4.9.2      应用程序界面设计
注册管理软件主要完成对加密硬盘的注册与管理,通过用户初始指纹的录入,完成加密硬盘与使用者身份的绑定,其中包括使用者用户名、分发的加密硬盘编号与硬盘容量。
 
图39 注册管理软件
用户管理软件主要完成用户身份的认证与硬盘数据的存取操作,首先启动加密硬盘进行身份认证。其中身份认证,通过录入用户指纹,与注册管理软件注册的指纹进行比对,识别用户的有效身份。认证成功后,文件浏览器会自动弹出。
 
 
图40 用户认证软件
 
 
 
文件浏览器主要是提供给用户完成硬盘存取操作的专用软件,当硬盘连接到计算机后,搜索不到连接的硬盘,只能通过提供给用户的文件浏览器软件对硬盘进行操作,其中包括保存、复制与删除文件操作。
 

图41 文件浏览器
为了便于用户使用,设置了关闭硬盘操作,其主要功能在于销毁当前加解密所使用的密钥,待再次使用时通过认证重新生成,保证系统的安全性。
 
图42 关闭硬盘操作
退出系统操作主要功能为退出用户管理软件,不再对加密硬盘进行操作。
图43 退出系统操作

 
(Revision: 37 / 2008-09-13 14:13:46)

5. 设计方法 (Final Project Paper)
5.      设计方法
本系统的开发分为系统规划、加密算法设计与实现、接口转换板设计、ATA硬盘接口设计、指纹识别器控制模块设计、密钥管理方案设计、应用程序与驱动程序设计及系统整体测试等。
系统规划的计划是以双NISOII处理器为设计平台实现对硬盘数据的加解密操作。其中CPU_finger完成对指纹识别器的控制,并对用户的指纹信息进行签名运算,为系统提供唯一的工作密钥;CPU_DES完成对流向硬盘的数据进行实时的加密,对流向主机的数据进行实时的解密,并依据主机的传输模式控制相应的读写时序发生器。QuartusII内生成的原理图如图所示:
图44 QuartusII 内生成的原理图
 
加解密算法的设计中,通过分析目前常用的加解密算法,最终选取了安全级别高的3DES算法。结合NIOSII处理器的指令集,对3DES算法进行了详细分析,对耗时久的模块进行了划分,其中包括置换、移位运算。
NIOSII处理器在处理这类运算时由于所需指令条数多造成了整体性能的降低,特别是对于算法中大量用到的移位运算,NIOSII处理器完成64比特的置换操作需要通过移位与逻辑运算联合完成,所使用的指令条数多达128条。具体细节如下所示:将输入Datain中的第1比特置换到输出Datout的第64比特,需要Step1与Step2两步操作,对于密码算法中追求完全混乱的目的,置换操作往往是对输入数据的完全置换,故采用NIOSII处理这类运算会降低系统整体的性能。
Input:Datain[63:0]  Output: Dataout[63:0]
Step1:  Datout=64’b0;
Step2:temp=Datain>>63;
Step3:  Dataout= Dataout | temp
基于以上问题,我们采取了自定义的指令方式,对于置换运算,设计了专用的硬件电路进行加速,64比特的置换操作只需一条指令就可以完成。提高了加解密的速度,具体电路图如下所示:
图45置换操作硬件逻辑图
 
接口转换板设计中,分析了ATA协议中IDE接口的电气特征,并与DE1开发板上的接口进行了比较,在Protel DXP中绘制了接口转换板。
ATA硬盘接口设计中,分析了ATA硬盘接口协议,包括硬件结构、传输模式、接口时序与相关命令;自行开发了四种时序发生器,支持硬盘PIO传输中的五种模式与DMA传输中的三种模式。采用Verilog硬件描述语言对其进行了描述,在QuartusII 6.0上进行了综合及布局布线,在Utraedit中编写了包含边界条件的Testbench,在Modelsim6.0上对其进行了功能验证。
指纹识别器控制模块设计中,分析了指纹识别器的用户手册,设计了NIOSII处理器的控制流程,通过SOPC Builder中提供的UART实现与指纹识别器的通信,具体细节如下图所示。在NIOSII IDE中通过调用Fopen 函数以文件的方式打开串口,并用Getc与Fprintf函数完成对串口的读写操作。
 
 
 
图46 SOPC Builder中UART的设置
本设计中利用了片外的SDRAM,使得NIOSII的指令代码的运行不占用片内的存储资源,SDRAM控制器的设置如下,同时,在系统中增加了EPCS控制器,将NIOSII的复位地址设置在EPCS控制器中,如图46所示,通过在IDE开发环境下对EPCS进行编程,系统上电后,EPCS能够自动配置FPGA, 此外加载NIOSII的指令代码。
 

图47 SOPC Builder中SDRAM控制器的设置
 
图48 SOPC Builder中复位地址的设置

         密钥管理方案的设计中,遵循了现代密钥管理的一般原则:唯一性、随机性与安全性。结合本系统的设计特点,采取用户指纹特征信息作为用户的唯一标示。满足密钥唯一性的特点,同时考虑到不同用户的指纹信息的长度千差万别,我们选取了MD5签名算法对其进行签名操作,使输出为统一的128比特杂凑值,作为3DES加解密算法的主密钥,满足了密钥随机性与安全性的要求。
在MD5算法的具体实现过程中,与3DES的实现方式相同,采用了NIOSII自定义指令的实现方式,加速了NIOSII处理签名算法的性能。自定义的指令包括移位与模加操作,其中移位操作采用了桶型移位的设计思想,模加操作采用了先行进位加法器(CLA)的设计思想。
驱动程序的设计采用了驱动程序开发包(Driver Development Kit),实现了对IDE控制器中相关寄存器的读写操作,并在Vsiual Studio6.0中采用C语言编写了应用程序,利用CreateFile()、CloseHandle()、DeviceIOControl()等相关函数与驱动程序进行通信,实现对IO端口的读写操作,为系统提供了良好的人机交互界面。
在完成了以上各部分制作与测试后,最后进行了系统的集成与测试,这是最费时的部分。执行步骤如下:
(1) 规划及编译系统适用的NIOSII_CHECK,按照设置的指纹识别器控制流程在NIOSII IDE中用C语言编写程序代码,在DE1开发板上进行硬件调试,完成用户的指纹登陆、指纹比对与指纹信息的上传。
(2) 在SOPC Builder中将桶型移位与先行进位加法器单元以自定义指令的方式加入到NIOSII_CHECK处理器中,在NIOSII IDE中用自定义指令编写MD5签名算法,在DE1开发板上进行硬件调试,完成对用户指纹信息的签名运算,产生128比特密钥。
(3) 规划及编译系统适用的NIOSII_3DES,通过SOPC Builder将置换与移位单元以自定义指令的方式加入到处理器中,在NIOSII IDE中用自定义指令编写3DES加解密算法,通过Modelsim 6.0对NIOSII_3DESJ进行仿真,验证加解密的正确性。
(4) 在QuartusII 6.0中,通过Megawizard Plug设计系统中共享FIFO缓存模块,在SOPC Builder中添加控制FIFO读写的自定义接口,并定义读写时序。依托DE1开发板进行硬件调试,实现双NIOSII处理器的协同工作,使得NIOSII_3DES处理器利用NIOSII_CHECK产生的主密钥完成数据的加解密操作。
(5) 依据ATA接口协议,在QuartusII 6.0中用Verilog语言设计完成了四种读写发生器,并编写了包含边界条件的Testbench,通过Modelsim 6.0进行了功能验证,结果表明读写发生器支持PIO与DMA传输。
(6) 通过接口转换板,完成主机-DE1开发板-硬盘的连接。在自主开发的应用程序与驱动程序的支持下,完成主机与硬盘之间的数据交互,验证接口转换板的正确性。
(7) 通过QuartusII 6.0与NIOSII IDE下载硬件与NIOSII处理器的指令程序,完成对流向硬盘数据的实时加密与流向主机数据的实时解密。
 
 
(Revision: 4 / 2008-09-13 14:07:24)

6. 设计特点 (Preliminary Paper)
6.      设计特点
1.      双核NISOII处理器结构
在FPGA内部实现了两个(主、从)NIOSII软核处理器,两者通过共享FIFO进行通信。这样的设计充分利用了双核协同设计工作的优势,利用FPGA内部的逻辑和存储器资源,分担数据处理、外设访问、外围及内部逻辑控制等工作。不仅完成了对外部指纹识别器的控制,同时完成了对数据的加解密操作,减少了硬件电路的面积和复杂性,降低了软硬件设计的成本。
2.      用户自定义指令实现关键算法模块的硬件加速
由于密码算法与签名算法是一个很复杂的数据处理过程,用软件实现的方式必定会降低系统的速度。本作品利用Altera公司提供的SOPC Builder添加了自定义的用户指令。我们在作品中采用硬件描述语言实现了加密与签名算法中的关键模块,实现了硬件加速,使系统的整体性能得到了大幅度的提升。
3.      多模式下ATA接口的设计
本作品设计了支持硬盘ATA接口的读写时序发生器,能够支持PIO的五种模式与DMA的三种模式。在主机与硬盘的交互过程中,能够根据主机的传输模式自适应的启动相应的读写发生器,满足了现实中应用的需求,丰富了系统的功能。
4.      安全的密钥管理方案
本作品专门在系统中设置了“指纹钥匙”,增加了系统的安全性。通过对用户的指纹信息进行杂凑运算,使得每个用户只需在指纹识别器上轻轻一按,系统就能够自动完成对用户身份的鉴别,同时产生与用户身份一致的工作密钥,并且这个密钥具有唯一性,从而提高了整体系统的安全性。
5.      自主开发的接口转换板
由于DE1开发板具有的丰富外设扩展接口,我们利用其中的两个40针的扩展口,自行开发了与硬盘ATA接口相匹配的接口转换板,增强了系统的扩展性。
6.      良好的人机交互界面
本产品自主开发了清晰良好的人机交互界面,分析了与硬盘相关的驱动程序,通过对IDE控制器中相关寄存器进行读写来模拟主机对硬盘的操作过程,从而为加密硬盘适配器提供完备测试平台,大大简化了调试工作的困难。
7.      便于产品的升级与开发
本作品的升级与开发空间大,考虑到现实应用中的情况,对数据加解密的算法很多,本作品选取的是3DES密码算法,是通过NIOSII自定义指令方式进行实现的。依托与NIOSII处理器灵活的可编程性,针对不同的用户可以轻松的在NISOII中更改其它的密码算法,加上FPGA的可编程性,可以在很短的时间内就可以开发出新的产品。
整个设计过程贯穿了Altera公司NIOSII 处理器灵活的设计方法和SOPC领先的设计理念,FPGA能够把以往需要的外部控制单元所作的工作全部集成到一起,给设计人员带来了极大的方便,同时FPGA摒弃了传统的设计思想——设计更改必须更改硬件,实现了处理器与硬件逻辑的无缝接口,减少了硬件布线的工作,保证了系统的稳定性,缩短了产品的开发周期。
 
(Draft / 2008-06-14 15:22:29)

7. 总结 (Final Project Paper)
7.      总结

很荣幸能够进入亚洲创新设计大赛地复赛阶段,短短两个月地时间,对我们设计小组来讲是一段不断学习,不断实践地经历。我们感受到QuartusII设计功能地强大与灵活。在SOPC Builder中,系统为我们提供了很多常见地IP核,这使我们地工作变得更加轻松和方便,我们也可以加入自己定制的IP核以及自定义指令,满足用户特定的要求,这使我们的设计工作变得更加灵活。特别是自定义指令,现在增加到256条,足够满足用户得要求。在软件开发方面,QuartusII又集成了Nios IDE。我们可以在NIOS IDE图形界面中完成从程序设计到最后下载运行的全过程。特别是CycloneII架构的FPGA给我们的开发提供了强有力的支撑。
1、成本优化的新型可编程架构
CycloneII低成本架构通过仔细选择封装形式来提供足够的I/O管脚和功耗特性,通过提高产品设计工艺的效率来进一步减少裸片的尺寸。以此为基础,CycloneII系列器件具有可与ASIC竞争的成本优势、丰富的逻辑资源和存储资源、时钟管理电路和高性能I/O资源。
2、FPGA上的低成本DSP实现
CycloneII器件中的M4K块能够用于实现软乘法器,从而支持图像处理、音频处理和消费类电子系统等多种高性能、低成本的DSP应用。
3、外部存储器接口
CycloneII器件提供了专用的外部存储器接口电路,用于与双数据速率(DDR)SDRAM、FCRAM以及单数据速率(SDR)SDRAM器件进行快速、可靠的数据交换,最高速率可达到266Mb/s。
4、支持广泛的接口和协议
CycloneII 器件支持多种串行总线和网络接口,还支持广泛的通信协议。Altera公司为这些应用提供了一系列已专门针对CycloneII器件结构优化的IP。
5、内含增强型锁相环
CycloneII 器件内置至多两个增强型的锁相环,可用于简化板级设计的时序问题,以及为大批量价格敏感性应用提供高性价比的时序控制方案。
6、先进的I/O支持
CycloneII 器件支持最多129个通道的LVDS、RSDS等差分I/O标准,以及LVTTL、LVCOMS、SSTL-2、SSTL-3、PCI等单端I/O标准,以便与电路板上的其他芯片通信。
7、NIOSII 嵌入式处理器
NIOSII 系列处理器以非常成功的一代NIOS处理器为基础,提供高性能内核、低成本内核和性价比平衡的标准内核等三种内核供设计者选择。
我们深刻体会到FPGA以及软核设计方式的优点,特别是在进行产品开发时,采用FPGA以及软核设计方式可以缩短开发周期,减少开发风险,提前抢占市场。
 
(Revision: 11 / 2008-09-13 13:30:47)