加密块设备示例
源码路径: example/rt_device/crypt_block_dev
概述
例程展示了如何使用 crypt_block_dev 中间件在 SD/eMMC 块设备上创建一层透明的 AES 加密层,
所有写入底层设备的数据都会被 AES-CTR-128 加密,读取时自动解密,上层文件系统无需感知加密逻辑。
应用层 (DFS / FatFs)
↓
crypt_root / crypt_misc (crypt_block_dev, AES-CTR-128 透明加解密)
↓
root / misc (mmcsd 分区设备, 存储密文)
↓
sd0 (底层 SD/eMMC 块设备, 存储密文及明文分区表)
支持平台
sf32lb56-lcd_a128r12n1
sf32lb58-lcd_n16r64n4
sf32lb58-lcd_a128r32n1_dsi
sf32lb58-lcd_n16r32n1_qspi
使用指南
编译
cd example/rt_device/crypt_block_dev/project
scons --board=<board_name> -j8
运行
烧录后启动,系统通过 INIT_ENV_EXPORT 自动执行初始化:
等待 SD/eMMC 设备就绪(超时约 8 秒)
在原始 SD 卡上创建
root和misc分区对每个分区分别创建加密层
crypt_root和crypt_misc(AES-CTR-128)/挂载到crypt_root,/misc挂载到crypt_misc(首次使用自动执行mkfs)
分区布局
分区 |
起始偏移 |
大小 |
|---|---|---|
root |
0x00081000 |
48 MB |
misc |
0x00F81000 |
500 MB |
Finsh 命令
文件读写速度测试(通过文件系统)
命令 |
说明 |
|---|---|
|
加密写入速度测试,每调用写入 N 个扇区(默认 1) |
|
解密读取速度测试,每调用读取 N 个扇区(默认 1) |
示例:
crypt_write /test.bin 10 # 加密写入 10MB 文件,每次 1 扇区
crypt_write /test.bin 10 64 # 加密写入 10MB 文件,每次 64 扇区(32KB)
crypt_read /test.bin 10 # 解密读取 10MB 文件
原始块设备读写速度测试(绕过文件系统)
命令 |
说明 |
|---|---|
|
原始加密块设备读取速度测试 |
|
原始加密块设备写入速度测试 |
示例:
crypt_raw_read 1024 # 读取 1024 个加密扇区
crypt_raw_write 2048 128 # 写入 2048 个加密扇区,每次 128 扇区(64KB)
数据完整性验证
命令 |
说明 |
|---|---|
|
写入 1MB 随机数据,然后读取偏移 512KB 处的 512KB 进行逐字节比对 |
示例:
crypt_verify /verify.bin # 写 1MB,验证后 512KB 是否正确
文件系统命令(ls, df, mkdir 等)与普通文件系统完全一致。
注意事项
密钥
aes_key(16 字节)和初始向量aes_iv示例中使用的是硬编码测试值,生产环境务必替换为安全密钥加密后的 SD 卡在其他设备上无法直接读取分区数据(数据为密文),但分区表(MBR)以明文存储
AES-CTR-128 模式下,每个分区独立加密,使用相同的密钥和 IV
分区的扇区偏移和大小在
main.c中通过FS_ROOT_OFFSET/FS_ROOT_LEN/FS_MISC_OFFSET/FS_MISC_LEN宏定义,可根据实际存储介质调整blocks_per_call参数可用于测试不同缓冲区大小对读写性能的影响,值越大单次传输数据量越大,可能提升吞吐量