最近一次去理发,天桥底下从业数十年、手艺最好的发型师老张告诉我:发量不多,不能再剪了。

我:。。。

——–

最近在搞商密(也可能是被商密搞),搞到头秃实属正常,写篇博客缓一缓。

首先是一点点基础 😉

在通用密码学领域,主要有 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 ../..

分类: CODE

0 条评论

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注