sm2签名与sm4加密(三)

二简单介绍了一下理论,三来简单说下sm2签名的实现,

首先因为openssl太复杂没搞懂,就去看gmssl的代码,gmssl的密钥结构体很简单,长这个样子:

typedef struct {
	SM2_POINT public_key;
	uint8_t private_key[32];
} SM2_KEY;
typedef struct {
	uint8_t x[32];
	uint8_t y[32];
} SM2_POINT;

很明显公钥是一个点由xy两个坐标组成,私钥是一个长串。

sm2签名过程可以大体上分成三步,生成公私钥——(交换密钥)——使用私钥进行签名——使用公钥验签。

在gmssl中直接使用sm2_key_generate(&sm2_key)函数,生成密钥并将密钥置入结构体中,或者直接使用命令生成密钥也可以。

获取到密钥之后就对原报文进行签名,具体流程是:

原报文通过sm3算法(没错,sm2签名用了sm3算法)生成杂凑数据(也就是e值,e值好像是个通用的叫法?)(也叫做摘要),再将杂凑数据传递到签名函数中,通过私钥进行签名得到签名串。

为什么突然出现sm3呢?这里还需要解释sm3是什么东西,sm3是一种密码散列函数标准,他的特点是,将原数据不可逆的生成一串256位长度数据。这样签名起来就变得很简单。

具体实现如下:

int sm2_sign_pre(SM2_KEY *sm2_key,
    unsigned char *msg,
    unsigned char *dgst,
    unsigned char *sig,
    size_t *siglen ) {
    int ret = 0;
    sm3_digest(msg, strlen((char*)msg), dgst);
          /* sm2_key_generate(&sm2_key);      生成私钥key和公钥*/

    
    if ((ret = sm2_sign(sm2_key, dgst, sig, siglen)) != 1) {
        fprintf(stderr, "signature failed\n");
    }
    else {
        printf("signature success\n");
    }
    return ret;
}

而验签是当报文收到之后,对报文再次进行摘要(sm3生成杂凑数据),而签名串则拿去用公钥去解密,解密结果如果报文没有被篡改,那么将是相同的,验签通过,如果原报文经过篡改,那么sm3生成杂凑数据会变化,以至于对比结果不相同,验签无法通过

代码如下:

int sm2_verify_pre( SM2_KEY *pub_key,
                     unsigned char* msg,
                     unsigned char *dgst,
                     unsigned char *sig, 
    size_t siglen
                    ) {
    int ret;

    sm3_digest(msg, strlen((char*)msg), dgst);

    if ((ret = sm2_verify(pub_key, dgst, sig, siglen)) != 1) {
        return ret;
    }
    else {
        return 0;
    }
}

SM2SM4是中国国家密码局发布的一种非对称加密算法和一种对称加密算法,它们的优缺点如下: SM2优点: 1. 安全性高:SM2采用了ECC(椭圆曲线加密算法),其安全性比RSA算法更高。 2. 算法效率高:SM2算法效率比传统的RSA算法高,加密、解密速度快。 3. 适用范围广:SM2适用于数字签名、密钥交换、认证等多种场景。 4. 国产算法SM2是中国自主研发的加密算法,具有国产算法的优势,不受外部环境影响。 SM2缺点: 1. 算法适用范围受限:SM2只适用于非对称加密算法,不能用于对称加密算法。 2. 算法标准化不够:SM2的标准化程度还不够,相关技术人员使用起来还不太方便。 SM4优点: 1. 安全性高:SM4采用了分组密码算法,其安全性比DES和AES算法更高。 2. 算法效率高:SM4算法效率比DES和AES算法高,加密、解密速度快。 3. 适用范围广:SM4适用于多种场景,如数据加密、通信加密、文件加密等。 4. 国产算法SM4是中国自主研发的加密算法,具有国产算法的优势,不受外部环境影响。 SM4缺点: 1. 密钥长度限制:SM4的密钥长度只能是128位,这对于一些安全性要求更高的场景来说,可能不够安全。 2. 密钥管理难度较大:由于SM4是对称加密算法,密钥管理难度比较大,需要采取一些措施来保证密钥的安全性。 综合来看,SM2SM4都是安全性高、效率高、适用范围广的加密算法,具有国产算法的优势。但是,它们也存在一些局限性,需要根据具体的应用场景进行选择。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值