SM2 国密算法被 Linux 内核社区接受
访问: 2020年天猫双11领券入口 全球好货10月21日起开始预售 京东双十一领券入口:三大主场每满300减40 密码算法是保障信息安全的核心技术,尤其是最关键的银行业核心领域长期以来都是沿用 3DES、SHA-1、RSA 等国际通用的密码算法体系及相关标准。 2010 年底,国家密码管理局公布了我国自主研制的“椭圆曲线公钥密码算法”(SM2 算法)。为保障重要经济系统密码应用安全,国家密码管理局于 2011 年发布了《关于做好公钥密码算法升级工作的通知》,明确要求“自 2011 年 3 月 1 日起,在建和拟建公钥密码基础设施电子认证系统和密钥管理系统应使用国密算法。自 2011 年 7 月 1 日起,投入运行并使用公钥密码的信息系统,应使用 SM2 算法。” 自 2012 年以来,国家密码管理局以《中华人民共和国密码行业标准》的方式,陆续公布了 SM2/SM3/SM4 等密码算法标准及其应用规范。其中“SM”代表“商密”,即用于商用的、不涉及国家秘密的密码技术。 这其中值得我们关注的主要是以下公开的算法:
SM2 进阶 Linux 内核之路 目前 Linux 内核已经较好的支持了 SM3 和 SM4 算法,这得益于无线局域网标准的广泛使用。但 SM2 算法和国密证书迟迟没有得到支持,也就无法基于国密来建立全栈可信和内核中的完整性验证,因此在内核中支持这一套体系也变得迫切起来。整个规划是:在内核中支持 SM2 算法和国密证书,在内部业务率先应用起来后,最终推进到社区。 整个流程下来,诸多不顺,权且记录下来。 第一回 有了规划,接下来就是考虑如何实施。但凡密码学算法,都会先考虑是否可以从 openssl 做移植。幸运的是,openssl 对 SM2/3/4 支持得非常好,椭圆曲线算法的实现久经考验,非常成熟,而且最新版本也完整支持了国密证书。不幸的是,openssl 的各个模块之间耦合度很高,要实现 SM2 和国密证书,需要移植 openssl 架构和基础设施代码,包括 BIGNUM、ECC、X509 等。这个工作量无疑是巨大的,即便实现了,这种方式也很难被社区接受,再三考虑权衡后,果断放弃了这条"捷径"。 第二回 发现了一个令人惊喜的事实:内核中已经有了一个椭圆算法的基础实现(crypto/ecc.c),何不尝试基于这个算法来做呢?于是参照 SM2 规范开始编码,但结果有点遗憾,这个椭圆算法在 SM2 上居然失效了,连最基本的点乘结果都是错的!纳尼?剧本不应该是这样的。于是发邮件咨询该算法的一个资深开发者,很快就得到了下面的回复(感叹天下还是好心人多):
总结原因:这个算法是经过高度优化的算法,是精确适配过 NIST 和 ECRDSA 椭圆曲线参数的,并不一定适合国内的 SM2 曲线参数,看来这条路是走不通了…… ……哭泣中,别理我。 ……擦干眼泪,看成败,人生豪迈,不过是从头再来…… 第三回 经过反复探索,发现内核中 RSA 算法是基于一个 mpi(高精度整数)库实现的,这个库来源于 libgcrypt(这是知名隐私保护软件 GnuPG 的底层算法实现)。内核中已经实现了一个早期版本的 mpi,当时就是为了实现 RSA 引入的。现在的 libgcrypt 已经有了完整的椭圆曲线基础算法,于是抱着试试看的心态基于 libgcrypt 测试 SM2 算法曲线,苍天保佑,这次的惊喜没有变成惊吓,实验结果与 SM2 规范一致。 第四回 libgcrypt 中的 ECC 算法是个通用的算法,实现耦合度低。于是有了一个想法,可以尝试先在 libgcrypt 中实现 SM2,小试牛刀之后再把这一套东西全部移植到内核,进一步推进到社区,看起来这也是能被社区接受的方式。有了计划后,索性摆个安逸的造型,庄严肃穆地将双手放在键盘上,让思维随着手指自然流淌,接下来的开发调试就比较顺利了,很快便有了公钥算法的四件套:加密,解密,签名,验签。一鼓作气把这些实现提交到了 libgcrypt 社区,经过两轮的审核再修改之后,最终 SM2 算法作为 ECC 的一个子算法被社区接受,这里要感谢 libgcrypt 的维护者之一的 NIIBE Yutaka,耐心友好,对中国传统文化也很了解。整体过程比较顺利,表过不提。附上相关提交: http://git.gnupg.org/cgi-bin/gitweb.cgi?p=libgcrypt.git;a=search;s=Tianjia+Zhang;st=author 第五回 趁热打铁,由于内核中的 lib/mpi 库是一个较老的版本并且是为 RSA 服务的,相对于 libgcrypt 中的 mpi,是一个阉割的版本,需要移植缺失的函数以及 ECC 算法,这没什么技术难度,却也是一个精细活,工作量也不小。在实践中,把实现 SM2 的过程中所缺失的东西都移植过来,很快便有了相应的 SM2 算法和国密证书的实现。再经过几轮打磨,并做了充分的测试后,就有了最初的这组补丁: https://lkml.org/lkml/2020/2/16/43 第六回 中国古语曰过,一鼓作气,再而衰,三而竭,事情的进展再次遇到阻碍。Linux 内核比不得专用的密码学库,对于这么一个不怎么知名的算法,社区并没有表现出什么兴趣,甚至鲜有人问津,最终以没有实际应用场景而被拒绝。事情当然不能就这么结束,考虑到代码量大,维护者审核意愿低,果断裁剪掉了 SM2 的加解密和签名,只保留了支持国密证书必要的验签功能,后来陆陆续续又做了一些小修小补,同时给 IMA 的上游做了国密算法的增强以便将国密功能在 IMA 场景的应用作为实际案例。同时,随着跟相关开发者和维护者不断的软磨硬泡,不断地发送新的补丁,最后甚至都摸透了维护者习惯性的回复时间和补丁的合入规律,持续地缓慢推进 SM2 进入社区的步伐。这期间没有波澜壮阔的故事,也没有狗血的剧情,balabalabala……,省略 第七回 (编辑:应用网_阳江站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |