GMSSL :SM2椭圆曲线公钥密码算法——数字签名算法4

article/2025/9/25 2:25:25

2021SC@SDUSC

目录

一、ECDSA介绍

二、代码分析


一、ECDSA介绍

ECDSA的全名是Elliptic Curve DSA,即椭圆曲线DSA。它是Digital Signature Algorithm (DSA)应用了椭圆曲线加密算法的变种。椭圆曲线算法的原理很复杂,但是具有很好的公开密钥算法特性,通过公钥无法逆向获得私钥。

与ECDSA相关的几个概念:

私钥:一个秘密号码,只有生成它的人知道。私钥本质上是一个随机生成的数字。在比特币中,一个人的私钥与区块链可以花这笔钱。在比特币中,私钥是单个无符号256位整数(32字节)。

公钥:与私钥相对应,但不需要保密的数字。公钥可以从私钥计算,但反之亦然。公钥可以用来确定签名是否是真实的(换句话说,用正确的密钥生成),而不需要泄露私钥。

ECDSA算法的两个优点:
1.在已知公钥的情况下,无法推导出该公钥对应的私钥。
2.可以通过某些方法来证明某人拥有一个公钥所对应的私钥,而此过程不会暴露关于私钥的任何信息。

ESCDA处理的实际上是消息的哈希值,而不是消息本身。哈希函数是可选择的,但这个哈希函数必须是一个

密码学安全的哈希函数。消息的哈希值需要截取一个固定的长度 Ln ,这个长度是 n (子群的阶)的二进制位数。截取后的哈希值是一个整数,我们记为 z。

  ECDSA签名流程:

  1. 在 {1,2.......,n-1}随机选择一个整数  k(  n​ 是子群的阶)
  2. 计算点 P=kG (其中 G是子群的基点)
  3. 计算  r=xp mod n(其中 xp是  P​ 点的横坐标)
  4. 如果 r=0  ,就重新选择一个k,然后再尝试一次同样的流程
  5. 计算  ​(其中dA 是Alice的私钥, k^n-1是  k在模n下的乘法逆元)
  6. 如果  s=0,就重新选择一个 k​ 然后再尝试一次同样的流程

 二元组(r,s)就是消息的签名

在多倍点运算中,已知多倍点与基点,求解倍数的问题称为椭圆曲线离散对数问题。对于一般椭圆曲线的离散对数问题,目前只存在指数级计算复杂度的求解方法。与大数分解问题及有限域上离散对数问题相比,椭圆曲线离散对数问题的求解难度要大得多。因此,在相同安全程度要求下,椭圆曲线密码较其他公钥密码所需的密钥规模要小得多。

ECDSA优点证明:

1.在已知公钥的情况下,无法推导出该公钥对应的私钥。

假设随机取一个0-256位之间的值x,计算x*P,最后的结果一定会落在曲线上的一点。假设该点为X,在公开X以及具体曲线的方程的情况下,能否反推出最初的随机值x?
证:寻找x的过程只能通过暴力计算,x的可能值为0~2^{256}-1中的一个,平均来说需要计算2^{128}次能够找到一次x值。那么问题来了,运行一次2^{128}的计算需要多长的时间呢?
假设我们使用的是超级计算机,主频为1THz(一秒钟可以进行一万亿次运算),从宇宙诞生的那一刻开始计算,到现在也就进行了2^{98}次。找到x值的概率为\frac {2^{98}}{2^{128}}=\frac 1{1073741824}。这个概率和下一秒地球被巨型陨石撞击而毁灭的概率接近。
在上面的案例中,x0~256位的一个随机数,可以作为私钥。X是随机椭圆曲线上的一个点,也就是由私钥生成的公钥,因此优点可以1得证。

但是密码学中,并不能使用上面介绍的实数域上的椭圆曲线。因为

1.实数域上的椭圆曲线是连续的,有无限个点,密码学要求有限点。
2.实数域上的椭圆曲线的运算有误差,不精确。密码学要求精确。

