国密算法SM2 密钥对的生成

这篇具有很好参考价值的文章主要介绍了国密算法SM2 密钥对的生成。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、椭圆曲线密码算法        

        椭圆曲线密码编码学(ECC)是一种理论性很强的学科。后来随着计算科学和密码学的发展,被应用到了公钥密码体制这个领域中。椭圆曲线密码体制最早是由Kobiliz和Millr于185年提出的,是迄今为止安全性最高的一种算法,它的安全性是基于有限域椭圆曲线离散对数(Eliptic Curve Discrete Logarithm Problem,ECDLP)的难解性,是目前公认的3种安全有效的公钥密码体制之一另外2种分别是基于大整数分解问题(nteger Factorization Problem,IFP)的公钥密码体制和基于有限域离散对数问题(Discrete Logarithm Problem,DLP)的公钥密码体制。ECDLP比DLP更难处理.这使得椭圆曲线密码体制采用较短的密钥就可以达到与有限域上使用较长的密钥所达的安全性。椭圆曲线的安全性除了依赖于ECC上离散对数的分解难度,还依赖于曲线的选择。因此建立椭圆曲线密码体制的首要问题就是产生可以抵御所有已有算法攻击的椭圆曲线。

        SM2是国家密码管理局组织制定并提出的椭圆曲线密码算法标准。关于其具体算法内容及国标内容可以参考:在线预览|GB/T 32918.1-2016

二、密钥对生成大致流程

输入:一个有效的Fq(包含q个元素的有限域,q=p且p为大于3的素数或q=2^m)上椭圆系统参数的集合。

基于椭圆曲线的密码系统有7个主要域参数T=(q,a,b,FR,G,n,h):

        q代表有限域GF(q),其中q为p或2m(p为素数),相应的有限域分别为素域和二进制域;

        a,b是椭圆曲线方程的系数;

        FR为曲线的方程,如素域GF(q)上的曲线方程为y^2=x^3+ax+b,二进制域GF(2^m)上的曲线方程为y^2+xy=x^3+a^2x+b;G为基点;

        G为基点;

        n为大素数并且等于基点G的阶6,椭圆曲线系统中最主要的参数是n,因此椭圆曲线的密钥长度就定义为n的长度;

        h是n的余因子,其为一个小整数且h=#E(Fq)/n;

输出:与椭圆系统参数相关的密钥对(d,P),d为私钥,P为公钥

1)初始化椭圆系统

2)产生随机整数d∈[1,n-2]

3)以G为基点,计算P(Xp,Yp)=[d]G(椭圆曲线上点G的d倍点),可用多种方法如:加减法、滑动窗法等计算

4)输出(d,P),d为私钥,P为公钥

注:以上所有计算都可以借助库函数实现

三、代码实现

我采用的是C实现,使用的是miracl库

输入的参数可参考:

struct FPECC
{
	char* p;
	char* a;
	char* b;
	char* n;  //G的阶
	char* x;  //g=(x,y)
	char* y;
};

struct FPECC Ecc256 =
{
    "FFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFF",
    "FFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFC",
    "28E9FA9E9D9F5E344D5A9E4BCF6509A7F39789F515AB8F92DDBCBD414D940E93",
    "FFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFF7203DF6B21C6052B53BBF40939D54123",
    "32C4AE2C1F1981195F9904466A39C9948FE30BBFF2660BE1715A4589334C74C7",
    "BC3736A2F4F6779C59BDCEE36B692153D0A9877CC62A474002DF32E52139F0A0",
};

若想使用其他参数可参考 http://c.gb688.cn/bzgk/gb/showGb?type=online&hcno=3EE2FD47B962578070541ED468497C5B中的附录C文章来源地址https://www.toymoban.com/news/detail-403007.html

/**
	* @brief 生成SM2公私钥对
	* @param wx:         公钥的X坐标,不足32字节在前面加0x00
	* @param wxlen:       wx的字节数,32
	* @param wy:         公钥的Y坐标,不足32字节在前面加0x00
	* @param wylen:       wy的字节数,32
	* @param privkey:    私钥,不足32字节在前面加0x00
	* @param privkeylen: privkey的字节数,32
  * @retval void
  */
void sm2_keygen(unsigned char* wx, int* wxlen, unsigned char* wy, int* wylen, unsigned char* privkey, int* privkeylen)
{
	struct FPECC *cfig = &Ecc256;
	epoint* g, * pB;
	big a, b, p, n, x, y, key1;
	miracl* mip = mirsys(20, 0);   //初始化大数系统
	mip->IOBASE = 16;   //输入为16进制数改为大数

	p = mirvar(0);    //将大数字符串转换成大数,这里是16进制的字符串转换大数
	a = mirvar(0);
	b = mirvar(0);
	n = mirvar(0);
	x = mirvar(0);
	y = mirvar(0);
	key1 = mirvar(0);

	cinstr(p, cfig->p);      //将大数字符串转换成大数,这里是16进制的字符串转换大数
	cinstr(a, cfig->a);
	cinstr(b, cfig->b);
	cinstr(n, cfig->n);
	cinstr(x, cfig->x);
	cinstr(y, cfig->y);

	ecurve_init(a, b, p, MR_PROJECTIVE);   //初始化椭圆曲线
	g = epoint_init();
	pB = epoint_init();
	epoint_set(x, y, 0, g);    //g=(x,y)为基点G

    //产生私钥
	irand(time(NULL) + SEED_CONST);   //初始化种子
	bigrand(n, key1);    //生成随机数key1,即为私钥

    //产生公钥
	ecurve_mult(key1, g, pB);   //pB=[key1]G
	epoint_get(pB, x, y);    //取pB上的点(x,y)x和y即为公钥

	*wxlen = big_to_bytes(0, x, (char*)wx, FALSE);    //公钥写入wx、wy,长度wxlen
	*wylen = big_to_bytes(0, y, (char*)wy, FALSE);
	*privkeylen = big_to_bytes(0, key1, (char*)privkey, FALSE);

    //清内存
	mirkill(key1);
	mirkill(p);
	mirkill(a);
	mirkill(b);
	mirkill(n);
	mirkill(x);
	mirkill(y);
	epoint_free(g);
	epoint_free(pB);
	mirexit();
}

