国密SM2非对称算法与实现


介绍

国密SM2是非对称密码算法,是基于ECC算法的非对称算法。SM2算法标准已公布,有兴趣的可下载文档学习。
国密SM2算法标准包括4个部分,
-第1部分为总则,主要介绍了ECC基本的算法描述,包括素数域和二元扩域两种算法描述
-第2部分为数字签名算法,这个算法不同于ECDSA算法,其计算量大,也比ECDSA复杂些,也许这样会更安全吧
-第3部分为密钥交换协议,与ECDH功能相同,但复杂性高,计算量加大
-第4部分为公钥加密算法,使用ECC公钥进行加密和ECC私钥进行加密算法,其实现上是在ECDH上分散出流密钥,之后与明文或者是密文进行异或运算,并没有采用第3部分的密钥交换协议产生的密钥。
对于SM2算法的总体感觉,应该是国家发明,其计算上比国际上公布的ECC算法复杂,相对来说算法速度可能慢,但可能是更安全一点。

SM2标准还公布了一条建议的256位的ECC曲线,但没有在国际上被公认。SM2算法是好,但要使用,又有很多障碍,就是统一的国际标识与互认,如算法没有OID标识,曲线也没有公认OID标识,这在通用上就大打折扣了,这一点需要考虑的。


调研实现

网上可以查到一些SM2算法的实现代码,有C#的、有Java的,还有C的,但想找到一个完整的C语言代码还是很难,人家做了不公开,算法标准都公开的,代码不开源啊,但比较有意义的是这些代码都是使用Openssl或bouncycastle这些开源的算法库实现的。但至少给你个信息,使用开源密码算法可以实现SM2算法。

要实现SM2算法,首先要实现ECC曲线基本描述,这个要独立去写还是需要很多计算算法能力的,不是搞数学的,还是有许多难度的。Openssl的ECC算法是SUN公司奉献的,大家就是大家,写的就是好。Bouncycastle也是一个比较好的算法,有Java版和C#版,网上可以得到C#的SM2算法,但是使用c语言的代码能够下载的SM2都有一点骗人感情啊,只给了代码测试运行包,没有公开源码。

笔者按着这些信息,细细分析了Openssl的ECC、ECDSA、ECDH算法,可以作为基础用来实现SM2是豪无问题的,待代码进一步完善后可以与大家分享。

最后说一下,RSA与ECC。这两位都是目前主流的非对称加密算法,也代表了2大加密算法难题,一个是大素数分解,一个离散对数难题。RSA的模长在不断的加大,1024不可用了,要用2048,这计算量啊要求也大,就需要使用计算量小的ECC算法,但RSA已大行其道这么多年,还不会马上被ECC所替换,ECC使用也很复杂,要定义多种曲线,要管理这些参数曲线,否则很难互通,还有专利的限制等等。ECC的加密算法也不同于RSA,有公钥加密和私钥解密,而RSA加解密都有啊。不论是RSA还是ECC都是计算上的复杂,随着时间,密钥长度都将加长,这就需要有更好的密码算法来替代了。也许不需要等到那一天,人类社会发展会非常完善,不需要密码了,是个完全透明的、可信任的社会了。


实现

使用Openssl实现的SM2算法代码如下: [ 算法实现演示 ],也可请参考ecc资料。


参考

在计算点是否满足方程时,openssl存在依据x查找y时的参数设置,可以参考说明,补充一点个人理解,y存在正负,但是在有限域表示时均为两个整数,在点的分布图上观察可以清晰看出这一点。


