DSA理解理解蓝桥杯例题signature

一、历史

  1991年8月,NIST(Nation Institute of Standards and Technology,美国国家标准技术研究所)提出了数字签名算法(DSA)用于他们的数字签名标准(DSS)中。

DSA是算法,DSS是标准。标准采用算法,算法是标准的一部分。但是NIST的通告引起了大量谴责,这些谴责的政治性多于学术性。许多已经取得RSA算法专利许可权的大型软件公司也站出来反对DSS,他们已经投入大量的资金来实现RSA算法,他们当然不希望这些资金白白流失。 1994年5月19日,该标准最终颁布。

二、DSA算法的描述

  DSA是Schnorr和ElGamal签名算法的变形,该算法的安全性依赖于计算模数的离散对数的难度。

DSA签名中的公钥:

p比特数为64 的倍数的素数,512~1024位的素数(可以在一组用户中共享)
q160位长(这里对q qq的大小限制准确来说是不大于哈希函数H输出的长度),并与 p-1 互素的因子(可以在一组用户中共享)
总之( p , q ) 的大小一般是( 1024 , 160 ) , ( 2048 , 224 ) , ( 2048 , 256 ) ,(3072,256),,单位比特
g

image-20240506112128429

y

image-20240506112159506

DSA签名中的私人密钥:

公钥为( p , q , g , y ) 私钥为( x )

DSA签名算法中的签名过程:

k选取小于q的随机数
r(签名)

image-20240506115342963

s(签名)

image-20240506115403425

签名结果为( r , s )

DSA签名算法中的验证过程:

image-20240506115510366

对消息m签名时:

(1)Alice产生一个的随机数 k,k<q。 (2)Alice产生:        r = (gk mod p) mod q        s = (k-1 ( H(m)+xr ))mod q 其中,r 和 s 就是她的签名,她将它们发给 Bob。 (3)Bob通过计算来验证签名:        w = s-1 mod q        u1 = (H(m)×w) mod q        u2 = (rw) mod q        v = ((gu1 × yu2) mod p) mod q 如果, v=r,则签名有效。

image-20240506120306909

三、 DSA的素数的产生

NIST在【1154】中推荐了一种产生素数 p 和q 的方法,其中 q 能整除 p-1。 素数 p 为 L 位,介于 512~1024 位,是 64 的倍数。 素数 q 为 160 位。 设 L-1=160n+6 (1)选取一个至少 160 位的任意序列,称为 S。设 g 是 S 的位长度。 (2)计算 U=SHA(S)⊕ SHA((S+1)mod 2g),SHA是安全散列算法 (3)将U的 最高位 和 最低位 置为 1 形成 q (4)检验 q 是否是素数 (5)如果 q 不是素数,则回到(1) (6)设 C=0,N=2 (7)对 k=0,1,·······,n,令Vk = SHA((S+N+k)mod 2g ) (8)令W=V0 + 2160V1+······+2160(n-1)Vn-1 + 2160n(Vn mod 2b),W为整数,且X=W+2L-1。注意 X 是 L 为长的数。 (9)令p=X-((X mod 2q)-1)。注意 p 同余1 模 2q。 (10)若 p<2L-1,转到(13)步 (11)检测 p 是否为素数 (12)如果 p 是素数,转到(15)步 (13)令C=C+1,N=N+n+1 (14)如C=4096,转到第(1)步;否则,转到第(7)步 (15)将用于产生 p 和 q 的 S 和 C 值保存起来 在文献【1154】中,变量S称为“种子”,C称为“计数”,N称为“偏差” 单向散列函数SHA的使用能防止他人在背后做手脚。 这样做的安全性比RSA高,在RSA中,素数是秘密保存的。某人可能产生假素数或容易分解的特殊形式的素数,除非你知道私人密钥,否则你不知道这一点。而这里,即使你不知道私人密钥,你也可以确信 p 和 g 是随机产生的。

四、DSA的安全性

512位的DSA不能提供长期的安全性,但是1024位可以。

五、攻击k

  每个签名都需要一个新值 k,并且该值必须是随机选择的。 如果 Eve 恢复了 Alice 用来签名消息的 k,她就可以恢复 Alice 的私人密钥 x 。如果Eve获得了使用同一个 k 签名的两个消息,即使她不知道 k 的任何情况,也可以恢复 x 。拥有了 k ,Eve 就可以产生 Alice 的签名。在DSA实现中,一个好的随机数发生器对系统安全是至关重要的。

