基于SM2算法的无证书及隐式证书公钥机制
详细细节可参考:https://blog.youkuaiyun.com/samsho2/article/details/138483765
概述
https://baijiahao.baidu.com/s?id=1652795603948747465&wfr=spider&for=pc
非对称密码系统中,如何将用户的身份和密钥对应起来,是一个需要解决的关键问题。目前主流的有三种解决方案:
- 采用证书机制实现用户的身份和密钥之间的安全对应,一般都采用公钥基础设施(PKI)来实现,需要依赖具有公信力的第三方可信中心实现(CA)。
- 基于标识的密码技术(Identity-Based Cryptography:IBC)。为了降低公钥系统中密钥管理和使用的复杂性,Shamir在1984年提出了基于标识的密码机制。这种系统中用户的标识可以作为用户的公钥,用户不需要申请和交换证书,而是直接使用标识进行密码运算,从而解决公钥真实性问题,极大地简化了密钥系统管理的复杂性。这类系统中用户的私钥由系统中的一受信任的第三方(密钥生成中心:KGC)使用标识私钥生成算法计算生成。这些标识可以具有任意的格式、属性,可以是常用的用户标识如邮件地址、手机号码、身份证号码;在物联网中可以是设备标识、Handle码、OID等;还可以是数据安全控制策略的形式化编码、生物特征信息、甚至是标识属性集等,特别适合基于标识、基于属性的权限访问控制和数据安全保护。
- 基于无证书密码体制。该体制的代表有1991年Girault 提出的“隐式证书”密码系统(Implicit Certificate)和Al-Riyami和Paterson在2001年提出的无证书公钥密码体制(AP-CL-PKC)。这种密码体制介于传统PKI和标识密码技术之间。这种机制中用户的私钥由两个秘密因素决定 :一个是从KGC获取的与用户身份相关的密钥分片,另一部分是由用户自己生成的密钥分片。从一个密钥分片无法计算出另外一个,因此KGC无法计算出用户的私钥。同时,即便攻击者成功的利用自己的公钥替换了用户的公钥,却仍然无法伪造用户的签名。因此这类系统在签名应用中具有无证书管理、系统轻量、通信开销低、具有强不可抵赖性等众多优点,非常适合物联网等领域的身份认证应用。
可以发现,无论哪一种方案,归根到底还是需要可信的信任中心,可信第三方是信任建立的前提条件。
基于SM2算法的无证书及隐式证书公钥机制
整体流程
系统中涉及两个角色,密钥生成中心(Key Generate Center,KGC)和普通用户。
-
KGC:与证书体系中的CA对应,辅助用户生成无证书体系中的密钥,给用户颁发密钥分片,默认可信,且公钥公开。
- 公钥: P P U B P_{PUB} PPUB
- 私钥: m s ms ms
-
用户:基于KGC颁发的密钥分片生成自身的私钥,执行加密、解密、签名、验签功能
- 无证书身份公钥: W A W_{A} WA
- 无证书身份私钥: d A d_{A} dA
- 身份ID: I D A ID_{A} IDA
总结一下KGC辅助用户生成无证书密钥的逻辑(细节不再展示,参考博文里面写的很详细):
- KGC模块初始化自身的主公私钥 P P U B P_{PUB} PPUB、 m s ms ms,并公开公钥 P P U B P_{PUB} PPUB,且默认可信
- 用户生成临时公私钥 d A ′ {d_{A}}' dA′、 U A U_{A} UA
- 用户将身份信息 I D A ID_{A} IDA和临时公钥 U A U_{A} UA提交给KGC
- KGC生成对应该用户的声明公私钥 W A W_{A} WA、 w w w
- KGC基于声明的公钥和用户身份信息生成类似于schnorr签名中的“挑战”
- KGC基于声明的公钥和主私钥生成用户的密钥分片,类似于schnorr签名中的“承诺”
- 用户收到临时公钥和私钥分片后,生成用户真正的私钥 d A d_{A} dA和公钥 P A P_{A} PA
- 私钥和公钥可以用于后续的加密、解密、签名、验签,基于KGC的主公钥
- 同时用户身份信息也关联了私钥分片,防止攻击
加密、解密、签名、验签
还想深究一下具体的加密、解密、签名、验签是如何实现的:
加密
加密方使用根据用户的声明公钥 W A W_{A} WA计算出用户的公钥 P A P_{A} PA,然后再加密数据,同标准SM2一致。
解密
用户使用自己的私钥 d A d_{A} dA解密,同标准SM2一致。
签名
在计算摘要的时候加入了无证书密钥生成中心的主公钥 P P U B P_{PUB} PPUB和用户无证书声明公钥 W A W_{A} WA,计算签名的时候使用的是用户的私钥 d A d_{A} dA。其余步骤同SM2一致。
验签
根据声明公钥和主公钥计算出用户的公钥 P A P_{A} PA,然后用于验证签名。其余步骤同SM2一致。