含泪入坑 GMSSL

个人博客

最近一次去理发,天桥底下手艺最好的发型师老张告诉我:不能再剪了,你的发量本来就不多。

是的,最近在搞商密(实情也可能是被商密搞),在存量系统里搞到头秃实属正常,不过这次不谈这个,写篇博客缓一缓。

首先是一点点基础 😉

在通用密码学领域,主要有 3 种技术:

  • 对称加密(Symmetric),使用一个密钥(一串很大的数字)将明文处理为密文,加密和解密使用同一个密钥,典型算法如 DES、三重 DES、AES。由于 DES、三重 DES、AES 都属于分组密码算法,只能加密固定长度的明文(DES 64 bit,AES 128 bit),而现实中经常需要处理超出分组长度的明文,因此必须进行迭代处理,一般有 6 种迭代模式可以选择:ECB(电子密码本模式)、CBC(密码分组链接模式)、CFB(密文反馈模式)、OFB(输出反馈模式)、CTR(计数器模式)、GCM(GMAC+CTR),此处不展开。一般不建议使用纯切块的 ECB 模式。
  • 非对称加密(Asymmetric),同样是将明文处理为密文,加密和解密使用不同的密钥,两个密钥是基于数学上的大数分解得到唯一成对的两个数字,一个作为公钥,一个作为私钥,使用公钥加密后的密文只有对应的私钥才能解密,典型算法如 RSA。
  • 单向散列(又称哈希),通过一个散列算法从明文得到散列值,但不能通过算法从散列值反向计算出明文(除非用哈希碰撞),典型算法如 MD5、SHA1、SHA224、SHA256、SHA384、SHA512、SHA3。散列值是明文的指纹。在学哈希表的时候大多数人就接触过,Java 里每个对象也有 hashCode 方法。另外,很多人会将哈希处理称为加密,这种说法显然是不正确的。

以上的技术,一般会用在哪里呢?

典型的应用领域为 TLS 层实现——可谓是集密码学技术之大成。我们日常访问各种网站时,可以留心一下浏览器地址栏最左边是否出现了一个🔒图标,有的话就用到了该技术。

在 TLS 层实现中,灵活地结合了非对称加密、对称加密、单向散列技术,可以简单地认为是通过非对称加密传递了对称密钥,然后使用对称密钥来加密传输数据,兼顾了安全性和处理效率。

还记得下面这张图吗?来自前面的一篇博文,出现在建立 HTTPS 连接过程中。我们来看看红框中的第 6 条记录—— TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256

  • ECDHE 指密钥交换采用 ECDHE 方式进行;
  • RSA 指身份认证采用 RSA 公钥密码算法;
  • AES 指传输数据时采用 AES 算法加密;
  • 128 指 AES 算法中用到的对称密钥长度为 128 位;
  • CBC 指迭代方式为 CBC 模式;
  • SHA256 指 MAC 或 PRF 算法的加密基元为 SHA256。

如果我们看第一条 TLS_RSA_WITH_AES_128_CBC_SHA256,则密钥交换和身份认证都是采用 RSA 公钥密码算法。

另一个比较火的应用领域就是区块链了,这个此处也不展开了。

为了对标国际通用密码学算法,国内搞出了 SM 系列算法,常用的包括 SM1/SM2/SM3/SM4/SM9。

  • SM1 为分组密码算法,算法细节目前未公开,由有资质的厂商用硬件来实现——也就是没有软实现,主要通过加密卡的形式提供服务。
  • SM2(GB/T 32918-2016)为公钥密码算法(也称非对称加密算法),可以部分替代 RSA。
  • SM3(GB/T 32905-2016)为密码哈希算法,可以代替 MD5/SHA1/SHA256。
  • SM4(GB/T 32907-2016)为分组密码算法,可以代替 AES/DES。
  • SM9 为基于身份的密码算法,用于 SSL VPN,可以建立类似 PKI/CA 的身份体系。

接下来可以动手了

一般国际通用的算法,openssl 项目里都有实现,操作系统安装了 openssl,各种上层应用就可以使用这些通用密码学算法。为了推广 SM 算法,类似的实现不可或缺。北大的关志研究员在 github 上开源了一个比较活跃的项目—Gmssl,一个类似 OpenSSL 的商密算法工具。看项目首页的介绍,现在已经搞到 3.0 版本了。

下载 GMSSL-3.0.0 项目到 Fedora Workstation 36 ,编译需要一些依赖,刚装的白板系统里没有,先装上

sudo dnf install cmake g++

编译安装步骤比较简单

# 进入 src 目录
mkdir build
cd build
cmake ..
make 
make test
sudo make install

执行 gmssl 可以试试各种商密算法功能。

[1] 报错 "CMAKE_CXX_COMPILER-NOTFOUND",应安装 g++

[2] 运行 gmssl,提示找不到 libgmssl.so.3,执行:sudo cp /usr/local/lib/libgmssl.so.3 /usr/lib/ && sudo ldconfig

[3] 编译提示找不到 CMakeLists.txt,在 /build 下执行:cmake build -S ../..

  • 3
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值