doc: refine sm2/cfca documents

This commit is contained in:
Sun Yimin 2024-06-12 10:40:00 +08:00 committed by GitHub
parent 1b34247549
commit 36eaeabd95
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 33 additions and 16 deletions

View File

@ -24,20 +24,30 @@ SADKSecurity 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```。

View File

@ -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.0Elliptic 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)。