sm2算法的公钥是64字节,私钥是32字节,公钥其实是由坐标点(x,y)组合构成,即每个点都是32字节的大数构成的。但是大多数情况下在使用的时候都是对公钥进行压缩使用,以节省空间。但是根据点压缩方式,我们在使用的时候看到的压缩公钥有两种,一种是02,一种是03。还有04的标识未压缩。
02/03表示一种压缩方式,所以在解压缩的时候根据压缩标志对Y坐标进行不同的反转操作。如何解压缩呢,前面讲到SM2算法采用的曲线公式,因此当知道坐标X就可以根据该公式算出Y坐标,进而得到完整的公钥。

sm2 压缩与还原
简单来说,就是判断最低位是奇数还是偶数,偶数为0(compressed_y_0),奇数为1(compressed_y_1).

ECC/SM2 公钥(点)压缩方法,64字节公钥压缩成33字节公钥。

void compress(const uint8_t *public_key, uint8_t *compressed)
{
    int i;
    for (i = 0; i < 32; ++i)
    {
        compressed[i+1] = public_key[i];
    }
    compressed[0] = 2 + (public_key[32 * 2 - 1] & 0x01);
}
本文链接地址:https://const.net.cn/645.html

标签: none

添加新评论