# 长安链支持后量子密码
量子计算机的发展以及Shor算法的提出,对RSA、Diffie-Hellman以及椭圆曲线等公钥密码算法提出了挑战。虽然现在还不具备建造大型量子计算机的条件,但其安全隐患已经引起了学术研究者和政府机构的担忧,NIST、IETF等机构或组织也正在积极开展后量子密码标准的制定工作。
长安链作为开源区块链底层平台,安全性依赖于公钥密码算法,其安全性也必然会受到量子计算机的威胁,提早布局并应用后量子密码对于长安链底层网络安全以及上层业务安全具有重要意义。
## 整体设计
### 算法实现层
后量子密码算法标准制定正在进行中,选型范围在NIST第三轮候选PQC算法,主要关注点:
1. 算法易用性
* 实现语言,接口是否足够简单
* 开源实现以及开源协议
2. 密钥大小以及签名大小
3. 算法性能(签名和验证性能)
长安链目前选型为Dilithium,Dilithium为后量子签名算法,在密钥大小和算法性能上具有一定优势。
### 接口、协议层
#### 接口实现
后量子算法实现长安链crypto.PrivateKey和crypto.PublicKey接口
#### x509支持后量子算法
**密钥、CSR和证书生成**
**密钥和证书解析** .
**公钥算法和签名算法OID**
OID:object identifier,在x509证书编码中,作为公钥算法和对应签名算法的唯一标识,需要进行注册管理,全球唯一。
```
// OIDs for signature algorithms
// RFC 5758 3.1 DSA Signature Algorithms
var (
oidSignatureECDSAWithSHA256 = asn1.ObjectIdentifier{1, 2, 840, 10045, 4, 3, 2}
oidSignatureSM3WithSM2 = asn1.ObjectIdentifier{1, 2, 156, 10197, 1, 501}
)
// RFC 3279, 2.3 Public Key Algorithms
var (
oidPublicKeyECDSA = asn1.ObjectIdentifier{1, 2, 840, 10045, 2, 1}
oidPublicKeySM2 = asn1.ObjectIdentifier{1, 2, 156, 10197, 1, 301, 1}
)
```
**举例**: `oidSignatureSM3WithSM2` and `oidPublicKeySM2` .
后量子算法Dilithium采用自定义方式,如下:
```golang
// 签名算法oid
oidSignatureDilithium = asn1.ObjectIdentifier{1, 2, 840, 20000, 1,1}
// 公钥算法oid
oidPublicKeyDilithium = asn1.ObjectIdentifier{1, 2, 840, 20000, 2, 1}
```
### 证书生成工具
使用cryptogen工具生成后量子密码x509测试证书。crypto_config_template.yaml中新增后量子算法配置选项,如下:
```sh
pk_algo: dilithium2 #dilithium2为具体的后量子算法名称,与SM2、NIST256类似
```
## 参考
1. RFC#3279文档:https://www.ietf.org/rfc/rfc3279.txt
2. RFC#5758文档:https://www.ietf.org/rfc/rfc5758.txt
3. OID Repository: http://oid-info.com
4. Object Identifier:https://www.alvestrand.no/objectid