记录黑客技术中优秀的内容,传播黑客文化,分享黑客技术精华

基于 CNG API 实现国密算法注册及应用

2022-05-12 18:05

摘 要:

下一代加密技术接口是微软在 Windows 下实现的取代上一代加密应用程序接口的密码服务接口。其目的是提供一种可扩展的方式以支持各种应用程序和未知的密码算法,以便不同的算法、协议向操作系统注册,并对应用程序提供统一的调用接口,应用程序无需改造即可支持对新算法的使用。研究了基于下一代加密技术接口在操作系统中注册国密SM2、SM3 算法,完成解析和验证国密 SM2 证书,实现了国密算法在系统中的注册及应用。


内容目录:
1 CNG 简介

2 国密算法在系统中的注册

2.1 算法 OID 的注册

2.2 算法 Provider 的注册

2.3 Provider 库的实现

2.3.1 SM3 的实现

2.3.2 SM2 的实现

3 国密算法的实际应用

4 结 语

目前,国内主流企业所采用的密码算法都是国际公开算法。国家密码管理局早在 2012 年起就颁布了一系列的商密算法实现及应用的规范文件。国内的一些信息安全厂商和一些开源程序,例如,基于开放式安全套接层协议(Open Secure Sockets Layer,OpenSSL)实现的支持国密算法和标准的 OpenSSL 分支(GmSSL)和天安 版 国 密 OpenSSL(TaSSL) 也 基 于 该 系 列 规范实现了国密标准的对称、非对称、散列算法及接口规范。但基于该规范的实现与操作系统的实现有较大差异,目前,国密算法 SM2 虽已被纳入国际标准,但在各大操作系统上依然没有内置该算法的实现。在实际使用时仍是由应用程序开发人员使用各厂商提供的算法库来实现对国密算法的使用。一些利用操作系统应用程 序 接 口(Application Programming Interface,API)实现密码算法调用的应用程序将面临重新开发和定制的风险。同时,证书信任是使用安全套接层(Secure Sockets Layer,SSL)的基本要求,各种浏览器、使用 SSL 的客户端在面对不信任的证书时都会弹出警告,甚至是直接断开连接,但目前系统中并没有实现 SM2 证书的验证,导致无法对某些安全性要求较强的业务进行访问。因此,本文通过研究微软提出的新一代密码应用服务接口,实现国密算法在Windows 系统中的注册及使用。在不修改原应用程序的情况下,使应用程序正确调用新注册的国密算法以实现密码服务功能,实现国密算法在 Windows 操作系统中的无缝集成,完成国密证书在 Windows 系统中的直接验证及 P12 格式的国密证书导入。

CNG 简介

下一代加密技术接口(Cryptographic Next Generation API,CNG API)是微软在 Windows Vista 及之后的操作系统中实现的取代上一代CryptoAPI 的密码服务接口。相对于上一代的CryptoAPI,它具备的优势如下:(1)更灵活的配置模型,支持更多的密钥存储配置、算法配置、随机数发生器等;(2)完全兼容上一代CryptoAPI 接口;(3)支持内核模式下的算法配置;(4)支持自定义的证书格式;(5)支持 SSL/ 安全传输层(Transport Layer Security,TLS)的协议配置。在 Windows Vista 及之后的操作系统中,默认使用的密码服务接口已经替换为 CNG API,CryptoAPI 也只是对 CNG 的封装调用。

CNG 允许密码服务实现方以“Provider”的形式向系统添加密码服务实现,并向开发者提供软件开发工具包(Software Development Kit,SDK),极大地方便了密码服务提供商向系统注册自己专有算法或者对密码硬件的调用。CNG允许第三方密码服务提供商提供的程序的主要功能如下文所述。(1)密钥存储实现。第三方提供商以自己的方式实现密钥的管理、产生、销毁、使用等。例如,实现密钥存储可通过结合密码硬件来实现私钥的保存和使用,使私钥既不出硬件,又能通过 Windows 标准接口供应用程序使用。密钥存储仅支持在用户模式下注册。(2)密码算法实现。第三方提供商可通过注册密码算法来实现对称、摘要、非对称加解密、签名验签、随机数发生器、密钥衍生等功能。通过该方式,可以将一些专用的非公开算法方便地新增到系统中并由原生的 Windows API使用。密码算法可在用户模式下和内核模式下进行注册,在内核模式下注册后,驱动程序中也可以使用用户自定义的密码算法。(3)密钥衍生、协商实现。第三方提供商可注册自己的密钥衍生、密钥协商实现类。(4)SSL 协议实现。第三方提供商可注册自己的协议实现类,实现 TLS 协议交互过程中使用私有算法或者数据格式的认证、密钥协商、加密等功能。

国密算法在系统中的注册

在系统中注册自定义算法时需要先注册一个 Provider,一个 Provider 可包含多种算法实现的接口。Provider 及支持的接口关系如图 1 所示。

图 1 接口关系

