---
title: 使用KAE提升SM4-XTS算法性能
description: "KAE支持对称加密算法SM4的XTS模式，用以提高算法能力。该模式仅支持内核态使用，具体使用方法是基于dm-crypt的透明分区/磁盘加密。"
url: https://www.hikunpeng.com/document/detail/zh/kunpengboostkithistory/2300/accel/kunpengaccel_16_0023.html
sourcePath: /source/zh/kunpengboostkithistory/2300/accel/kunpengaccel_16_0023.html
indexId: 56dd2fef8675edf3bd598d9d42df131bc9439e5620d2badafbd7e7cfce422fea70
---
# 使用KAE提升SM4-XTS算法性能

KAE支持对称加密算法SM4的XTS模式，用以提高算法能力。该模式仅支持内核态使用，具体使用方法是基于dm-crypt的透明分区/磁盘加密。

dm-crypt向上呈现为一个device mapper机制的target device，经过映射挂载后就可以作为透明加密分区/磁盘使用。

dm-crypt算法注册在Crypto模块中，hisi_sec2驱动安装后，SM4-XTS算法会注册到Crypto模块中，使用LUKS（Linux Unified Key Setup，Linux统一秘钥设置）进行配置即可实现硬件加解密。

一个加密盘操作要占用24个队列，当前加速器限制开放256*2的队列数，如果需要操作更多数量的加密盘，需要先开启所有1024*2的加速器队列。开启方法：修改/etc/modprobe.d/hisi_sec2.conf配置文件中pf_q_num参数，重启生效。

#### 环境要求

- 已安装hisi_sec2驱动，安装方法请参见  安装KAE
。
- 为提升SM4-XTS算法性能，请将LUKS工具Cryptsetup升级至2.2.0版本。
操作系统自带cryptsetup软件可能无法正在使用SM4-XTS算法加密磁盘，需要进行升级，请下载cryptsetup-2.2.0源码到环境中，以EulerOS2.8为例，升级cryptsetup步骤如下。

  1. 依次安装cryptsetup-2.2.0的依赖包：libuuid-devel、device-mapper-devel、popt-devel、json-c-devel、libblkid-devel。
    1 2 3 4 5 yum install libuuid-devel yum install device-mapper-devel yum install popt-devel yum install json-c-devel yum install libblkid-devel

  2. 在cryptsetup-2.2.0源码目录下编译安装。
    1 2 ./configure make && make install

其中，libuuid-devel、device-mapper-devel、popt-devel、json-c-devel、libblkid-devel为cryptsetup依赖软件包。


#### 加密分区/磁盘

1. 在系统根目录下生成keyfile文件。
  1 dd if=/dev/random of=/home/EncryptKeyFile bs=4k count=1

  显示结果为： 1 2 3 0+1 records in 0+1 records out 115 bytes copied, 0.00010976 s, 1.0 MB/s

2. 加密分区/磁盘。
  1 cryptsetup --batch-mode --cipher sm4-xts-plain64 --key-size 256 --hash sha256 --sector-size=4096 --type=luks2 --key-file /home/EncryptKeyFile luksFormat /dev/sdb

3. 映射分区/磁盘。
  1 cryptsetup --key-file /home/EncryptKeyFile luksOpen /dev/sdb sx_disk

4. 查看分区/磁盘是否加密。
  1 lsblk

  显示crypt表明分区/磁盘已加密。 1 2 3 4 5 6 7 8 9 NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT loop0 7:0 0 5.5G 1 loop /os_lhl sda 8:0 0 2.2T 0 disk ├─sda1 8:1 0 1G 0 part /boot/efi └─sda2 8:2 0 2.2T 0 part ├─vg_os-swap 254:0 0 20G 0 lvm [SWAP] └─vg_os-root 254:1 0 2.2T 0 lvm / sdb 8:16 0 278.5G 0 disk └─sx_disk 254:2 0 278.5G 0 crypt