国密SM2非对称算法与实现相关推荐

  1. vue前端国密SM2, SM4 算法实现

    vue前端国密SM2, SM4 算法实现 整体加密逻辑是,首先生成16位key值 用SM2 公钥加密该key值,后端用sm2私钥 解密出key值,然后采用sm4方法根据key值对返回值进行加密,前端采 ...

  2. 基础密码算法c语言实现,国密SM2密码算法的C语言实现

    邢维哲 [摘要] N.Koblitz和V.Miller在1985年各自獨立地提出将椭圆曲线应用于公钥密码系统.SM2椭圆曲线密码算法是国家密码管理局批准的一组算法,在电力自动化通讯中得到了广泛应用.本 ...

  3. 国密SM2算法(JS加密,C#、Java解密)

    常见的渗透测试会将网站登录时密码使用明文传输视为风险.推荐使用国密算法或者RSA算法对密码进行加密传输. RSA加密(JS加密,C#.Java解密)请参考<RSA对称加密(JS加密,C#.Jav ...

  4. 国密SM2算法的只求理解不求甚解 (4/5)SM2算法加解密协议

    国密SM2算法的只求理解不求甚解 (1/5)前置数学知识:模运算 国密SM2算法的只求理解不求甚解 (2/5)前置数学知识:平面几何 国密SM2算法的只求理解不求甚解 (3/5)SM2算法数学模型 国 ...

  5. 国密SM2算法密钥派生函数KDF的实现

    前段时间需要实现国密算法SM2的签名.验签.加密.解密等功能,加解密过程使用到的密钥派生函数(KDF),从网上搜到的代码不符合<GMT 0003.4-2012 SM2椭圆曲线公钥密码算法 > ...

  6. 基于mbedTLS算法库实现国密SM2签名和验签算法

    网上有大量的基于OpenSSL实现的国密算法库,比如著名的GmSSL,可以直接拿来用.我自己常用的是mbedTLS的算法库,比较小巧简单,在mbedTLS的大数算法的基础上实现了国密SM2的签名和验签 ...

  7. 一文告诉你,国密SM2算法有多优秀

    可能很多人都想不到,密码技术是与核技术.航天技术并列的国家三大安全核心技术之一,在保障信息安全,建设行业网络安全环境,增强我国行业信息系统的"安全可控"能力等方面发挥着至为关键的作 ...

  8. 国密SM2算法与RSA算法对比分析

    SM2算法和RSA算法都是公钥密码算法,SM2算法是一种更先进安全的算法,在安全性能.速度性能等方面都优于RSA算法,在我国商用密码体系中被用来替换RSA算法.国家密码管理局于2010年12月17日发 ...

  9. 推荐一款能支持国密SM2的浏览器——密信浏览器

    密信浏览器( MeSince Browser )是基于Chromium开源项目开发的国密安全浏览器,支持国密算法和国密SSL证书,同时也支持国际算法及全球信任SSL证书:密信浏览器使用界面清新,干净. ...

  10. 使用 Python 脚本执行国密 sm2 加解密

    一.场景 工作中的一个场景:Go 需要对信息加解密,但是研究了 GmSSL Go API 文档之后,发现是依赖于 CGO 的,同事配了半天环境没配成功.于是换了一个方法,选择 Go 调 Python ...

最新文章

  1. sql的不等于条件优化_SQL优化案例(2):OR条件优化
  2. python手机版怎么用-怎么用手机编写Python程序?
  3. vs.net设计器里加载派生窗口类时要执行父窗口的Form_Load方法
  4. 跟我学大数据分析之四:“钱”去哪儿了?
  5. laravel 安装配置前准备
  6. finalshell连接超时怎么解决_vncviewer连接超时,vncviewer连接超时怎么解决
  7. jQuery实现一个淡入淡出下拉菜单 非常简易
  8. python场景识别_python 场景
  9. oracle pl sql安装配置,oracle的安装与plsql的环境配置
  10. linux 开放端口
  11. 后端技术栈学习路线与面试技巧指北
  12. MYSQL 学习笔记记录整理之二:分组数据
  13. CentOS云主机安全之新增ssh登录账户、禁止ROOT登陆
  14. 资金流学习 - 关注点
  15. 阅读心得5:《阿里如何实现秒级百万TPS?搜索离线大数据平台架构解读》
  16. uni-app开发APP上架应用市场遇到的坑
  17. 自动化脚本腾讯云配置集群(三)批量修改host
  18. 银行理财子与券商合作探讨(一):银行理财子带给资本市场的机遇与挑战
  19. 求和:1/3+3/5+5/7+7/9+………..+97/99
  20. 微信与朋友圈后台架构

热门文章

  1. SSL基础:11:使用req子命令创建自签名证书
  2. 仿真树叶飘落效果的实现
  3. [Python人工智能] 十九.Keras搭建循环神经网络分类案例及RNN原理详解
  4. 工控机运行linux,什么是linux嵌入式工控机
  5. java读取共享文件_局域网共享文件读写的实现方式
  6. 计算机基础——Word 2010
  7. 计算机单元格数值不保留小数,excel如何用公式让单元格数值保留两位小数
  8. python面向对象的特点_Python面向对象基本特征
  9. MySQL中对索引的理解 特点 优势_深入理解MySQL索引和优化
  10. Linux文件系统有哪些