针对工业MP3模块对语音文件的加密需求,如何在工业应用领域中保证在低成本、低功耗的微控制器下实现文件加密就成了该项目研究的重点。

一、系统硬件组成部分

1、SD卡

安全数码卡(SD,Secure Digital Memory Card)是一种为满足安全、容量、性能和使用环境等各方面的需求而设计的一种存储介质,卡内含一个智能控制模块。SD卡之所以称之为安全数码卡,是因为该智能控制模块中固化有硬件加密技术。

SD卡与微控制器的接口有安全数字输入输出(SDIO, Secure Digital Input and Output Card)和串行外设接口(SPI,Serial Peripheral Interface)两种通信模式嘲。可以根据实际需要来选择使用这两种通信模式中的一种与卡进行通信,由于不是所有微控制器都带有SDIO接口,并且SPI协议可以通过普通IO口模拟,所以本系统采用SPI通信模式。

2、VS1003音频解码器

VS1003是一款廉价的MP3/WMA/MIDI音频解码芯片。芯片内包含一个自主产权的低功耗DSP处理器核VS_ DSP,外围提供了一个支持SPI协议的串行控制数据接口以及一个高品质可变采样率的ADC和立体声ADC。

3、微控制器STM32F103C8T6

STM32F103C8T6是一款高性能、低功耗、高性价比的工业级MCU,内部集成了2个硬件SPI控制器,正好能满足该系统的设计,从而节省了硬件成本并控制了产品体积。系统硬件设计框图如图1所示。

1

二、SD卡加密优势及程序设计要点

1、SD卡的加密优势

SD卡在硬件上内嵌了加密算法,当卡上电时,若卡包含密码,卡会自动进入锁定状态。在这种状态下读写都是不容许的,从而保障了卡内数据的安全。相对闪存中常见的软件加密,SD卡硬件加密有以下几大优势:

(1)安全性高

闪存中的软件加密是通过加密算法把闪存中的文件进行加密,当该闪存被格式化后,加密功能不复存在,但此时可以通过PC上的恢复软件恢复卡中的数据。而SD卡硬件加密以后卡无法在PC机上识别,更无法对卡进行格式化,具有极高的安全性。

(2)实现成本低廉

只需一个廉价的单片机就能对SD卡内数据加密,而常见的嵌入式设备因为主控CPU的限制很难适应大数据通过软件算法加密。

(3)操作速度快

软件加密是对闪存中的单个文件加密,加密的速度取决于算法的难度和CPU的速度,并且加密后读写速度会因为要软件解密而变慢。SD卡加密是对整个磁盘进行加密,纯硬件加密不影响读写速度。经测试,一张数G的SD卡加密所需要的时间不超过1s,这是软件加密不可能实现的。这也为数据加密在工业上的应用提供了实时条件。

2、SD卡的加密程序设计要点

SD卡密码和密码长度保存在128 bit的PWD寄存器和8 bit的PWD- LEN寄存器中,这些寄存器是是非易失性的。与SD卡加密的操作命令字为CMD42,在写入CMD42后接着写入SD卡的命令数据块即可完成对SD卡硬件加密的操作。图2是加密命令数据块的结构。

1

根据图2,可以把命令数据块中的第一个字节(即Byte0)称为命令码,通过该命令码的配置可以完成设置密码、清除的密码、上锁与解锁以及强制擦除卡片的内容等操作。下面分析常见的接种操作方式中的要点。

(1)加密并上锁

给SD卡加密并上锁后,SD卡在没有解锁的情况下将不能被读写4:根据图2要上锁的命令为Bit2=1,设置密码的命令为Bit0-1,其它的位设置为O,即命令码为Ox05。在SD卡接受CMD42命令字前需要降低SPI的通信速度,这样才能更好的接受加密指令,SD卡在读写数据时块长度(block)为512Byte,但在写入密码前应通过CMD16命令字设置block长度为密码长度(PWD LEN)加上两个Byte即PWD LEN+2,在加密操作完成后恢复数据块长度512Byte。以设置密码为“123456”为例,加密并加锁的关键代码如下:

SPI_SetSpeed (Low)://设置SPI为低速通信模式

SD_SendCmd(CMD16, Ox08, Oxff);//设置blcok为8

SD_SendCmd (C:VID42, Oxffffff, Ox95):11写入命令

SD;SPI_WriteByte (Oxfe)://数据命令盾牌

SD SPI_ WriteByte(Ox05)://设置密码,并给卡加锁

