基于GMSSL的SM2加解密测试

基于GMSSL的SM2加解密测试

  • 前言
  • 一、gmssl 命令行测试sm2
  • 二、使用gmssl库的加解密接口测试
    • 1.生成密钥对
    • 2.sm2 加密
    • 3.sm2 解密
    • 4. 运行结果
  • 总结


前言

SM2算法和RSA算法都是公钥密码算法,SM2算法是一种更先进安全的算法,在我们国家商用密码体系中被用来替换RSA算法。SM2算法是基于椭圆曲线上点群离散对数难题,相对于RSA算法,256位的SM2密码强度已经比2048位的RSA密码强度要高。

一、gmssl 命令行测试sm2

参考gmssl官网中关于sm2的描述 http://gmssl.org/docs/sm2.html
可以使用gmssl命令行使用sm2进行加解密测试:

$ gmssl sm2utl -encrypt -in msg.txt -pubin -inkey sm2Pub.pem -out enced.der
$ gmssl sm2utl -decrypt -in enced.der -inkey sm2.pem

二、使用gmssl库的加解密接口测试

1.生成密钥对

代码如下():

    EC_KEY *keypair = NULL;
    int ret1,ret2;

    keypair = EC_KEY_new();
    group1 = EC_GROUP_new_by_curve_name(NID_sm2p256v1);

    ret1 = EC_KEY_set_group(keypair, group1);
    ret2 = EC_KEY_generate_key(keypair);

2.sm2 加密

代码如下:

data = pd.read_csv(
    int ret = 0;
    SM2CiphertextValue *cv = NULL;
    size_t mlen, clen;
    unsigned char *p;


    if (!(cv = SM2_do_encrypt(md, (unsigned char *)in_data, in_len, key))) {
        printf("SM2_do_encrypt failed\n");
    }

    if ((*out_len = i2o_SM2CiphertextValue(group, cv, &out_data)) <= 0) {
        printf("i2o_SM2CiphertextValue failed\n");
    }

3.sm2 解密

代码如下:

    int ret = 0;
    SM2CiphertextValue *cv = NULL;
    size_t clen;
    unsigned char *p;


    if (!(cv=o2i_SM2CiphertextValue(group,md, NULL, &in_data,in_len))) {
        printf("o2i_SM2CiphertextValue failed\n");
    }

    if (!(SM2_do_decrypt(md, cv, out_data, out_len, key))) {
        printf("SM2_do_decrypt failed\n");
    }


4. 运行结果

priv key:
0888B85B1FBFFE7573EA44BF6BE8B5CD578A2E8EE44A86F10536C2C48DC52A43
pub x :
77A8C798B2DC25D6E9819713976D38A52D45AA623C87BA294955A2AE498CEFDC
pub y:
C6E32B66C067BAE6B04D8CD638B3FC1C37F6563C6B38D0077EE17C666F308933
plain data:
0123
==============SM2 ENC===========
enc len=101
enc data:
4 b0 87 dc a2 d8 7a a7 72 ea 77 1b 4a c6 78 c2 a3 59 c3 8a 7 81 30 71 70 7e 2d 96 a3 71 ab e6 ba 6b 9 5 c1 e3 6b fb 23 95 6d a4 68 66 77 ee 6d ba 3 40 b6 f5 d6 a6 da f6 f2 2f d0 24 5b 20 89 12 dc 63 2f 6c 4e f2 bd 1c 55 1c 40 19 99 3c 32 1a e8 78 ce 80 1c 19 3f 8b cf dc 65 e7 6a bc 19 56 e1 69 52 
=========================
==============SM2 DEC===========
dec len=4
dec data:
0123
========================

经过和网上sm2 在线工具对比,结果正确,数据可以用在线工具正常解密。

总结

目前使用的是NID_sm2p256v1这套默认的曲线参数:
group1 = EC_GROUP_new_by_curve_name(NID_sm2p256v1);
当然,也可以使用自定义的,但需要加解密双方保持一致,并且在线工具中sm2 应该也是用的默认的NID_sm2p256v1,如果使用自定义的,用在线工具解密会报错。

本章测试源码https://download.csdn.net/download/qq_39952971/16038718

你可能感兴趣的:(网络,加密,加密解密,算法)