5. 格式化分区/磁盘。
  1 mkfs.xfs /dev/mapper/sx_disk

  显示结果为： 1 2 3 4 5 6 7 8 9 meta-data=/dev/mapper/sx_disk isize=512 agcount=16, agsize=4562368 blks = sectsz=512 attr=2, projid32bit=1 = crc=1 finobt=1, sparse=0, rmapbt=0, reflink=0 data = bsize=4096 blocks=72997376, imaxpct=25 = sunit=64 swidth=64 blks naming =version 2 bsize=4096 ascii-ci=0 ftype=1 log =internal log bsize=4096 blocks=35648, version=2 = sectsz=512 sunit=0 blks, lazy-count=1 realtime =none extsz=4096 blocks=0, rtextents=0

6. 创建挂载点目录。
  1 mkdir /home/sec_test

7. 挂载分区/磁盘到目录。
  1 2 mount /dev/mapper/sx_disk /home/sec_test/ df -h

  显示结果为： 1 2 3 4 5 6 7 8 9 10 11 Filesystem Size Used Avail Use% Mounted on devtmpfs 63G 0 63G 0% /dev tmpfs 63G 0 63G 0% /dev/shm tmpfs 63G 28M 63G 1% /run tmpfs 63G 0 63G 0% /sys/fs/cgroup /dev/mapper/vg_os-root 2.2T 18G 2.1T 1% / /dev/sda1 1022M 172K 1022M 1% /boot/efi tmpfs 13G 20K 13G 1% /run/user/472 tmpfs 13G 0 13G 0% /run/user/0 /dev/loop0 5.5G 5.5G 0 100% /os_lhl /dev/mapper/sx_disk 279G 317M 279G 1% /home/sec_test

8. 确认目录可正常访问。
  1 cd /home/sec_test/;ll

9. 在“/home/sec_test”目录下查看分区/磁盘是否已加密，并且和目录是否正确对应。
  1 lsblk

  显示结果为： 1 2 3 4 5 6 7 8 9 NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT loop0 7:0 0 5.5G 1 loop /os_lhl sda 8:0 0 2.2T 0 disk ├─sda1 8:1 0 1G 0 part /boot/efi └─sda2 8:2 0 2.2T 0 part ├─vg_os-swap 254:0 0 20G 0 lvm [SWAP] └─vg_os-root 254:1 0 2.2T 0 lvm / sdb 8:16 0 278.5G 0 disk └─sx_disk 254:2 0 278.5G 0 crypt /home/sec_test

10. “/home”目录下查看分区/磁盘加密详细信息。
  1 cryptsetup status /dev/mapper/sx_disk

  显示结果如下： 1 2 3 4 5 6 7 8 9 10 /dev/mapper/sx_disk is active and is in use. type: LUKS1 cipher: sm4-xts-plain64 keysize: 256 bits key location: dm-crypt device: /dev/sdb sector size: 512 offset: 4096 sectors size: 583979008 sectors mode: read/write

11. 执行2到10，对多个分区/磁盘进行加密。


#### 删除加密的分区/磁盘

1. 卸载分区/磁盘的挂载目录。
  执行指令前，用户必须先退出挂载目录。 当有多个分区/磁盘挂载时，需要多次执行该命令进行目录卸载。

  1 umount -l /home/sec_test

2. 执行lsblk命令，确认已卸载分区/磁盘的挂载目录。
  1 lsblk

  显示结果为： 1 2 3 4 5 6 7 8 9 NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT loop0 7:0 0 5.5G 1 loop /os_lhl sda 8:0 0 2.2T 0 disk ├─sda1 8:1 0 1G 0 part /boot/efi └─sda2 8:2 0 2.2T 0 part ├─vg_os-swap 254:0 0 20G 0 lvm [SWAP] └─vg_os-root 254:1 0 2.2T 0 lvm / sdb 8:16 0 278.5G 0 disk └─sx_disk 254:2 0 278.5G 0 crypt

3. 关闭映射。
  需要多次执行该命令关闭所有映射。

  1 cryptsetup luksClose sx_disk

4. 查看映射是否关闭。
  1 ll /dev/mapper/

  显示结果如下： 1 2 3 4 total 0 crw---- 1 root root 10, 236 Jul 31 22:27 control lrwxrwxrwx 1 root root 7 Jul 31 22:27 vg_os-root -> ../dm-1 lrwxrwxrwx 1 root root 7 Jul 31 22:27 vg_os-swap -> ../dm-0
