接上篇GB35114---基于openssl加密库进行开发(一)

-----------------------------------------------------------------------------------------------------------------------------

openssl的两个.so动态库libcrypto.so.1.1 and libssl.so.1.1不能直接调用sm2签名及加密函数。

但是它里面集成了sm2的椭圆曲线,那我们就根据sm2曲线算法直接写个签名函数。

其实在openssl的sm2_sign.c内已经有相关算法,那我们就伸手了。

BIGNUM *sm2_compute_msg_hash(const EVP_MD *digest,const EC_KEY *key,const uint8_t *id,const int id_len,const uint8_t *msg, int msg_len)
{EVP_MD_CTX *hash = EVP_MD_CTX_new();const int md_size = EVP_MD_size(digest);uint8_t *z = NULL;BIGNUM *e = NULL;if (md_size < 0) {goto done;}z = OPENSSL_zalloc(md_size);if (hash == NULL || z == NULL) {goto done;}if (!sm2_compute_z_digest(z, digest, id, id_len, key)) {/* SM2err already called */goto done;}if (!EVP_DigestInit(hash, digest)|| !EVP_DigestUpdate(hash, z, md_size)|| !EVP_DigestUpdate(hash, msg, msg_len)/* reuse z buffer to hold H(Z || M) */|| !EVP_DigestFinal(hash, z, NULL)) {goto done;}e = BN_bin2bn(z, md_size, NULL);if (e == NULL)done:OPENSSL_free(z);EVP_MD_CTX_free(hash);return e;
}static ECDSA_SIG *sm2_sig_gen(const EC_KEY *key, const BIGNUM *e)
{const BIGNUM *dA = EC_KEY_get0_private_key(key);const EC_GROUP *group = EC_KEY_get0_group(key);const BIGNUM *order = EC_GROUP_get0_order(group);ECDSA_SIG *sig = NULL;EC_POINT *kG = NULL;BN_CTX *ctx = NULL;BIGNUM *k = NULL;BIGNUM *rk = NULL;BIGNUM *r = NULL;BIGNUM *s = NULL;BIGNUM *x1 = NULL;BIGNUM *tmp = NULL;kG = EC_POINT_new(group);ctx = BN_CTX_new();if (kG == NULL || ctx == NULL) {goto done;}BN_CTX_start(ctx);k = BN_CTX_get(ctx);rk = BN_CTX_get(ctx);x1 = BN_CTX_get(ctx);tmp = BN_CTX_get(ctx);if (tmp == NULL) {goto done;}/** These values are returned and so should not be allocated out of the* context*/r = BN_new();s = BN_new();if (r == NULL || s == NULL) {goto done;}for (;;) {if (!BN_priv_rand_range(k, order)) {goto done;}if (!EC_POINT_mul(group, kG, k, NULL, NULL, ctx)|| !EC_POINT_get_affine_coordinates(group, kG, x1, NULL,ctx)|| !BN_mod_add(r, e, x1, order, ctx)) {goto done;}/* try again if r == 0 or r+k == n */if (BN_is_zero(r))continue;if (!BN_add(rk, r, k)) {goto done;}if (BN_cmp(rk, order) == 0)continue;if (!BN_add(s, dA, BN_value_one())|| !ec_group_do_inverse_ord(group, s, s, ctx)|| !BN_mod_mul(tmp, dA, r, order, ctx)|| !BN_sub(tmp, k, tmp)|| !BN_mod_mul(s, s, tmp, order, ctx)) {goto done;}sig = ECDSA_SIG_new();if (sig == NULL) {goto done;}/* takes ownership of r and s */ECDSA_SIG_set0(sig, r, s);break;}done:if (sig == NULL) {BN_free(r);BN_free(s);}BN_CTX_free(ctx);EC_POINT_free(kG);return sig;
}ECDSA_SIG *sm2_do_sign(const EC_KEY *key,const EVP_MD *digest,const uint8_t *id,const int id_len,const uint8_t *msg, int msg_len)
{BIGNUM *e = NULL;ECDSA_SIG *sig = NULL;e = sm2_compute_msg_hash(digest, key, id, id_len, msg, msg_len);if (e == NULL) {/* SM2err already called */goto done;}sig = sm2_sig_gen(key, e);done:BN_free(e);return sig;
}

其中

sm2_compute_msg_hash   函数是对签名数据进行hash散列;

sm2_sig_gen   函数是SM2签名算法,注:该函数最后调用ECDSA_SIG_set0(sig, r, s)对SM2真正的签名的r跟s进行了转化,返回ECDSA_SIG结构的签名数据。

至此SM2-SM3的签名函数就搞定了,我们依葫芦画瓢完成验签、加解密等函数。

最后附上可用的代码,也是我过gb35114的加密代码。

SM2-SM3示例代码

有错误请留言,谢谢

下篇

GB35114---聊聊SM2签名格式

---bob  2020/3/17 10.44