所以我们需要引入有限域上的椭圆曲线。
要证明优点2,还需要将随机椭圆曲线做一些改动:为了保证最后计算出来的点的坐标值相加是512位,secp256k1引入了一个对质数取模的机制。具体来说,随机椭圆曲线从变为了y^2 mod\ p=(x^3+ax+b)mod\ p其中P=2256-232-29-28-27-26-24-1,是小于2^{256}的最大质数。

 2.可以通过某些方法来证明某人拥有一个公钥所对应的私钥,而此过程不会暴露关于私钥的任何信息。

这部分类似于零知识证明:我知道你能买得起这个东西,但是我不知道你到底有多少钱。

 

添加一个hash函数,简单修改可以得出:hash(m,r\cdot P)\cdot n\cdot P+r\cdot P=(hash(m,r\cdot P)*(n+r))\cdot P使n*P=X,那么可知nx。此时方程为:hash(m,r\cdot P)\cdot X+r\cdot P=(hash(m,r\cdot P)*(x+r))\cdot P为了简单起见,我们记R=r\cdot Ps=hash(m,R)*x+r。此时方程化简为:hash(m,R)\cdot X+R=s\cdot P
假设:在已知m的情况下,如果能够提供一个sR满足上面的方程,就可以证明一个人拥有x。这个假设有一个前提,如果一个人不知道x,那么他就无法提供Rs满足上面的等式。
详细探讨这个前提:如果一个人不知道x,又想计算出sR,能够办到吗?结论是不能,首先我们无法从hash(m,R)计算出R(在有限时间内)。
还有一个问题:在已知Rs的情况下,能否计算出关于x的任何信息?
根据公式:s=hash(m,R)*x+r只要解出x=\frac {s-r}{hash(m,R)}就可以了。
要想计算出x,就需要知道r,但是在r没有公开的情况下,能计算出r吗?我们知道R=r*P;但是根据这个公式无法倒推出r,所以x也是安全的。

(这部分是我在网上看到的相对好理解的证明了,来源ECDSA(椭圆曲线数字签名算法) - 简书)

 

二、代码分析

static ECDSA_SIG *sm2_do_sign(const unsigned char *dgst, int dgstlen,

 EC_KEY ecc算法中的秘钥结构体,里面包含私钥、公钥、曲线信息

一些返回空值,并直接结束的情况:

ec_group = EC_KEY_get0_group(ec_key);priv_key = EC_KEY_get0_private_key(ec_key);if (!ec_group || !priv_key) {SM2err(SM2_F_SM2_DO_SIGN, ERR_R_PASSED_NULL_PARAMETER);return NULL;}if (!(ret = ECDSA_SIG_new())) {SM2err(SM2_F_SM2_DO_SIGN, ERR_R_MALLOC_FAILURE);return NULL;}ret->r = BN_new();ret->s = BN_new();ctx = BN_CTX_new();order = BN_new();e = BN_new();bn = BN_new();if (!ret->r || !ret->s || !ctx || !order || !e || !bn) {SM2err(SM2_F_SM2_DO_SIGN, ERR_R_MALLOC_FAILURE);goto end;}if (!EC_GROUP_get_order(ec_group, order, ctx)) {SM2err(SM2_F_SM2_DO_SIGN, ERR_R_EC_LIB);goto end;}
/* convert dgst to e */i = BN_num_bits(order);
#if 0if (8 * dgstlen > i) {dgstlen = (i + 7)/8;}
#endifif (!BN_bin2bn(dgst, dgstlen, e)) {SM2err(SM2_F_SM2_DO_SIGN, ERR_R_BN_LIB);goto end;}

 计算并判断随机数k

/* use or compute k and (kG).x */if (!in_k || !in_x) {if (!sm2_sign_setup(ec_key, ctx, &k, &ret->r)) {SM2err(SM2_F_SM2_DO_SIGN, ERR_R_ECDSA_LIB);goto end;}ck = k;} else {ck = in_k;if (!BN_copy(ret->r, in_x)) {SM2err(SM2_F_SM2_DO_SIGN, ERR_R_MALLOC_FAILURE);goto end;}}

计算大整数r,并确保大整数r的合理性:如果 r=0  ,就重新选择一个k

/* r = e + x (mod n) */if (!BN_mod_add(ret->r, ret->r, e, order, ctx)) {SM2err(SM2_F_SM2_DO_SIGN, ERR_R_BN_LIB);goto end;}if (!BN_mod_add(bn, ret->r, ck, order, ctx)) {SM2err(SM2_F_SM2_DO_SIGN, ERR_R_BN_LIB);goto end;}/* check r != 0 && r + k != n */if (BN_is_zero(ret->r) || BN_is_zero(bn)) {if (in_k && in_x) {SM2err(SM2_F_SM2_DO_SIGN, SM2_R_NEED_NEW_SETUP_VALUES);goto end;} elsecontinue;}

计算大整数s,并判断其合理性,如果s等于0,重新选择k

/* s = ((1 + d)^-1 * (k - rd)) mod n *//* s = d'(k + r) - r mod n */if (!BN_mod_mul(ret->s, EC_KEY_get_ex_data(ec_key, sm2_sign_idx),bn, order, ctx)) {SM2err(SM2_F_SM2_DO_SIGN, ERR_R_BN_LIB);goto end;}if (!BN_mod_sub(ret->s, ret->s, ret->r, order, ctx)) {SM2err(SM2_F_SM2_DO_SIGN, ERR_R_BN_LIB);goto end;}
#endif/* check s != 0 */if (BN_is_zero(ret->s)) {if (in_k && in_x) {SM2err(SM2_F_SM2_DO_SIGN, SM2_R_NEED_NEW_SETUP_VALUES);goto end;}} else {break;}

 结束:

end:if (!ok) {ECDSA_SIG_free(ret);ret = NULL;}BN_free(k);BN_CTX_free(ctx);BN_free(order);BN_free(e);BN_free(bn);return ret;
}

