doc: update sm2/sm4 document

This commit is contained in:
Sun Yimin 2023-12-22 17:54:42 +08:00 committed by GitHub
parent 3ac62049d6
commit 93f3a5e020
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 6 additions and 5 deletions

View File

@ -12,7 +12,7 @@
您可以从[国家标准全文公开系统](https://openstd.samr.gov.cn/)在线阅读这些标准。 您可以从[国家标准全文公开系统](https://openstd.samr.gov.cn/)在线阅读这些标准。
## 概述 ## 概述
既然是椭圆曲线公钥密码算法它就和NIST P系列椭圆曲线公钥密码算法类似特别是P-256。NIST P 系列椭圆曲线公钥密码算法主要用于数字签名和密钥交换NIST没有定义基于椭圆曲线的公钥加密算法标准[SEC 1: Elliptic Curve Cryptography](https://www.secg.org/sec1-v2.pdf)第五章定义了“Elliptic Curve Integrated Encryption Scheme (ECIES)”不过应用不广。SM2公钥加密算法与其相似只是MAC不同。感兴趣的同学可以进一步对比一下 SM2既然是椭圆曲线公钥密码算法它就和NIST P系列椭圆曲线公钥密码算法类似特别是P-256。NIST P 系列椭圆曲线公钥密码算法主要用于数字签名和密钥交换NIST没有定义基于椭圆曲线的公钥加密算法标准[SEC 1: Elliptic Curve Cryptography](https://www.secg.org/sec1-v2.pdf)第五章定义了“Elliptic Curve Integrated Encryption Scheme (ECIES)”不过应用不广。SM2公钥加密算法与其相似只是MAC不同。感兴趣的同学可以进一步对比一下
| SM2 | SEC 1 | | SM2 | SEC 1 |
| :--- | :--- | | :--- | :--- |
@ -33,9 +33,10 @@ SM2公私钥对的话要么是自己产生要么是别的系统产生后
// It implemented both crypto.Decrypter and crypto.Signer interfaces. // It implemented both crypto.Decrypter and crypto.Signer interfaces.
type PrivateKey struct { type PrivateKey struct {
ecdsa.PrivateKey ecdsa.PrivateKey
...
} }
``` ```
SM2的公钥类型沿用了```ecdsa.PublicKey```结构。 SM2的公钥类型沿用了```ecdsa.PublicKey```结构。注意Go从v1.20开始,```ecdsa.PublicKey```增加了```func (k *PublicKey) ECDH() (*ecdh.PublicKey, error)```方法这个方法对SM2的公钥不适用SM2公钥请使用```func PublicKeyToECDH(k *ecdsa.PublicKey) (*ecdh.PublicKey, error)```。
### SM2公钥的解析、构造 ### SM2公钥的解析、构造
通常情况下公钥是通过PEM编码的文本传输的您可以通过两步获得公钥 通常情况下公钥是通过PEM编码的文本传输的您可以通过两步获得公钥
@ -166,7 +167,7 @@ func ExampleVerifyASN1WithSM2() {
这里有两个实现一个是传统实现位于sm2包中另外一个参考最新go语言的实现在ecdh包中。在这里不详细介绍使用方法一般只有tls/tlcp才会用到普通应用通常不会涉及这一块感兴趣的话可以参考github.com/Trisia/gotlcp中的应用。 这里有两个实现一个是传统实现位于sm2包中另外一个参考最新go语言的实现在ecdh包中。在这里不详细介绍使用方法一般只有tls/tlcp才会用到普通应用通常不会涉及这一块感兴趣的话可以参考github.com/Trisia/gotlcp中的应用。
## 公钥加密算法 ## 公钥加密算法
请牢记非对称加密算法通常不用于加密大量数据而是用来加密对称加密密钥我们在tlcp以及信封加密机制中能找到这种用法。 请牢记,非对称加密算法通常不用于加密大量数据,而是用来加密对称加密密钥,我们在**tlcp**以及**信封加密**机制中能找到这种用法。
SM2公钥加密算法支持的密文编码格式有两种 SM2公钥加密算法支持的密文编码格式有两种
* 简单串接方式: C1C3C2曾经老的标准为 C1C2C3 * 简单串接方式: C1C3C2曾经老的标准为 C1C2C3
@ -229,7 +230,7 @@ func ExamplePrivateKey_Decrypt() {
具体API文档请参考[API Document](https://godoc.org/github.com/emmansun/gmsm) 具体API文档请参考[API Document](https://godoc.org/github.com/emmansun/gmsm)
## 与KMS集成 ## 与KMS集成
国内云服务商的KMS服务大都提供SM2密钥我们一般调用其API进行签名和解密而验签和加密操作一般在本地用公钥即可完成。不过需要注意的是KMS提供的签名通常需要您在本地进行hash操作而sm2签名的hash又比较特殊下面示例供参考将在下个发布版本**v0.24.0**中公开此函数```sm2.CalculateSM2Hash``` 国内云服务商的KMS服务大都提供SM2密钥我们一般调用其API进行签名和解密而验签和加密操作一般在本地用公钥即可完成。不过需要注意的是KMS提供的签名通常需要您在本地进行hash操作而sm2签名的hash又比较特殊下面示例供参考自版本**v0.24.0**开始,您可以直接使用函数```sm2.CalculateSM2Hash```
```go ```go
func calculateSM2Hash(pub *ecdsa.PublicKey, data, uid []byte) ([]byte, error) { func calculateSM2Hash(pub *ecdsa.PublicKey, data, uid []byte) ([]byte, error) {
if len(uid) == 0 { if len(uid) == 0 {

View File

@ -44,7 +44,7 @@ Go语言实现的工作模式主要有三类
您如果使用实现了```cipher.BlockMode```接口的分组加密工作模式那您也必须与相关方协调好填充模式。JAVA库的对称加密算法字符串名就包含了所有信息譬如**AES/CBC/PKCS7Padding**。 您如果使用实现了```cipher.BlockMode```接口的分组加密工作模式那您也必须与相关方协调好填充模式。JAVA库的对称加密算法字符串名就包含了所有信息譬如**AES/CBC/PKCS7Padding**。
## 密文及其相关参数的传输和存储 ## 密文及其相关参数的传输和存储
如果是自描述的那肯定有相关标准定义相关ASN.1结构并且给分组密码算法、工作模式、填充方式都赋予一个OID。 如果是自描述的那肯定有相关标准定义相关ASN.1结构并且给分组密码算法、工作模式、填充方式都赋予一个OID。或者如hashicorp vault一个对称密钥确定了分组密码算法、工作模式、填充方式最终输出密文是密钥ID和原始密文的组合。
如果是内部服务之间,可能是在应用/服务级别自定义所使用分组密码算法、工作模式、填充方式的标识作为应用的METADATA也就是加密用的METADATA和密文分离。 如果是内部服务之间,可能是在应用/服务级别自定义所使用分组密码算法、工作模式、填充方式的标识作为应用的METADATA也就是加密用的METADATA和密文分离。