国密SM9算法C++实现之二:测试工具

在网上找了个基于miracle库实现的SM9算法例子,经过完善后在win10的vs2015中写了个测试工具,主要的界面功能截图如下。

  • KGC密钥生成
    在上一篇介绍中已经说明,SM9中的密钥包括KGC的签名主密钥对和加密主密钥对、用户的签名私钥和加密私钥。同时用户的加密私钥又分为两种,一种是用在密钥解封和解密中,另一种是用在密钥交换中,二者都是加密私钥,只是KGC在生成私钥时使用的hid参数(私钥生成函数识别符)不同。
    需注意的是主私钥始终是个小于N的随机数,因此在用主私钥生成用户私钥时,要用签名主私钥生成用户的签名私钥;用加密主私钥生成用户的加密私钥。

国密算法实现工具类 java 国密算法验证工具_签名验签

  • 签名验签算法
    SM9签名时需要签名主私钥和签名者的签名私钥,而验签时则需要签名者的身份标识ID。签名值包含h和S两个部分。

国密算法实现工具类 java 国密算法验证工具_加密解密_02

  • 密钥封装解封算法
    SM9密钥封装时需要加密主公钥和解封者的ID,而解封时则需要解封者的加密私钥。封装算法产生一个用于解封算法所需的C和封装的密钥的明文K,K是提供给封装者用的,解封者通过C可解出K。
  • 国密算法实现工具类 java 国密算法验证工具_国密算法实现工具类 java_03

  • 加密解密算法
    SM9加密时需要加密主公钥和解密者的ID,而解密则需要解密者的加密私钥和解密者ID。同时,加解密中对于明文的加密方法分成两种,一种是使用分组密码算法(仅可用ECB模式,算法可使用SM4),另一种是基于KDF的序列密码算法(KDF可使用SM3)。

国密算法实现工具类 java 国密算法验证工具_密钥封装_04

  • 密钥交换算法
    SM9密钥交换涉及到发起方和响应方,计算共享密钥是需要一个加密主公钥、双方各自的ID和加密私钥。安装SM9标准的算法流程,可将第1~3步提取出来,作为密钥交换的前奏,这三步实际上是产生了一对G1上 临时公私钥,这对临时公私钥用在己方计算共享密钥中,同时,需要将临时公钥传给对方,对方在计算共享密钥时也需要。因为这个临时密钥对每次都是随机生成的,所以在测试中可以看到每次协商的结果是不一样的。

国密算法实现工具类 java 国密算法验证工具_SM9_05

另外需要注意的是,虽然在SM9算法中,四类算法(签名验签、密钥封装解封、加密解密、密钥交换)的主密钥对可以各不相同,但在同一类算法中主密钥必须是一样的。如在在密钥交换中,发起方和响应方的主公钥应该同一个,而且双方的加密私钥也应该是经由一个主私钥计算得来的。