由 Provider 的结构可以看出它涵盖了密码算法的所有功能,通过接口将算法注册到系统后,即可实现算法接口的相关功能。本文通过将 SM2 算法、SM3 算法注册到 Windows操作系统中,实现国密证书在 Windows 中的识别、签发、验证。此外,还需要实现随机数发生接口,以产生符合国密随机数检测规范的随机数。

2.1 算法 OID 的注册

在数字证书中,以对象标识符(Object Identifier,OID)来唯一标识一种算法。密码服务提供商通过 Windows 标 准 接 口 CryptRegisterOIDInfo 来 实现密码算法 OID 向操作系统的注册,当注册算法时,在结构 CRYPT_OID_INFO 中填写对应的算法所属的组(国密各算法及参数的 OID 可在标识规范中查询)。根据实际需要,SM3 所属组为 BCRYPT_HASH_INTERFACE,SM2 作为公钥算法时,其所属的组为 CRYPT_PUBKEY_ALG_OID_GROUP_ID;SM2 作为签名算法时,其所属的组为 CRYPT_SIGN_ALG_OID_GROUP_ID。支持 SM2 算法时,还需要根据用途填充 OID 扩展参数,用作加密和验签时,则扩展参数为 3 个整型:第一个参数为公钥用途,加密(CRYPT_OID_PUBKEY_ENCRYPT_ONLY_FLAG)、验签(CRYPT_OID_PUBKEY_SIGN_ONLY_FLAG)或两者都支持;第二个参数为公钥所属算法的标识;第三个参数为椭圆曲线算法(Elliptic Curve Cryptography,ECC) 公 钥 模 长。用 作 签名时,则扩展参数为整型,值恒为 CALG_OID_INFO_PARAMETERS。SM2 算 法 OID 注 册 成 功后,在 Windows 下双击国密 SM2 证书,可在证书详细信息里面查看到公钥、公钥参数、签名算法等值显示为 SM2、SM3 等注册过的值 [1]。注册算法 OID 前,系统则只能显示出算法 OID对应的可识别文本信息,因算法的实现还需要通过 Provider 的注册后,才会被系统调用。在Windows 下未注册 OID 和已注册 OID 的国密证书显示对比如图 2 所示。

图 2 OID 注册前后证书显示对比

2.2 算法 Provider 的注册

CNG 开发包提供了 BCryptRegisterProvider 函数用于向系统中注册 Provider,本文讨论的是应用层的算法注册,因此必须在 BCryptRegisterProvider函数的 PCRYPT_PRVIDER_REG 参数中填充 SM2和 SM3 算法,指定 Provider 所处的动态库文件名称以及 Provider 提供的算法类型。Provider 注 册 成 功 后, 还 需 要 向 配 置 节点中添加各个算法的配置,CNG 开发包提供BCryptAddContextFunctionProvider 函 数 用 于 向Provider 中添加算法实现。OID、Provider 及配置的算法在 CNG 开发包中也提供了相应的实现,若操作系统中不再需要新注册的算法,则调用函数 CryptUnregisterOIDInfo 卸载已注册的 OID,调用函数 BCryptUnregisterProvider卸载已注册的 Provider。

2.3 Provider 库的实现

Provider 以动态库的形式提供算法,为保证Windows 操作系统正确使用 Provider 所提供的算法,动态库必须实现导出函数来支持注册到Provider 中的算法,导出的函数及含义如表 1所示。

表 1 Provider 导出函数及含义

根据微软提供的 CNG 开发包及其示例,在Provider 中实现了 SM3 算法、SM2 算法及其相关函数接口。Windows 应用程序调用的算法实际是由 Provider 所提供的算法接口实现的。

2.3.1 SM3 的实现

Provider 中 实 现 杂 凑 功 能 的 函 数 接 口 GetHashInterface 原型如下:

在 GetHashInterface 的实现代码中以 SM3 的实现函数填充返回的结构体列表 ppFunctionTable,其对应的回调函数即可实现 SM3 在系统中的注册。完成 SM3 算法注册和相应的功能后,可通过如下的示例代码进行验证:

根据验证程序的输入和输出结果,与国密SM3 密码杂凑算法规范对比,两者结果一致 。

2.3.2 SM2 的实现

Provider 中实现 SM2 的签名 / 验签、加密 / 解密以及公私钥的导入和密钥对产生等,需在 CNG中分别对相应结构体进行填充。签名以结构体BCRYPT_SIGNATURE_FUNCTION_TABLE 定义各个 操 作 回 调, 非 对 称 加 密 以 结 构 体 BCRYPT_ASYMMETRIC_ENCRYPTION_FUNCTION_TABLE定义各个操作回调。Provider 中实现 SM2 签名验签的接口原型如下:

在以上 GetSignatureInterface 的实现代码中,以 SM2 的 实 现 函 数 填 充 返 回 的 结 构 体 列 表ppFunctionTable,其对应的回调函数即可实现 SM2算法的签名、验签功能在系统中的注册。然后应用程序采用 Windows 系统标准的 CNG API 完成对SM2 算法的调用,调用流程与 SM3 类似,细节可参考 CNG 开发包提供的示例以及帮助文档。

