###	Index:1365	《软件导刊》	具有分区加密功能的SD卡固件设计
具有分区加密功能的SD卡固件设计作者：刘丽丽　张雪来源：《软件导刊》2017年第05期

摘要摘要：设计一种基于SD控制器S281的固件，具有外部认证、分区加密功能。利用控制器中内置3DES和AES加密算法，可以实现对数据的硬件加密，具有更高的安全性。介绍控制器的内部结构及固件实现分区加密的原理，并在固件上实现闪存的均衡算法以及坏块管理，保证闪存的合理使用。经过实验测试，该分区加密SD卡在可靠性测试、读写速率测试和功能实现测试上均满足要求。

关键词关键词：SD控制器；分区加密；SD固件设计；NANDFlash

DOIDOI：10.11907/rjdk.171096

中图分类号：TP309.7

文献标识码：A文章编号文章编号：16727800（2017）005016803

0引言

SD卡主要由控制器和闪存芯片组成，其具有体积小、数据传输速率快、可热插拔等优良特性，被广泛应用于便携式设备如电子词典、移动电话、数码相机、汽车导航系统[1]。计算机技术的快速发展使得信息的传递越来越迅速、便捷，同时人们对信息存储介质的安全性要求也越来越高，普通SD卡已不能满足人们对于安全存储的需求。本文设计的SD卡创新性地将SD的存储空间划分为两个分区，分别为普通区和保密区，同一时间只显示一个分区。上电完成后默认显示普通区，若需要切换至保密区则需要通过专用上层软件输入密码完成外部认证。外部认证采用3DES加密算法，数据存储采用目前公认的AES256加密算法[2]。这样不仅满足了普通数据存储的需求，同时满足机密数据保护需求。

1硬件架构

1.1总体框架

SD卡主要由存储单元和控制单元组成。本文存储介质采用Micron4GBNANDFlash存储芯片MT29F32G08CBACA，主控采用华澜微自主研发的符合SD2.0标准的设备控制器S281。本设计总体硬件架构图如图1所示。

1.2控制器芯片S281简介

S281固件设计具有一定复杂度，深入理解控制器的内部结构有助于设计出更好的固件。S281拥有一个32bit的嵌入式精简CPU执行算术及逻辑运算，它从ROM和SRAM中获取指令，解码并执行，同时管理CPU及闪存接口的控制和状态信号。CPU控制SD接口、NANDFlash接口、FIFO的总线操作，不同模块间通过不同总线实现数据路由。同时S281控制器内置随机数发生器和硬件加密模块，为后续固件设计提供便利。

2固件设计

SD卡的固件主要是辅助或控制硬件完成上电初始化及数据传输[3]，而分区加密的SD卡还要在固件上实现分区切换以及全盘数据加密。由于Flash在使用过程中易产生坏块，难以管理，且有擦除次数的限制。本文在固件设计中通过逻辑表动态建立坏块表，完成Flash的坏块管理，根据物理擦除次数选择空块实现Flash的均衡算法，延长闪存的使用周期，实现闪存的合理化使用。

2.1读操作固件设计

SD协议中读命令包括CMD17和CMD18[4]，CMD17读取单个数据块到SD接口，而CMD18在指控制器未接收到CMD12（停止命令）前读取多个数据块。当S281接收到CMD17时，首先调用地址解析函数将命令参数中的地址转换成逻辑地址，分别用cluster.logic、block.logic、page.logic代表逻辑簇地址、逻辑块地址和逻辑页地址。再调用地址转换函数建立映射表，通过查找映射表将逻辑地址转换成物理地址，其中映射表包括簇映射表、块映射表和页映射表。根据页映射表中逻辑页所对应的物理页flag（标志位）判断页中是否含有有效数据，即物理页有没有被写过。若页中不存在数据，根据NANDFlash的特性，即页内数据全部为0xFF，则在FIFO中需要将数据传送到SD接口的内存空间，全部用0xFF填充。如flag表明此页已被编辑过，即页中存在有效数据则发送Flash的读命令（00～30h）读取页中的数据，并通过DMA总线将数据传送到FIFO中，此时数据为采用AES256加密的密文，需要调用加解密函数解密FIFO中的数据。最后将FIFO中的数据通过主机数据总线发到SD接口完成单块读操作。

当S281接收到CMD18命令后，其操作与CMD17基本一致，只是在没有收到CMD12之前，CMD18固件内部页内逻辑地址会自动增加，并传送数据到SD接口。若页内逻辑地址增加导致需要切换逻辑块或逻辑簇，则需要重新调用地址转换函数建立映射表。

2.2写操作固件设计

由于Flash的物理页只能编程一次，不能对物理页多次编写[5]，即写入的数据必须是物理页大小的整数倍，所以写操作的固件设计更加复杂。当逻辑页中的数据有部分更新时就需要将新旧数据一起写入物理页中，这就需要在固件上实现Flash的PreCopy和PostCopy两个操作。当写命令的起始逻辑地址不为0，而是页的中间地址时，PreCopy在写操作过程中，固件需要将物理页前面的数据从Flash中读取到FIFO，与新数据组合成一页写入一个新的物理页中。而PostCopy就是当终止的逻辑地址没有到页的最后512字节时，就需要将物理页后面的数据从Flash中读取到FIFO，与新数据组合成一页写入到一个新的物理页中，PreCopy和PostCopy可能同时发生。