补充:可以使用DSA函数进行 ElGamal加密 和 RSA加密。

ECDSA

ECDSA是ECC与DSA的结合,整个签名过程与DSA类似,所不一样的是签名中采取的算法为ECC,最后签名出来的值也是分为r,s。

签名过程如下:

1、选择一条椭圆曲线Ep(a,b),和基点G; 2、选择私有密钥k(k<n,n为G的阶),利用基点G计算公开密钥K=kG; 3、产生一个随机整数r(r<n),计算点R=rG; 4、将原数据和点R的坐标值x,y作为参数,计算SHA1做为hash,即Hash=SHA1(原数据,x,y); 5、计算s≡r - Hash * k (mod n) 6、r和s做为签名值,如果r和s其中一个为0,重新从第3步开始执行

验证过程如下:

1、接受方在收到消息(m)和签名值(r,s)后,进行以下运算 2、计算:sG+H(m)P=(x1,y1), r1≡ x1 mod p。 3、验证等式:r1 ≡ r mod p。 4、如果等式成立,接受签名,否则签名无效。

重复利用K的后果:

image-20240506150406645

例题-蓝桥杯-signature

题目内容:

椭圆曲线数字签名算法,它利用椭圆曲线密码学(ECC)对数字签名算法(DSA)进行模拟,其安全性基于椭圆曲线离散对数问题。但是当某些数值相同时会出现一些安全问题。

题目代码

import ecdsa
import random
​
def ecdsa_test(dA,k):
​sk = ecdsa.SigningKey.from_secret_exponent(secexp=dA,curve=ecdsa.SECP256k1)sig1 = sk.sign(data=b'Hi.', k=k).hex()sig2 = sk.sign(data=b'hello.', k=k).hex()
​r1 = int(sig1[:64], 16)s1 = int(sig1[64:], 16)s2 = int(sig2[64:], 16)return r1,s1,s2
​
if __name__ == '__main__':n = 0xfffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141a = random.randint(0,n)flag = 'flag{' + str(a) + "}"b = random.randint(0,n)print(ecdsa_test(a,b))
​
# (4690192503304946823926998585663150874421527890534303129755098666293734606680, 111157363347893999914897601390136910031659525525419989250638426589503279490788, 74486305819584508240056247318325239805160339288252987178597122489325719901254)

分析代码可以看出,存在随机数重复使用。具体来说,这段代码中签名的过程中使用了相同的随机数 k 来对不同的消息进行签名。这种情况下,可以通过分析两个相同 k 值对应的消息签名来恢复私钥 dA

ECDSA 中,每次签名过程中都会使用一个随机数 k,以确保生成唯一的签名。然而,如果相同的随机数 k 被重复使用来对不同的消息进行签名,攻击者就有可能通过数学分析和推导计算出私钥 dA

解密脚本

import sympy
from hashlib import sha1
from Cryptodome.Util.number import long_to_bytes , bytes_to_long
​
​
def calculate_private_key(r1, s1, s2, h1, h2, n):# 计算k值k = ((h1 - h2) * sympy.mod_inverse(s1 - s2, n)) % n# 计算私钥dAdA = (sympy.mod_inverse(r1, n) * (k * s1 - h1)) % nreturn dA
​
​
​
if __name__ == "__main__":# 定义椭圆曲线的参数n = 0xfffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141# 签名中的r1, s1, s2值r1 = 4690192503304946823926998585663150874421527890534303129755098666293734606680s1 = 111157363347893999914897601390136910031659525525419989250638426589503279490788s2 = 74486305819584508240056247318325239805160339288252987178597122489325719901254h1 = bytes_to_long(sha1(b'Hi.').digest())h2 = bytes_to_long(sha1(b'hello.').digest())private_key = calculate_private_key(r1, s1, s2, h1, h2, n)print(f'flag{{{private_key}}}')
​
# flag{40355055231406097504270940121798355439363616832290875140843417522164091270174}
椭圆曲线密码中的签名整数k相同攻击利用。因为k值相同,所以r值也是相同的。题目中给到了使用相同的k进行两次签名的结果,那根据:s1 = k^-1 (z1 + rda) mod n
s2 = k^-1 (z2 + rda) mod n
s1 - s2 = k^-1 (z1 - z2) mod n
K = (s1-s2)^-1 * (z1 -z2) mod n
得到k,最后再代入原式便能解出da了,即本题中的flag,完整exp:from gmpy2 import *
from Crypto.Util.number import *
from hashlib import *
​
n= 0xfffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141
​
r1 = 4690192503304946823926998585663150874421527890534303129755098666293734606680
r2 = 4690192503304946823926998585663150874421527890534303129755098666293734606680
s1 = 111157363347893999914897601390136910031659525525419989250638426589503279490788
s2 = 74486305819584508240056247318325239805160339288252987178597122489325719901254z1 = sha1(b'Hi.').digest()
z2 = sha1(b'hello.').digest()
s1_1 = inverse(s1, n)
s2_1 = inverse(s2, n)
​
def check(key):for i in range(len(key)):if key[i] < 32 or key[i] > 127:return 0return 1x = (s2_1*bytes_to_long(z2) - s1_1*bytes_to_long(z1))%n
key = x*inverse(s1_1*r1-s2_1*r2, n)%n
​
print(key)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/835972.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

