SM2密码算法数据结构

2022年9月17日08:14:58

SM2密码算法数据结构已经在GM/T 0009规范中详细定义了,为巩固加深理解,本节内容为学习笔记,仅摘抄记录。

1. SM2的密钥对

1.1 SM2公钥

SM2公钥是SM2曲线上的一个点,由横坐标和纵坐标两个分量来标识,记为(x, y),简记为Q,每个分量的长度为256位。

1.2 SM2私钥

SM2私钥是一个大于或等于1且小于n-1的整数(n为SM2算法的阶,其值详见GM/T 0003),简记为k,长度为256位。


2. 数据格式

2.1 密钥数据格式

SM2算法的私钥数据格式的ASN.1定义为:

SM2PrivateKey::=INTEGER

SM2算法公钥数据格式的ASN.1定义为:

SM2PublicKey::=BIT STRING

SM2PublicKey为BIT STRING类型,结构为04||X||Y,其中X,Y分别表示公钥额x分量和y分量,其长度各为256位。

2.2 加密数据格式

SM2算法加密后的数据格式的ASN.1定义为:

SM2Cipher:: = SEQUENCE{

XCoordinate                       INTEGER,                                --x分量

YCoordinate                       INTEGER,                                --y分量

HASH                                 OCTET STRING SIZE(32),      --杂凑值

CipherText                         OCTET STRING,                     --密文

}

其中,HASH为使用SM3算法对明文数据运算得到的杂凑值,其长度固定为256位。

CipherText是与明文数据等长的密文。

2.3 签名数据格式

SM2算法签名数据格式的ASN.1定义为:

SM2Cipher:: = SEQUENCE{

R                INTEGER,                   --签名值的第一部分

S                INTEGER,                   --签名值的第二部分

}

R和S的长度各为256位。

2.4 密钥对保护数据格式

在SM2密钥对传递时,需要对SM2密钥对进行加密保护。具体的保护方法为:

  1. 产生一个对称密钥。
  2. 按对称密码算法标识指定的算法对SM2私钥进行加密,得到私钥的密文。若对称算法为分组算法,则其运算模式为ECB。
  3. 使用外部SM2公钥加密对称密钥得到对称密钥密文。
  4. 将私钥密文、对称密钥密文封装到密钥对保护数据中。

SM2EnvelopeKey:: = SEQUENCE{

symAlgID                              AlgorithmIdentifier,   --对称算法标识

symEncryptedKey               SM2Cipher,                --对称密钥密文

Sm2PublicKey                     SM2PublicKey           --SM2公钥

Sm2EncryptedPrivateKey   BIT STRING              --SM2私钥密文

}

上述密钥对保护数据格式实际上就是一个SM2加密信封的数据格式,SM2公钥仅仅是封装在信封内部,依然是裸公钥。

此时有A和B双方进行密钥对传递,B先将自己的SM2公钥传递给A;

A此时要把自己的非对称密钥对安全地传递给B,做法如下:

  • A产生一对SM2密钥对,然后A又产生一个对称算法密钥(假定算法为SM4)symK;
  • A用symK加密自己的私钥,得到SKCipher,
  • A用B的公钥去加密自己的symK,得到对称密钥密文symKCipher;
  • A将上述数据封装成一个SM2的加密信封EnvelopA,然后将EnvelopA传递给B。

B收到A发过来的EnvelopA数据后,解开信封过程如下:

  • B用自己的私钥解密EnvelopA数据,获取到信封里边的数据。
  • B用自己的私钥去解开EnvelopA数据中的对称密钥密文后,拿到对称密钥明文symPlainKey
  • B用对称密钥明文数据解开SM2私钥密文,拿到A的私钥明文。
  • B拿到了A的SM2公钥/私钥密钥对。

最后,A将自己的SM2密钥对安全传递给B。当然上述传递方式是最基础的,在不同的应用场景下或许有更为复杂的传递方式设计。


3. 预处理

预处理过程详见0009规范。


4. 计算过程

4.1 生成密钥

SM2密钥生成是指生成SM2算法的密钥对的过程,该密钥对包括私钥和与之对应的公钥。其中,私钥的长度为256位,公钥的长度为512位(x和y分量)。

输入:        无

输出:        k         SM2PrivateKey        SM2私钥

                   Q        SM2PublicKey        SM2公钥

详细的计算过程见GM/T 0003

4.2 加密

SM2加密是指使用指定公开密钥对明文进行特定的加密计算,生成相应密文的过程。该密文只能由该指定公开密钥对应的私钥解密。

输入:        Q        SM2PublicKey        SM2公钥

                   m        字节串                      待加密的明文数据

输出:        c         SM2Cipher               加密密文

其中:

        输出参数C的格式在2.2中定义了。

        输出参数C的XCoordinate、YCoordinate为随机产生的公钥的x分量和y分量

        输出参数C中的HASH计算公式为:

                HASH = SM3(x||m||y)

        其中,x,y为Q的x分量和y分量;

        输出参数c中CipherText为加密密文,其长度等于明文的长度。

详细的计算过程见GM/T 0003和GM/T 0004。

4.3 解密

SM2解密是指使用指定私钥对密文进行解密计算,还原对应明文的过程。

输入:        d        SM2PrivateKey               SM2私钥

                    c        SM2Cipher                       密文

输出:         m        字节串                              与密文对应的明文

m为SM2Cipher经过解密运算得到的明文,该明文的长度与输入参数c中CipherText的长度相同。详细的计算过程见GM/T 0003。

4.4 数字签名

SM2签名是指使用0009规范8.2预处理结果2与签名者私钥,通过签名计算得到签名结果的过程。

输入:        d        SM2PrivateKey               签名者私钥

                    H        字节串                              预处理2的结果

输出:         sign    SM2Signature                签名值

详细的计算过程见GM/T 0003。

4.5 签名验证

SM2签名验证是指使用0009规范8.2预处理结果2、签名值和签名者公钥,通过验证计算确定签名是否通过验证的过程。

输入:        d        SM2PrivateKey              签名者私钥

                   sign    SM2Signature                签名值

                   Q        SM2PublicKey                签名者公钥

输出:        为“真”表示“验证通过”,为“假”表示“验证不通过”

详细的计算过程见GM/T 0003。

4.6 密钥协商

密钥协商是在两个用户之间建立一个共享秘密密钥的协商过程,通过这种方式能够确定一个共享秘密密钥的值。

设密钥协商双方为A、B,其密钥对分别为(dA,QA)和(dB,QB),双方需要获得的密钥数据的比特长度为klen。密钥协商协议分为两个阶段。

具体过程见GM/T 0009。

  • 作者:洒家肉山大魔王
  • 原文链接:https://blog.csdn.net/qq_27706119/article/details/126354115
    更新时间:2022年9月17日08:14:58 ,共 3196 字。