http://chatgpt.dhexx.cn/article/LiFUrwvs.shtml

相关文章

GMSSL :SM2椭圆曲线公钥密码算法

2021SCSDUSC 一、 SM2使用素数域256位椭圆曲线 椭圆曲线参数方程: 曲线参数: p一FFFFFFFE FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF 00000000 FFFFFFFF FFFFFFFF a一FFFFFFFE FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF 00000000 FFFFFFFF FFFFFFFC b一28…

9、EIGamal公钥密码算法

目录 EIGamal公钥密码算法 一、相关数学基础 二、算法原理 三、算法详细流程 四、特点和安全性 EIGamal公钥密码算法 ElGamal公钥密码算法是1985年由塔希尔盖莫尔提出,是一个基于迪菲-赫尔曼密钥交换的非对称加密算法,是在密码协议中有着重要应用的…

【密码科普】第6期 - 密码算法和商用密码体系架构

作者| 姜钰来源| 翼安研习社发布时间|2022-01-06 1. 密码算法的分类 1.1 对称密码算法 加密和解密使用相同密钥的加密算法。 该算法又分为分组密码算法(块加密算法)和流密码算法(序列密码算法&#xff09…

密码学学习笔记(二)——对称密码算法(轻量级密码算法Twine)

文章目录 1. 分组密码(Twine)1.1 加解密方式1.1.1 加密1.1.2 密钥生成算法1.1.3 解密1.1.4 全部代码 1.2. 分组密码的模式1.2.1 ECB模式1.2.2 CBC模式1.2.3 CFB模式1.2.4 OFB模式1.2.5 CTR模式 2.序列密码 如图,对称加密算法是应用较早的加密…

中国商用密码算法SM4

中国商用密码算法SM4 2006年我国国家密码管理局公布了无线局域网产品使用的SM4密码算法。这是我国第一次公布自己的商用密码算法,意义重大,影响深远。这一举措标志着我国商用密码管理更加科学化和国际接轨。 SM4密码算法设计简洁,算法结构有…

区块链的密码算法

区块链系统包含了计算机科学过去几十年的成果:计算机网络P2P、算法、数据库、分布式系统、计算机密码学等 密码学是区块链系统安全性保障的基础技术,形象地称为区块链的骨骼 哈希算法 ■哈希算法(Hash、 散列、杂凑, 消息摘要,…

8、RSA 公钥密码算法

目录 RSA公钥密码算法 一、RSA的数学基础 二、RSA原理 三、算法详细流程 四、RSA特点 五、RSA应用 参考推荐: https://blog.csdn.net/lemon_tree12138/article/details/50696926 RSA加密算法原理_张维鹏的博客-CSDN博客_rsa加密算法原理 图解RSA算法取余和…

常用的密码算法有哪些?

我们将密码算法分为两大类。 对称密码(密钥密码)——算法只有一个密钥。如果多个参与者都知道该密钥,该密钥 也称为共享密钥。非对称密码(公钥密码)——参与者对密钥的可见性是非对称的。例如,一些参与者仅…

分组密码算法与DES算法

目录 1 分组密码的含义 1.1 分组密码介绍 1.2 分组密码的含义 1.3 分组密码的要求 2 分组密码的设计思想 2.1 分组密码的设计思想 3 分组密码的基本特点 3.1 分组密码的基本特点 3.2 分组密码的迭代结构 3.3 子密钥的生成方法 3.4 轮函数的设计准则 3.5 迭代的轮数 4…

11、国产密码算法

参考推荐: 国密SM1\ SM2\ SM3\ SM4\ SSF33算法和国际RSA算法的对应关系_小明做IT的博客-CSDN博客_ssf33算法 国密算法SM1/SM2/SM3/SM4_fengwang0301的博客-CSDN博客_sm2/sm3/sm4 国产密码算法 国产密码算法是指由国家密码研究相关机构自主研发,具有相…

密码算法应用规范

术语解释 对称算法(Symmetric key algorithm):采用相同的密钥执行加密或解密。 非对称算法(Asymmertric key algorithm,公开密钥算法):用作加密的密钥不同于用作解密的密钥,而且解密…

古典密码算法(移位密码算法、维吉尼亚算法)

古典密码算法(凯撒、维吉尼亚) A. 1-1.移位密码算法 【实验目的】 1) 学习移位密码的原理 2) 学习移密码的实现 【实验原理】 算法原理 a) 移位密码就是对26个字母进行移位操作,可以移动任意位数,这样就实现了对明文的加密…