双向带头循环链表(图解)

文章目录 头节点(哨兵位)双向循环结构头插尾插头删尾删在指定位置之前插入数据删除指定位置之前的数据销毁链表 全部代码结语 单链表地址 头节点(哨兵位) 什么是头节点呢?头节点也叫哨兵节点,他在链表中进行不了任何操作,只是用来放哨用的,在单链表中我们当我们尾插的时候我们…

使用Flask构建POST请求的Web应用

文章目录 准备工作创建路由处理POST请求创建表单页面运行应用结论 在Web开发中&#xff0c;处理POST请求是一项常见任务&#xff0c;特别是在构建表单提交、用户注册和数据提交等功能时。Flask是一个简单而强大的Python Web框架&#xff0c;它提供了方便的工具来处理HTTP请求&a…

文章解读与仿真程序复现思路——电力自动化设备EI\CSCD\北大核心《考虑微电网联盟协调运行的用户侧共享储能多计费方式博弈定价方法》

本专栏栏目提供文章与程序复现思路&#xff0c;具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 电网论文源程序-CSDN博客电网论文源…

打开远程连接的命令是什么?

远程连接是一种能够在不同设备之间建立连接并共享信息的技术。在许多情况下&#xff0c;我们需要通过远程连接来访问其他设备或处理一些远程任务。本文将介绍一些常用的打开远程连接的命令。 使用SSH连接远程设备 SSH&#xff08;Secure Shell&#xff09;是一种安全的网络协议…

Matlab/simulink永磁直驱风机的建模仿真

Matlab/simulink直驱永磁同步风机的建模仿真&#xff0c;跟随风速波动效果好&#xff0c;可以作为后期科研的基础模型

达索电磁仿真软件CST查看方式和消除2D/3D图的反射效果【官方教程】

消除2D/3D图的反射效果 查看和分析2D/3D结果时消除不必要的反射效果 View > Options > View Options > Specials 正面看CST软件的3D场分布图时&#xff0c;如下图所示&#xff0c;因为反射效果导致无法看清楚。本章节介绍一下相应的解决方法。 因为View Options的S…

RabbitMQ的用途

RabbitMQ主要有四个用途&#xff0c;分别是应用解耦、异步提速、削峰填谷、消息分发。详情讲解如下&#xff1a; RabbitMQ介绍、解耦、提速、削峰、分发 详解、RabbitMQ安装 可视化界面讲解 1.应用解耦&#xff1a;提高系统容错性和可维护性 2.异步提速&#xff1a;提升用户体验…

【18-Ⅰ】Head First Java 学习笔记

HeadFirst Java 本人有C语言基础&#xff0c;通过阅读Java廖雪峰网站&#xff0c;简单速成了java&#xff0c;但对其中一些入门概念有所疏漏&#xff0c;阅读本书以弥补。 第一章 Java入门 第二章 面向对象 第三章 变量 第四章 方法操作实例变量 第五章 程序实战 第六章 Java…

PyCharm粘贴失灵?一文教你快速恢复!(如何解决Pycharm无法粘贴的问题)

文章目录 💢 问题 💢🏡 演示环境 🏡💯 解决方案 💯⚓️ 相关链接 ⚓️💢 问题 💢 "为什么你的代码编辑器突然变得不听话了?"最近在使用pycharm的时候遇到了一个问题,就是在pycharm中无法使用粘贴功能,后面经过一番折腾得到了解决,现在将我的解决…

scanf留下的那一片云彩

