• SM2密码算法数据结构


    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。

  • 相关阅读:
    第二证券|沪指冲上3200点,中字头太火爆!
    【web前端期末大作业】html网上在线书城大学生静态网页 大学生html当当书城仿站 网上书城购物网页作业HTML
    1、互联网核心岗位缩写
    荐书丨《实验心理学指导手册》:如何快速掌握一篇文献中的实验范式
    redux、mobx
    代码随想录2.5——数组:904水果成篮、76最小覆盖子串
    linux虚拟化: kvm: 初始化及创建用户过程
    JSTL(jsp标准标签库)
    torch.optim.Adam
    备战2024秋招面试题-最左匹配原则、索引失效情况、算法(最长回文子串)
  • 原文地址:https://blog.csdn.net/qq_27706119/article/details/126354115