根据密码行业标准 GM/T 0009—2012《SM2 密码算法使用规范》,使用 SM2 的签名功能需利用签名方的用户身份标识和签名方公钥,通过 SM3 运算得到 Z 值 ,再将 Z 值与待签名消息通过 SM3 计算哈希后签名 / 验签 。该使用规范为 SM2 特有,公开算法无此应用方式。因此,应用程序除通过扩展 BCRYPT_SIGNATURE_FUNCTION_TABLE 中的BCryptExportKeyFn 接口外,还需扩展一个 BCRYPT_SM2Z_BLOB=L"SM2ZBLOB" 的 数 据 类 型。通 过 调用 BCryptExportKey,并指定数据类型为 BCRYPT_SM2Z_BLOB,可计算出公钥的 Z 值,应用程序将此Z 值与待签名数据计算哈希后再进行签名 / 验签。

国密算法的实际应用

将国密算法在操作系统中注册完成后,以中国金融认证中心(China Financial Certification Authority,CFCA)提供的 SM2 测试证书链为例,验证此国密 SM2 证书能否通过验证。

在 Windows 系统中,证书都是通过 WinVerifyTrustEx 接口函数进行验证的,在该接口里面内置有证书解码、证书完整性、有效性、证书链校验等函数。基于 SM2 算法的应用规范 ,在对数据进行签名 / 验签时,先使用签名公钥与用户标识计算 Z 值,然后与源数据合并计算 SM3,最后对 SM3 的结果进行签名 / 验签。

通过对 Windows 系统中证书验证的过程进行分析,对证书完整性和有效性的验证实际就是直接使用 CryptDecodeObjectEx 接口对证书解码,然后根据解码后的数据计算哈希值,再将哈希值验签。该操作流程与 SM2 的使用规范不符,无法通过 SM2 的验签。为符合 SM2 使用规范,需要在证书解码后的数据前面添加签发者 Z 值。Windows 系统提供 CryptInstallOIDFunctionAddress函数用于注册自定义的编解码函数,通过该函数对 X509_ASN_ENCODING 编码类型注册自定义编解码。从签名算法使用 SM2 的证书获取到签发者的公钥,并计算 Z 值,再与系统自动编 /解码后的证书数据合并,以使签名 / 验签的数据符合 SM2 使用规范。

分别使用 CFCA 提供的测试证书 SM2 的根证书、下级证书为例,验证未注册国密算法的Windows 操作系统和已注册国密算法的操作系统,通过直接双击 SM2 证书文件得到如图 3、图 4 和图 5 的结果。

通过图片可直观地看出:在系统中注册国密算法后,操作系统自动实现了对国密算法证书的验证。使用 Windows 的标准接口 WinVerifyTrustEx验证证书,同样能得到证书验证通过的结果。

图 3 未注册算法时根证书无法通过验证

图 4 算法注册后根证书通过验证

图 5 算法注册后下级证书通过验证

结 语

本文通过对 Windows 系统下新一代密码接口的功能分析,完成了国密 SM2、SM3 算法向系统中注册,同时实现了对国密算法签发的证书验证,为进一步实现国密 SSL 协议在 Windows 系统中的集成奠定了基础,同时也为其他非公开算法向系统中注册提供了一种实现思路。

引用本文:夏凡 , 文刚 , 朱红宏 . 基于 CNG API 实现国密算法注册及应用 [J]. 信息安全与通信保密 ,2022(4):71-78.

作者简介 >>>
夏 凡,男,学士,工程师,主要研究方向为计算机应用、信息安全;
文 刚,男,学士,工程师,主要研究方向为计算机应用、信息安全;
朱红宏,男,硕士,工程师,主要研究方向为计算机应用、信息安全。

选自《信息安全与通信保密》2022年第4期(为便于排版,已省去参考文献)

商务合作 | 开白转载 | 媒体交流 | 理事服务 
请联系:15710013727(微信同号)
《信息安全与通信保密》杂志投稿
联系电话:13391516229(微信同号)
邮箱:xxaqtgxt@163.com   
《通信技术》杂志投稿
联系电话:15198220331(微信同号)
邮箱:txjstgyx@163.com
谢谢您的「分享|点赞|在看 」一键三连

知识来源: id=ddee961497f07360632c6c59556b4868&source_url=https%3A%2F%2Fmp.weixin.qq.com%2Fs%2FDOH7RlsJRQlWQ2yhJ2T4ZQ

阅读:269915 | 评论:0 | 标签:API

想收藏或者和大家分享这篇好文章→复制链接地址

“基于 CNG API 实现国密算法注册及应用”共有0条留言

发表评论

姓名:

邮箱:

网址:

验证码:

黑帝公告 📢

十年经营持续更新精选优质黑客技术文章Hackdig,帮你成为掌握黑客技术的英雄

🙇🧎¥由自富财,长成起一↓

标签云 ☁

本页关键词 💎