SDF密码设备接口的软件实现
SoftSDF 是一个实现了 SDF 接口的软件项目。该项目编译后生成一个 SDF 动态库和一个名为 softsdfinit
的命令行工具。SoftSDF 提供标准的 SDF 接口,通过调用 GmSSL 库以软件方式实现密码计算和密钥存储。
SDF 是中国国家密码管理局发布的安全密码设备接口标准。该标准定义了密码设备与外部应用系统之间的接口,包括以下几个方面:
- 基础安全算法:SM1、SM2、SM3、SM4 等中国国家密码算法。
- 密钥管理:密钥的生成、存储、使用和销毁的管理规范。
- 数据加密解密:数据加密和解密的接口和操作。
- 数字签名和验签:数字签名的生成和验证接口。
- 消息摘要:消息摘要算法(如 SM3)的计算接口。
- 身份认证:身份认证的接口和操作流程。
SoftSDF 项目包括 softsdf
动态库和 softsdfinit
命令行工具,用于实现和初始化一个虚拟的 SDF 设备。
- softsdf 动态库:提供标准的 SDF 接口,通过 GmSSL 库以软件方式实现密码计算和密钥存储。
- softsdfinit 命令行工具:用于初始化一个虚拟的 SDF 设备,创建 KEK 密钥和 SM2 密钥对,并写入文件系统当前目录。
softsdf
动态库提供了标准的 SDF 接口,包括密钥管理、数据加密解密、数字签名和消息摘要等功能。该库使用 GmSSL 库以软件方式实现密码计算和密钥存储。
softsdfinit
是一个用于初始化虚拟 SDF 设备的命令行工具。该工具生成对称密钥 KEK 和 SM2 密钥对,并将它们存储在文件系统当前目录下。
softsdfinit -kek num -key num -pass str
-kek num
:指定 KEK 的索引值,范围为 1 到 4096。-key num
:指定私钥的索引值,范围为 0 到 4096。-pass str
:用于访问私钥的密码字符串。
可以使用 -help
选项来查看工具的使用帮助:
$ softsdfinit -help
usage: softsdfinit -kek num -key num -pass str
Options
-kek num KEK index
-key num Private key index
-pass str Password for accessing the private key
Examples
$ softsdfinit -kek 1 -key 1 -pass P@ssw0rd
以下命令生成 KEK 索引为 1、私钥索引为 1,密码为 P@ssw0rd
的密钥和文件:
$ softsdfinit -kek 1 -key 1 -pass P@ssw0rd
- KEK 文件:以
kek-<index>.key
命名,明文存储。 - SM2 签名私钥文件:以
sm2sign-<index>.pem
命名,采用 PKCS#8 口令加密 PEM 格式存储。 - SM2 签名公钥文件:以
sm2signpub-<index>.pem
命名,PEM 格式存储。 - SM2 加密私钥文件:以
sm2enc-<index>.pem
命名,采用 PKCS#8 口令加密 PEM 格式存储。 - SM2 加密公钥文件:以
sm2encpub-<index>.pem
命名,PEM 格式存储。
首先以静态库的方式编译、安装GmSSL。从 https://github.com/guanzhi/GmSSL 下载GmSSL的源代码。在源代码目录执行如下操作:
mkdir build
cd build
cmake .. -DBUILD_SHARED_LIBS=OFF
make
make test
sudo make install
由于SoftSDF依赖GmSSL的静态库,因此应检查静态库/usr/local/lib/libgmssl.a
是否存在。默认情况下编译GmSSL只生成动态库,通过指定-DBUILD_SHARED_LIBS=OFF
可以生成静态库。
编译 SoftSDF 项目,生成 SDF 动态库和 softsdfinit
命令行工具:
mkdir build
cd build
cmake ..
make
将生成的 softsdfinit
工具和 softsdf
动态库拷贝到合适的位置,例如 /usr/local/bin
和 /usr/local/lib
。
以下命令生成 KEK 索引为 1、私钥索引为 1,密码为 P@ssw0rd
的密钥和文件:
$ softsdfinit -kek 1 -key 1 -pass P@ssw0rd
生成的文件包括:
kek-1.key
sm2sign-1.pem
sm2signpub-1.pem
sm2enc-1.pem
sm2encpub-1.pem
这些文件将存储在执行命令时的当前目录中。