mirror of
https://github.com/emmansun/gmsm.git
synced 2025-04-27 12:46:18 +08:00
doc: refine sm2/cfca documents
This commit is contained in:
parent
1b34247549
commit
36eaeabd95
42
docs/cfca.md
42
docs/cfca.md
@ -24,20 +24,30 @@ SADK(Security Application Development Kit)是CFCA推出的一套支持全平
|
||||
|
||||
#### SADK 3.2之前版本
|
||||
由于没有版本历史,所以这里只是大致推测(如果有不准确之处,敬请指出)。
|
||||
SADK 3.2之前的版本,只支持C1C2C3密文格式,而且C1只支持非压缩点格式,且输出忽略0x04这个点非压缩标识。所以如果和SADK 3.2之前的应用交互,加密输出格式只能选C1C2C3,且密文通过切片操作忽略首字节(0x04这个点非压缩标识);反之,如果是解密SADK 3.2之前的应用提供的密文,则要指定C1C2C3格式,同时,自己在密文前添加0x04这个点非压缩标识。**互操作的重要前提是知道对方的密文格式**。
|
||||
SADK 3.2之前的版本,只支持C1C2C3密文格式,而且C1只支持非压缩点格式,且输出忽略0x04这个点非压缩标识。
|
||||
|
||||
| 随机点 | 密文 | SM3哈希值 |
|
||||
| :--- | :--- | :--- |
|
||||
| C1 (64 bytes) | C2 | C3 (32 bytes) |
|
||||
|
||||
所以如果和SADK 3.2之前的应用交互,加密输出格式只能选C1C2C3,且密文通过切片操作忽略首字节(0x04这个点非压缩标识);反之,如果是解密SADK 3.2之前的应用提供的密文,则要指定C1C2C3格式,同时,自己在密文前添加0x04这个点非压缩标识。**互操作的重要前提是知道对方的密文格式**。
|
||||
|
||||
#### SADK 3.2+版本
|
||||
SADK 3.2之后的版本,支持下列SM2密文格式(encryptedType):
|
||||
* 0 - ASN.1编码格式 ```EncryptUtil.encrypt``` 方法默认
|
||||
* 2 - C1C3C2 格式,带0x04这个点非压缩标识
|
||||
* 4 - C1C3C2 格式,不带0x04这个点非压缩标识 (```EncryptUtil.encryptMessageBySM2 / EncryptUtil.encryptFileBySM2``` 方法默认)
|
||||
* 8 - C1C2C3 格式,带0x04这个点非压缩标识
|
||||
* 16 - C1C2C3 格式,不带0x04这个点非压缩标识
|
||||
|
||||
SADK 3.2之后的版本,解密过程:
|
||||
* 先尝试是否ASN.1格式,如果是,就解密;否则,
|
||||
* 当**C1C3C2,不带0x04这个点非压缩标识**的格式处理,如果解密成功,则结束;否则,
|
||||
* 当**C1C2C3,不带0x04这个点非压缩标识**的格式处理。
|
||||
| encryptedType | 输出格式 | 用本软件库如何解密 |
|
||||
| :--- | :--- | :--- |
|
||||
| 0 | ASN.1编码格式 ```EncryptUtil.encrypt``` 方法默认 | 正常解密 |
|
||||
| 2 | C1C3C2 格式,带0x04这个点非压缩标识 | 正常解密 |
|
||||
| 4 | C1C3C2 格式,不带0x04这个点非压缩标识 (```EncryptUtil.encryptMessageBySM2 / EncryptUtil.encryptFileBySM2``` 方法默认) | 添加0x04前缀后解密 |
|
||||
| 8 | C1C2C3 格式,带0x04这个点非压缩标识 | 指定解密Opts后解密 |
|
||||
| 16 | C1C2C3 格式,不带0x04这个点非压缩标识 | 添加0x04前缀,同时指定解密Opts后解密 |
|
||||
|
||||
|
||||
**SADK 3.2之后的版本,解密过程**:
|
||||
1. 先尝试是否ASN.1格式,如果是,就解密;否则,
|
||||
2. 当**C1C3C2,不带0x04这个点非压缩标识**的格式处理,如果解密成功,则结束;否则,
|
||||
3. 当**C1C2C3,不带0x04这个点非压缩标识**的格式处理。
|
||||
|
||||
从这个解密流程来看,SADK 3.2+可以解密 SADK 3.2之前的SM2密文,反之不行。
|
||||
|
||||
@ -45,18 +55,18 @@ SADK 3.2之后的版本,解密过程:
|
||||
|
||||
### SM2数字信封加解密
|
||||
互操作性问题主要出在:
|
||||
* 数据对称加密所用密钥的SM2密文格式。
|
||||
* 对称加密算法的OID。
|
||||
1. 数据对称加密所用密钥的SM2密文格式。
|
||||
2. 对称加密算法的OID。
|
||||
|
||||
#### SADK 3.2之前版本
|
||||
* 数据对称加密密钥的密文格式为**C1C2C3 格式,不带0x04这个点非压缩标识**。这个不符合《GM/T 0010-2012 SM2密码算法加密签名消息语法规范》以及《GB/T 35275-2017 信息安全技术 SM2密码算法加密签名消息语法规范》。
|
||||
* SM4-CBC的OID,使用了["SM4" block cipher](https://oid-rep.orange-labs.fr/get/1.2.156.10197.1.104),而不是["SMS4-CBC"](https://oid-rep.orange-labs.fr/get/1.2.156.10197.1.104.2)。
|
||||
1. 数据对称加密密钥的密文格式为**C1C2C3 格式,不带0x04这个点非压缩标识**。这个不符合《GM/T 0010-2012 SM2密码算法加密签名消息语法规范》以及《GB/T 35275-2017 信息安全技术 SM2密码算法加密签名消息语法规范》。
|
||||
2. SM4-CBC的OID,使用了["SM4" block cipher](https://oid-rep.orange-labs.fr/get/1.2.156.10197.1.104),而不是["SMS4-CBC"](https://oid-rep.orange-labs.fr/get/1.2.156.10197.1.104.2)。
|
||||
|
||||
本软件库的```pkcs7.EncryptCFCA```方法```DecryptCFCA```方法提供了SADK 3.2之前版本的信封加解密兼容性,记得cipher参数选择```pkcs.SM4```。
|
||||
|
||||
#### SADK 3.2+版本
|
||||
* 数据对称加密密钥的密文格式为**ASN.1编码格式**,这个符合《GB/T 35275-2017 信息安全技术 SM2密码算法加密签名消息语法规范》。
|
||||
* SM4-CBC的OID,使用了["SM4" block cipher](https://oid-rep.orange-labs.fr/get/1.2.156.10197.1.104),而不是["SMS4-CBC"](https://oid-rep.orange-labs.fr/get/1.2.156.10197.1.104.2)。
|
||||
1. 数据对称加密密钥的密文格式为**ASN.1编码格式**,这个符合《GB/T 35275-2017 信息安全技术 SM2密码算法加密签名消息语法规范》。
|
||||
2. SM4-CBC的OID,使用了["SM4" block cipher](https://oid-rep.orange-labs.fr/get/1.2.156.10197.1.104),而不是["SMS4-CBC"](https://oid-rep.orange-labs.fr/get/1.2.156.10197.1.104.2)。
|
||||
|
||||
本软件库的```pkcs7.EncryptSM```方法```Decrypt```方法提供了SADK 3.2+版本的信封加解密兼容性,记得cipher参数选择```pkcs.SM4```。
|
||||
|
||||
|
@ -230,6 +230,13 @@ func ExamplePrivateKey_Decrypt() {
|
||||
|
||||
具体API文档请参考:[API Document](https://godoc.org/github.com/emmansun/gmsm)
|
||||
|
||||
### 关于C1C2C3 和 C1C3C2
|
||||
目前有据可查的是,国家密码管理局2010版SM2标准还是用C1C2C3格式,到了2012年标准就改用了C1C3C2,并延续至今。
|
||||
其实C1C2C3是符合《SEC 1: Elliptic Curve Cryptography》(May 21, 2009 Version 2.0)Elliptic Curve Integrated Encryption Scheme 5.1.3中的密文输出描述:9. Output C = ($\overline{\text{R}}$, EM, D). Optionally, the ciphertext maybe output as C = $\overline{\text{R}}$ || EM || D. 这里 $\overline{\text{R}}$ 相对于C1, EM相对于C2, D相对于C3。
|
||||
|
||||
### 关于点到字节串的转换
|
||||
我没有找到到哪个文档写有固定64字节转换的。从国家密码管理局2010年版的《SM2椭圆曲线公钥密码算法》,到2012年的GM/T 0003-2012 SM2椭圆曲线公钥密码算法,再到GB/T 32918-2016 信息安全技术 SM2椭圆曲线公钥密码算法,都在第一部分第四章的“点到字节串的转换”有详细说明。这也符合《SEC 1: Elliptic Curve Cryptography》(May 21, 2009 Version 2.0)中2.3.3 Elliptic-Curve-Point-to-Octet-String Conversion的描述。
|
||||
|
||||
### 性能
|
||||
从**v0.27.0**开始,对大数据量的加解密做了优化处理,尤其是KDF并行计算。详情请参考[SM2加解密性能](https://github.com/emmansun/gmsm/wiki/SM2%E5%8A%A0%E8%A7%A3%E5%AF%86%E6%80%A7%E8%83%BD)。
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user