From eaa25fed46980098b4217b916de30de4d9b77f1d Mon Sep 17 00:00:00 2001 From: Zhi Guan Date: Mon, 13 Feb 2017 18:02:15 +0800 Subject: [PATCH] =?UTF-8?q?Destroyed=20SM2=E6=A4=AD=E5=9C=86=E6=9B=B2?= =?UTF-8?q?=E7=BA=BF=E5=85=AC=E9=92=A5=E5=AF=86=E7=A0=81=20(markdown)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- SM2椭圆曲线公钥密码.md | 75 ------------------------------------------ 1 file changed, 75 deletions(-) delete mode 100644 SM2椭圆曲线公钥密码.md diff --git a/SM2椭圆曲线公钥密码.md b/SM2椭圆曲线公钥密码.md deleted file mode 100644 index 9514fce..0000000 --- a/SM2椭圆曲线公钥密码.md +++ /dev/null @@ -1,75 +0,0 @@ -## SM2数字签名 - -SM2数字签名方案中被签名的杂凑值不仅仅是消息的杂凑值,而是签名者身份信息串联上消息的杂凑值,其中签名者身份信息是签名者的可辨别标识字串、椭圆曲线方程系数、生成元和签名者公钥串联后字串的杂凑值。SM2标准中并未说明签名者的可辨别标识字串格式及获得方式,应用可以采用X.509证书中的Subject字段、CN (CommonName)或自行规定。 - -### SM2参数选择 - -SM2标准中规定采用256比特的椭圆曲线域参数,并采用256比特的密码杂凑算法,并规定某些步骤中须采用SM3。GmSSL的实现支持灵活的参数设定,并支持内置的所有密码杂凑算法,因此应用可以选择安全程度更高的椭圆曲线域参数和密码杂凑算法,如521比特的域参数和SHA-512算法。 - - -## SM2公钥加密 - -SM2公钥加密算法国密公钥加密标准之一,由国家密码管理局与2010年12月公布。SM2公钥加密是一种椭圆曲线公钥加密方案,具体规范可参考《SM2椭圆曲线公钥密码算法 第4部分:公钥加密算法》文本。 - -SM2公钥加密适用于加密长度较短的数据,如会话密钥和消息报文。SM2公钥加密不仅对数据加密,还提供防篡改的特性,即被篡改的或伪造的密文可以在解密的过程中被检查发现,因此通过SM2公钥加密的消息无需格外的校验机制。消息经过SM2公钥加密后长度会增加不到100字节的长度,加密方在准备缓冲区时需要加以留意。 - -GmSSL提供了SM2公钥加密的实现。应用应优先通过EVP API调用SM2公钥加密的功能,具体接口使用方法请参考手册页中的`EVP_PKEY_encrypt(3)`、`EVP_PKEY_decrypt(3)`等相关函数。 - -### 密文编码问题 - -SM2密文由C1、C2、C3三部分构成,如何对SM2密文进行编码在已经公布的两个标准中有所不同,在早期公布的《SM2椭圆曲线公钥密码算法 第4部分:公钥加密算法》中,SM2密文中的三部分依次输出,没有采用如Tag-Length-Value形式的编码,我们称其为Plain编码。在之后公布的GM/T国标中,SM2密文采用ASN.1/DER方式编码。 - -GmSSL通过`SM2_CIPHERTEXT_VALUE`对象来表示密文数据结构,函数`SM2_do_encrypt()`和`SM2_do_decrypt()`可以生成`SM2_CIPHERTEXT_VALUE`对象及对其解密,函数`SM2_CIPHERTEXT_VALUE_encode()`和`SM2_CIPHERTEXT_VALUE_decode()`实现该对象的Plain编解码。GmSSL预计还会通过函数`i2d_SM2_CIPHERTEXT_VALUE()`和`d2i_SM2_CIPHERTEXT_VALUE()`实现该密文对象的ASN.1/DER编解码,以支持最新的GM/T国密标准。 - -GmSSL的`SM2_encrypt()`和`SM2_decrypt()`在加解密的同时也完成`SM2_CIPHERTEXT_VALUE`对象的编解码。目前采用Plain编解码,在相应功能完成后会替换为ASN.1/DER编码方案。 - -## SM2密钥交换 - - -## 推荐椭圆曲线参数 - -在椭圆曲线密码应用中,通信双方需要预先商定一组称为椭圆曲线域参数的系统参数。椭圆曲线域参数生成需要大量的计算,耗时较长,一旦生成之后可以长期、广泛地使用,因此通常由可信的机构经过反复生成不同的椭圆曲线域参数并挑选出安全性和性能俱佳的公布为标准(推荐参数),椭圆曲线密码库和应用则会以硬编码的方式内置这些参数。 - -SM2标准中给出了一个推荐的256比特的素数域椭圆曲线域参数,GmSSL内置了这个椭圆曲线域参数,命名为`sm2p256v1`。通过GmSSL命令行可以显示该域参数的详细内容如下: - -``` bash -$ gmssl ecparam -text -noout -name sm2p256v1 -param_enc explicit -``` - -通过`ecparam`命令可以生成该域参数上的SM2公私钥对。注意,SM2公私要钥对就是标准的椭圆曲线公私要钥对,即可以用于SM2数字签名、密钥交换和公钥加密,也可以用于ECDSA数字签名、ECDH密钥交换和ECIES公钥加密。生成密钥对的命令如下: - -``` bash -$ gmssl ecparam -genkey -name sm2p256v1 -out sm2key.pem -``` - -如果用户希望在其他支持椭圆曲线密码(但不支持SM2推荐域参数)的密码库或应用中使用这条曲线,可以通过`ecparam`命令将该域参数导出为标准的PEM格式文件,并导入到目标应用中。 - -``` bash -$ gmssl ecparam -name sm2p256v1 -param_enc explicit -out sm2p256v1.pem -``` - -## 编程访问SM2推荐椭圆曲线参数 - -GmSSL内置的SM2推荐曲线可以通过NID `NID_sm2p256v1`或者字符串`"sm2p256v1"`索引,在编程时可以通过`NID_sm2p256v1`生成域参数`EC_GROUP`对象或者该曲线上的密钥对象`EC_KEY`。 - -``` -#include - -EC_GROUP *sm2p256v1 = EC_GROUP_new_by_curve_name(NID_sm2p256v1); -EC_KEY *sm2key = EC_KEY_new_by_curve_name(NID_sm2p256v1); -``` - -## SM2测试椭圆曲线域参数 - -SM2标准文本中提供了四个测试用椭圆曲线域参数: - -* 192比特素数域椭圆曲线域参数(sm2p192test) -* 256比特素数域椭圆曲线域参数(sm2p256test) -* 193比特二进制域椭圆曲线域参数 (sm2b193test) -* 257比特二进制域椭圆曲线域参数 (sm2b257test) - -`crypto/sm2/sm2test.c`中提供了这四个参数的定义及生成`EC_GROUP`对象的代码,应用如果希望使用上述四个参数,可以直接从`sm2test.c`测试文件中复制相应代码。 - - - -