基于GMSSL的SM2加解密测试


前言

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

  • 4
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
以下是使用gmssl进行sm2加解密的步骤: 1. 生成密钥对 ```shell # 生成私钥 openssl ecparam -genkey -name sm2p256v1 -out sm2.key # 生成公钥 openssl ec -in sm2.key -pubout -out sm2.pub ``` 2. 使用gmssl进行sm2加密 ```shell # 加密 echo "hello world" > plain.txt gmssl sm2enc -in plain.txt -out cipher.txt sm2.pub ``` 3. 使用gmssl进行sm2解密 ```shell # 解密 gmssl sm2dec -in cipher.txt -out plain2.txt sm2.key ``` 4. 运行结果 ```shell $ cat plain.txt hello world $ cat cipher.txt 30819F300D06092A864886F70D010101050003818D0030818902818100B9C7E5B8B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7B7C5B7
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

viqjeee

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值