【题目描述】 给出一个由O和X组成的串&#xff08;长度为1&#xff5e;80&#xff09;&#xff0c;统计得分。每个O的得分为目前连续出现的O的个数&#xff0c;X的得分为0。例如&#xff0c;OOXXOXXOOO的得分为1200100123。 输入第一行表示有n个字符串&#xff0c;后续是n行字…

自然资源-城镇开发边界内详细规划编制技术指南解读

自然资源-城镇开发边界内详细规划编制技术指南解读

Xilinx 千兆以太网TEMAC IP核 AXI4-Lite接口信号

在AX4总线标准中&#xff0c;AXI4-Lite主要由向她址映射型通信。TEMAC的管理法口采用AXI4-Lite标准接口&#xff0c;TEMAC核的AX14-Lite接口信号如表1所示&#xff0c;根据AX14-Lite标准&#xff0c;接口角色分为主接口(Maser Interface)和从接口(Slave Interface)。主接口为通…

收放卷伺服控制系统详细算法介绍(电子齿轮+张力PID卷绕轴控制功能块)

收放卷控制系统涉及的内容非常多,这里我们介绍全伺服系统利用电子齿轮指令实现主从轴的比例随动速度控制,收放卷控制算法介绍常用链接如下 1、收放卷+排线控制 收放卷+排线控制系统框图-CSDN博客文章浏览阅读24次。1、收放卷前馈量计算FC收放卷前馈量计算FC(CODESYS ST源代…

以太ETH链市值机器人

在数字资产交易市场的浪潮中&#xff0c;如何高效地管理市值、提升交易流动性并保障资金安全&#xff0c;一直是交易所和项目方关注的焦点。市值管理机器人飞机//aishutuyu以太ETH链市值机器人凭借其卓越的功能和强大的安全保障&#xff0c;为数字资产交易市场带来了革命性的变…

乡村旅游指标-最美乡村数、旅游示范县数、旅行社数、景区数、农家乐数(2007-2021年)

01、数据介绍 乡村旅游也是促进乡村经济发展的有效途径。通过发展乡村旅游&#xff0c;可以带动乡村相关产业的发展&#xff0c;提高乡村居民的收入&#xff0c;促进乡村的经济发展和社会进步。此外&#xff0c;乡村旅游还能促进城乡交流&#xff0c;推动城乡统筹发展。 数据…

【自动驾驶|毫米波雷达】非相参积累与恒虚警率检测

目录 非相参积累&#xff08;Non-coherent combing&#xff09; 1. 非相参积累是什么? 2. 为什么要进行非相参积累&#xff1f; 3. 如何实现非相参积累&#xff1f; 恒虚警率检测&#xff08;CFAR&#xff1a;Constant False Alarm Rate&#xff09; 1.CFAR概念引入 2. C…

几个Python处理Excel实际应用

下面介绍四个不同类型的Python处理Excel的经典应用案例&#xff0c;以帮助读者更好地掌握Python处理Excel的技能。 一、读取Excel数据 Python通过pandas库可以轻松地读取Excel数据。pandas库是一个专门用于数据分析和处理的库&#xff0c;它可以将Excel中的数据读取为DataFra…

【CTF MISC】XCTF GFSJ0513 pdf Writeup(PDF隐写)

pdf 菜猫给了菜狗一张图&#xff0c;说图下面什么都没有 解法 打开 pdf&#xff0c;只看见一张图片。 用浏览器搜索 flag&#xff0c;发现图片中间藏了一行字。 复制出来&#xff0c;得到 flag。 Flag flag{security_through_obscurity}声明 本博客上发布的所有关于网络攻…

vivado Kintex-7 配置存储器器件

Kintex-7 配置存储器器件 下表所示闪存器件支持通过 Vivado 软件对 Kintex -7 器件执行擦除、空白检查、编程和验证等配置操作。 本附录中的表格所列赛灵思系列非易失性存储器将不断保持更新 &#xff0c; 并支持通过 Vivado 软件对其中所列非易失性存储器 进行擦除、…

Apache Flume概述

Apache Flume概述 1.Flume定义 ​ Flume是cloudera(CDH版本的hadoop) 开发的一个分布式、可靠、高可用的海量日志收集系统。 它将各个服务器中的数据收集起来并送到指定的地方去&#xff0c;比如说送到HDFS、Hbase&#xff0c;简单来说flume就是收集日志的。 2.Flume基础架构…