换位密码算法

换位密码算法基本原理:先把明文按固定长度进行分组,然后对每一组的字符进行换位操作,从而实现加密。为加强安全性,可进行多次换位密码算法运算。 import random def encrypt(plainText,t):result[]lengthlen(t)temp[plainText[i:…

常见密码学算法

学习笔记 分类 密码学用于解决信息安全中的保密性,完整性,认证和不可否认性等问题。最初主要用于解决保密性。随着密码学技术的发展,逐渐应用到其它领域。 常见密码学算法:DES,AES; RSA, ECC; Hash; Signature等。 分类 对称密…

密码学基础(一)常见密码算法分类

一、密码算法分类: 密码算法主要分为三类:对称密码算法、 非对称密码算法、摘要算法。 二、对称密码算法(Symmetric-key Algorithm) 1、概念 对称加密(也叫私钥加密)指加密和解密使用相同密钥的加密算法。有时又叫传统密码算…

常用的密码算法汇总分析(动态更新ing)

常用密码算法整理汇总 常用对称加密算法常用非对称加密算法常用Hash算法国产密码关于密码算法会持续更新.... 常用对称加密算法 对称加密算法(分组加密)描述DES将明文分为64位一组、密钥64位,实际56位(64位中8位奇偶校验位)3DES执行了3次DES&…

【密码学】常见密码算法分类和运用

一、摘要算法(Digest Algorithm) 摘要算法 是指把任意长度的输入消息数据转化为固定长度的输出数据的一种密码算法,又称为 散列函数 、 哈希函数 、 杂凑函数 、单向函数 等,通常用来做数据完整性的判定,即对数据进行…

常用密码算法介绍

算法种类 根据技术特征,现代密码学可分为三类: 对称算法 说明:加密密钥和解密密钥相同,对明文、密文长度没有限制 子算法: 流密码算法:每次加密或解密一位或一字节的明文或密文 分组密码算法&#xff…

2020 shodan 配置详解

需要先注册一个号>然后才能在kali里安装并认证 官网:https://www.shodan.io 安装命令: git clone https://github.com/achillean/shodan-python.git cd shodan-python python setup.py installshodan -h 查看使用: 这个。。土味英语&am…

Python中shodan模块的使用

关于shodan的安装和使用,传送门——> 渗透测试之Shodan的安装和使用 常用 Shodan 库函数 shodan.Shodan(key) :初始化连接APIShodan.count(query, facetsNone):返回查询结果数量Shodan.host(ip, historyFalse):返回一个IP的详细…