SD_SPI_WriteByte (Ox06);//密码长度

SD_SPI_WriteByte (Ox31);//写入密码123456

SD_SPI_ Wri'teByte (Ox32);

SD_SPI:WriteByte (Ox33);

SD_SPI-WriteByte( Ox34);

SD SPI_ WriteByte(Ox35);

SD SPI- WriteByte(Ox36);

SD SPI_WriteByte(Oxff)://写两字节的CRC校验

SD SPI WriteByte(Oxff)

SD SendCmd (CMD16, Ox200, Oxff)://恢复block

SPI_SetSpeed (High);//恢复SPI为高速通信模式

(2)解锁

解锁是指当SD卡加密并上锁后,用户输入密码操作SD卡内数据的一种方式,在系统丢电后SD卡自动进入上锁状态。解锁的操作和上面的加密上锁类似,只是把命令码替换成Ox00,然后写入密码长度和密码内容,SD卡接受这些数据后会匹配上一次写入的密码,如果匹配成功容许访问卡中的数据,反之卡保持为锁定状态。

(3)强制擦除

如果用户忘记了SD卡的密码,可以通过强制擦除命令擦除卡片上的密码及密码长度,但此时卡上的数据也随之删除。强制擦除的命令码为Ox80,在强制擦除前要将block设置为IByte,具体操作流程如图3所示。

1

三、系统软件设计

系统软件设计主要主要包括Fat32文件系统移植、对SD卡进行加密与解锁、MP3文件解码等几个部分。

1、移植FAT32文件系统

由于FAT16最大只支持2G的容量,所以大容量SD卡中的文件系统必须兼容FAT32文件系统,目前嵌入式系统中文件系统很多比如C/FS、ZLG/FS、eFSL、FatFS等,其中FatFS文件系统是免费开源的文件系统,它有占用资源少、读写速度快、易于移植的优点,并且它完全兼容FAT32文件系统,并提供了丰富的API。

移植的重点主要在于编写diskioc这个文件,原理是把SD卡读写扇区的函数与FatFS文件系统中的读写函数进行挂接。diskio总共需要编写6个函数,但其中最重要的只有三个函数,他分别是一dis'k_initialize;disk_read和disk_write,其它的接口函数如果不需要使用,可以直接返回0。

1)dis k_initialize:该函数的功能是初始化存储媒介。这里是指SD卡。在这个函数中加入SD卡的初始化函数弘这样系统挂载FatFS时SD卡会随之初始化。

2)disk read:读扇区函数,是通过文件系统读取SD卡最基本的动作之一,此处需要把SD卡驱动中写单个扇区和写多个扇区的函数与其挂接。

3)disk_write:写扇区函数妻与读扇区函一样,这里要把SD卡驱动中读单个扇区和读多个扇区的函数与其挂接。

2、在SD卡加密状态下对MP3解码

由于VS1003是块硬件语音解码芯片,在微控制器从SD卡中读取MP3文件并转换成二进制码流后,通过SPI总线传送给VS1003就能进行MP3播放。

在系统第一次上电时要判断SD卡是否有加密,如果没有加密,在系统上电后马上给SD卡加密并上锁,以保护SD卡内的数据的安全,然后匹配密码进行解锁,最后用户就可以操作卡中的数据了。在挂载文件系统后,如果能通过文件系统读取到卡的信息,如卡的容量、扇区大小就表明卡没有加密,反之如果读不到SD卡的基本信息那么该卡已经加密。整个系统软件设计流程如图4所示。

1

四、系统整体测试

SD卡经过该系统加密后通过读卡器插入PC机,PC机无法检测到SD卡的盘符,不能对SD卡进行任何操作。在执行强制擦除命令后,SD卡中的文件系统被破坏,此时PC机依旧无法打开该卡,如果需要继续使用该SD卡,需要在PC上重新格式化。在格式化前后都无法通过数据恢复软件恢复任何数据,该测试所使用的恢复软件有:EasyRecovery、DiskGenius和金山数据恢复等等。

经过运行测试,系统可以在加密的情况下流畅的播放320kb/s的高品质MP3音乐文件,成功完成了带加密功能的工业MP3的实现。

小知识之FAT

FAT是文件配置表(英语:File Allocation Table,首字母缩略字:FAT),是一种由微软发明并拥有部分专利的文件系统,供MS-DOS使用,也是所有非NT核心的微软窗口使用的文件系统。