SD协议中写命令包括CMD24和CMD25，分别为单个数据块写和多个数据块写。当S281接收到CMD24时，硬件会自动接收第一个512字节的数据块，并存放到FIFO中。同读命令一样，首先调用地址解析函数将命令参数中的地址转换成逻辑地址，再调用数据加解密函数使用存储在Flash中的密码将接收到的数据块采用AES256加密算法加密，最后调用地址转换函数建立映射表，通过映射表实现地址转换。根据页映射表中逻辑页所对应物理页的flag判断页中是否含有有效数据。若物理页已被写过，则根据逻辑页内地址判断是否需要进行PreCopy操作，若需要进行PreCopy操作则将物理页内地址前面的数据读取到FIFO的相应存储空间中。若页内为空，则PreCopy操作中的数据全部用0xFF填充，并将填充的数据采用AES256算法加密。由于硬件已自动接收512字节的数据到FIFO中，此时需要将逻辑页内地址自增一个数据块的大小，即512字节。根据此时逻辑页内地址判断是否需要进行PostCopy操作，其操作方式和PreCopy相同。最后将FIFO中的一整页数据通过DMA操作写入到一个无数据的空页中。完成写命令后更新页映射表，将此逻辑页对应的物理页更新为最新操作的物理页。由于每个簇中都需要预留几个空块以备后续使用，所以完成写操作后还需要根据簇映射表判断簇中所含空块数量是否满足要求，若不满足则需要采用merge操作，擦除某些块中的数据，并在块映射表中将此块标记为空块。由于一个逻辑块可能对应两个或者多个物理块，分别为source.block和target.block，target.block中存储的数据是最新的，source.block中存储的数据是过时的。Merge操作就是将source.block和target.block中的有效数据合并到一个新的物理块中，并将source.block和target.block中的数据擦除，这样就可以腾出一个空的物理块。写操作在选择空块写入数据时，会根据空块的flag选择擦除次数较少的空块作为目标空块，实现均衡算法，保证Flash的合理使用。写操作简化框架如图2所示。

CMD25的基本流程和CMD24一样，只是在没有收到CMD12前，S281一直执行写数据块的操作，逻辑页内地址也会一直递增。当逻辑地址增加后需要切换逻辑块或逻辑簇时，就需要重新调用地址转换函数建立映射表。

2.3分区切换固件设计

分区加密SD卡的固件设计主要集中在两个方面：一是对用户的访问限制即外部认证，防止非法用户；二是对SD卡中的数据加密，防止SD存储卡被暴力破解读取数据[6]。同时由于对不同数据安全的要求不同，将SD存储卡的存储空间分为两个分区，分别为普通区和保密区，普通区可见，保密区隐藏。由于本设计中保密区和普通区分别为2G，同一时间只有一个分区可见，固件上采用相对地址跳转的方式实现分区。用户通过上层软件输入密码并发出外部认证命令，控制器S281接收到命令后驱动内置的随机数发生器产生随机数，上层软件获取来自S281的随机数，并采用3DES加密[7]。与此同时，S281采用NANDFlash中存储的密码对随机数采用同样的加密算法加密，S281比对两次加密的结果，相同则说明用户密码正确，用户获取切换分区的权限，否则认证失败。外部认证成功后，用户可以通过上层软件发出切换至保密区的命令，S281接收到切换命令后，将逻辑地址跳转至保密区的地址，保密区的数据对用户可见，用户便可以对保密区进行读写操作。SD卡全盘数据均采用AES256加密算法加密[8]，用户读写SD卡时，固件自动加解密数据，下电或切换至普通区后需要重新认证才能切换至保密区[9]。具体流程如图3所示。

为实现外部认证和分区切换，采用动态接口文件的方式，即CPU通过特殊的标识码过滤命令包。用户通过上层软件发送外部认证或分区切换命令时，实际上是通过写命令CMD24向FIFO中传入带有特殊标识码的512字节

数据包，特殊标识码由标识码和命令字组成。标识码代表发送的命令为特殊的命令标识，命令字代表特殊命令的类型如外部认证、切换分区等。上层软件发送带有标识码和命令字的数据包到FIFO后，S281识别FIFO中的数据包为特殊的命令包后，根据命令字判断需要执行的操作，根据命令字固件上实现外部认证或分区切换的操作。并将操作后的响应存储在FIFO中，上层软件通过发送CMD17读取FIFO中的响应，判断操作是否成功完成，并反馈到用户。

3结语

本文介绍了一种SD卡的固件设计，此固件基于国内自主研发的SD控制器S281。相较于一般的SD卡，此固件采用S281内置的3DES和AES256加密算法以实现存储盘外部认证和分区加密，并通过实验测试验证了固件可以正确无误运行。同时此设计方案采用动态接口文件的方式，具有很好的可扩展性和可移植性，后续可以增加其他功能，如修改加解密密码、加密数据流等。经过多次实验验证，此固件可以正确稳定工作，具有很好的应用价值和发展前景。

参考文献参考文献：

[1]王超.基于FPGA的MicroSD卡控制器研究[D].哈尔滨：哈尔滨工业大学，2014：12.

[2]赵雪梅.AES加密算法的实现及应用[J].常熟理工学院学报，2010（2）：105110.

[3]张聪，张涛.基于USB3.0设备控制器的固件设计[J].电子器件，2013（3）：383388.

[4]RIJMENV.SDgroup：physicallayersimplifiedSpecificationversion3.00[J].SDCardAssociation，2009.

[5]MICRONCORPORATION.L74ANANDflashmemorydatasheeRev.E3/11EN[R].Boise：MicronCorporation，2009.

[6]唐婷.加密U盘的设计与实现[J].成都电子机械高等专科学校学报，2006（2）：1416.

[7]FELDHOFERM，WOLKERSTORFERJ.AESimplementationonagrainofsand[J].InformationSecurityIeeProceedings，2005，152（1）：1320.