到了这里,关于国密算法SM2 密钥对的生成的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 椭圆曲线密码(SM2)

    1. 公钥生成 ① Alice首先构造一条椭圆曲线E,在曲线上选择一点G作为生成元,并求G的阶为n,要求n必须为质数。此时构成了一个循环群G. ② Alice选择一个私钥k (k n),生成公钥 Q = kG ③ Alice将公钥组E、Q、G发送给Bob 2. 加密过程 ① Bob收到信息后,将明文编码为M,M为曲线上一点,

    2024年02月17日
    浏览(31)
  • 国密算法 SM2 公钥加密 数字签名 密钥交换 全网最高效的开源python代码

    此前发布过SM2、SM3、SM4、ZUC等文章,以及开源的完整python代码。近些天看到一篇电子科大兰同学的硕士毕业论文(兰修文. ECC计算算法的优化及其在SM2实现中的运用[D]. 成都: 电子科技大学, 2019),文中采用预计算加速SM2椭圆曲线基点点乘,将这个思路用python代码实现后,实测

    2024年02月09日
    浏览(34)
  • Python实现国家商用密码算法sm2/sm3/sm4/sm9(国密)

    2010 年开始,我国国家密码管理局就已经开始陆续发布了一系列国产加密算法,这其中就包括 SM1、SM2、SM3 、SM4、SM7、SM9、ZUC(祖冲之加密算法)等,SM 代表商密,即商业密码,是指用于商业的、不涉及国家秘密的密码技术。SM1 和 SM7 的算法不公开,其余算法都已成为 ISO/IEC

    2024年02月15日
    浏览(25)
  • 新手入门 | 掌握国密算法:新手指南: SM2 / SM3 / SM4密码算法详解

    在密码学领域,有多种加密与签名算法,它们在信息安全领域发挥着举足轻重的作用。如今,随着互联网的快速发展,网络安全已经成为各类信息系统完整性、可用性、保密性的重要保障,越来越多的国产密码算法得到了广泛的应用与关注。在本文中,我们将重点介绍三个经

    2024年02月12日
    浏览(117)
  • 椭圆曲线在SM2加解密中的应用(三)

    1.1加密原始数据 SM2加密运算首先是用户A对数据加密,用户A拥有原始数据 椭圆曲线系统参数 长度为klen比特的消息M 公钥Pb 椭圆曲线系统参数,已经在 椭圆曲线参数(二)中详细介绍;M就是需要加密消息,长度为klen; 1.1.1 公钥Pb的计算方式 公钥Pb=dBG,其中dB是私钥,是256b

    2024年02月08日
    浏览(31)
  • 商用密码应用与安全性评估要点笔记(SM2密钥交换算法)

    1、SM2算法简介         SM2密码算法是我国2010年发布的商用密码算法,属于公钥密码算法,也成为非对称密钥机制密码算法。SM2基于椭圆曲线离散对数问题,相对于RSA基于大整数因数分解更具优越性。         SM2算法于2012年成为我国密码行业标准,并于2017年被ISO采纳,成为

    2024年02月11日
    浏览(26)
  • 国密SM2/SM3算法

    分类 1、SM1是一种分组加密算法 对称加密算法中的分组加密算法,其分组长度、秘钥长度都是128bit,算法安全保密强度跟 AES 相当,但是算法不公开,仅以IP核的形式存在于芯片中,需要通过加密芯片的接口进行调用。 采用该算法已经研制了系列芯片、智能IC卡、智能密码钥匙

    2024年02月05日
    浏览(49)
  • 国密算法-SM2

            国密算法是国家密码局制定标准的一系列算法,包括SM1、SM2、SM3、SM4等。其中,SM1是采用硬件实现的,不予讨论;SM2是非对称加密算法;SM3是摘要算法;SM4是对称加密算法。本篇贴出SM2 Java版本实现生成公私钥及加解密、签名验签代码,供大家一起讨论学习,所有

    2024年02月11日
    浏览(38)
  • 国密:生成SM2秘钥、加解密及加验签

    国密改造已经持续了很长时间了,相信很多从事金融科技类的程序猿都遇到过这个需求。这篇文章就为大家带来笔者对于国密改造的一些经验,主要是代码层面,有兴趣的同学可以研究下国密的算法模型! 注:本文所用到的工具类并非笔者所写! 目录 一、国密简述 二、依赖

    2024年02月03日
    浏览(40)
  • SM2国密算法加解密

    接口安全设计原则的一个点就是数据不能明文传输,除了https这个必须的请求外,接口数据加密也是一个重要的方式,下面介绍一下SM2国密算法加解密的使用方式。 这里我就针对目前前后端分离架构的方式来简单介绍一下如何正确使用 SM2 算法对数据进行加解密,介绍分为后

    2024年02月11日
    浏览(30)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包