GB35114---基于openssl加密库进行开发(二)相关推荐

  1. 基于MTD的NAND驱动开发(二)

    基于MTD的NAND驱动开发(二) 基于MTD的NAND驱动开发(三) http://blog.csdn.net/leibniz_zsu/article/details/4977853 http:// ...

  2. Openssl加密库

    基础知识 对称算法 对称算法使用一个密钥.给定一个明文和一个密钥,加密产生密文,其长度和明文大致相同.解密时,使用读密钥与加密密钥相同. 对称算法主要有四种加密模式: 电子密码本模式 Electron ...

  3. 信息安全:使用 Openssl 加密库进行编程

    提示文档: 实验已给出明文和密文,如下所示,并且已知加密方法为 aes-128-cbc,IV 全由 0 组成,以及 key 的长度小于 16 个字母,该单词可以从一般的英文词典中得到.由于该单词小于 ...

  4. 【Android 安全】DEX 加密 ( 代理 Application 开发 | 项目中配置 OpenSSL 开源库 | 使用 OpenSSL 开源库解密 dex 文件 )

    文章目录 一.项目中配置 OpenSSL 开源库 二.OpenSSL 开源库解密参考代码 三.解密 dex 文件的 Java 代码 四.解密 dex 文件的 Jni 代码 参考博客 : [Androi ...

  5. 【Android 安全】DEX 加密 ( 代理 Application 开发 | 交叉编译 OpenSSL 开源库 )

    文章目录 一.OpenSSL 开源库简介 二.OpenSSL 源码及环境变量脚本下载 三.修改环境变量脚本 四.OpenSSL 交叉编译 五.OpenSSL 交叉编译相关资源下载 参考博客 : [An ...

  6. MacOS下使用C语言基于openssl库进行RSA加密解密

    MacOS下使用C语言基于openssl库进行RSA加密解密 1 安装openssl并生成密钥 首先当然要安装openssl(这里记得看一下安装路径,应该是/usr/local/Cellar/open ...

  7. Python基于pyzbar、opencv、pyqt5库,实现二维码识别 gui 应用程序开发

    二维码组成结构基本介绍 二维码识别背景介绍 视觉的方法可以用来估计位置和姿态.最容易想到的是在目标上布置多个容易识别的特征,这样使用opencv相机标定和.相机畸变矫正.轮廓提取.solvepnp来获 ...

  8. 两个开发源码加密库openssl和cryptlib的比较

    [openssl资源] 作者:Eric Yang等 官方网站:http://www.openssl.org 中文网站推荐:http://gdwzh.126.com 当前版本: openssl-0.9. ...

  9. 【Android 安全】DEX 加密 ( Java 工具开发 | 加密解密算法 API | 编译代理 Application 依赖库 | 解压依赖库 aar 文件 )

    文章目录 一.加密解密算法 API 二.编译代理 Application 依赖库 三.解压代理 Application 依赖库 aar 文件 参考博客 : [Android 安全]DEX 加密 ( 常 ...

  10. Element UI 组件库分析和二次开发(一)

    我的本地开发环境:M1 芯片Mac,node v12.22.10. 一.Element UI 组件库二次开发的大致流程 1. 从 Element 官方 clone 一份 dev 源码到本地 2. 安装 ...

最新文章

  1. 服务器维护10月11魔兽,魔兽世界10月11日更新内容是什么_10.11PVP改动预览_3DM网游...
  2. asp打开exe执行本地程序._基于QT应用程序打包成可执行程序exe
  3. 前端学习(1698):前端系列javascript之原型链和instance
  4. Android 用MediaCodec ,MediaExtractor解码播放MP4文件
  5. 如何修改计算机的ip地址在哪里设置路由器,win7系统电脑无线路由器IP地址如何修改?电脑修改路由器IP地址的方法...
  6. delphi 各新版本特性收集
  7. MP4视频转换器怎么样将FLV转MP4
  8. Colibri 片段化学空间的兴起
  9. Amcharts4使用笔记
  10. 今日头条2018年1月8日面试
  11. 屏幕增强字段如何保存修改记录
  12. CSS基础-02 background(背景色)(背景色 background-color、背景图 background-image)
  13. 独立站运营 | 强烈推荐,这5款WordPress电子商务插件
  14. leetcode记录-340-至多包含 K 个不同字符的最长子串-双指针
  15. CityMaker学习教程02 软件的授权
  16. 并发编程-初级之认识并发编程
  17. 词法分析——词法分析的任务
  18. MongoDB Project(投影字段)
  19. 原理图-电源电路设计
  20. matlab图像边缘宽度调整

热门文章

  1. android程序员简历模板
  2. SWAT模型非点源模拟原理
  3. 韩顺平--Java坦克大战
  4. SQLyog 安装教程
  5. netty实现gmssl_gmssl国密总结
  6. 阿里云怎么进入mysql_阿里云进入mysql数据库
  7. oracle安装sqluldr2,Oracle sqluldr2工具使用方法
  8. oracle数据导出工具sqluldr2安装及使用
  9. vue 识别身份证内容并映射到来源地区的js
  10. 人民银行支付系统(CNAPS)和中国银联下面的跨行支付系统是一回事儿吗