首页 > 其他分享 >ECDSA 相同k值问题

ECDSA 相同k值问题

时间:2023-09-24 13:01:01浏览次数:34  
标签:enc 相同 16 s2 s1 bytes 问题 import ECDSA

K的重要性

当我们使用ECDSA进行签名的时候,k的保密性非常重要。如果我们对所以的签名操作都用一样的k或者我们的随机数生成器存在可预测性,一个攻击者可能会猜出私钥。

索尼几年前曾犯过这个错误。PlayStation 3 只能运行被索尼的进行ECDSA签名的游戏。如果我想为PlayStation 3开发了一个新的游戏,除非我从索尼获得签名值,否则我及时发布了,也运行不了这个游戏。问题是,索尼签名时用了一个静态的k值而不是随机生成的。

这么获取私钥d和随机数k?

看看这个等式 s = k^-1 (z + r*da) mod n
显然,未知数只有2个,da和k。我们买2份索尼游戏,签名值分别是(r1 , s1)、(r2, s2), 由于k值一样,故r 值也一样

s1 = k^-1 (z1 + rda) mod n等式1
s2= k^-1 (z2 + r
da) mod n等式2

等式1-等式2
s1 -s2 = k^-1 (z1 - z2) mod n
z1和z2 可以自己使用哈希算法对软件进行哈希能够获取到。s1和s2能够从前面值中获取到。所以k值就轻松的获取到了
K = (s1 -s2)^-1 * (z1 -z2) mod n
再把k值代入等式1或者等式2,就能计算da了。

例题:ecdsa:

源码:

import os
import ecdsa
import hashlib
from Crypto.Util.number import *
from Crypto.Util.strxor import strxor as xor
import secret

p = getPrime(256)
gen = lambda: p + getPrime(16)
pad = lambda m: m + os.urandom(32 - len(m) % 32)

key = os.urandom(30)
sk = ecdsa.SigningKey.from_secret_exponent(
    secexp=bytes_to_long(key),
    curve=ecdsa.SECP256k1
)
sig1 = sk.sign(data=b'This is the first message.', k=gen()).hex()
sig2 = sk.sign(data=b'Here is another message.', k=gen()).hex()
enc = xor(hashlib.sha512(key).digest(), pad(secret.flag)).hex()

print(f"{sig1 = }\n{sig2 = }\n{enc = }")
'''
sig1 = '3f4a6f288e35a4397201d246a98c1f9cfa463e67717fbbdcbd26d7fac75f875855455c2bfb355f7f593ffbe4c4bd1fc729cc129976b56905639100c8ac716b37'
sig2 = '9f563b21f0ee31b2f7a1a8c6edc8ff23b63e0a9d5dd4a699ecc3164871b4982df51bb2feb4bc06c578afd21d3e6227231dd5fe1d8440f3dcd025fd3ea68f5516'
enc = 'cc66d251bfa54954890c81dc1c607bae716573949f327db18aa1f4c0f420b8d29dc7e7ff9edb17b90306bd2aa753fc3fd4dafb9cc4b771cbdd79000ef05a40c0'
'''

wp:

from gmpy2 import *
from Crypto.Util.number import *
from Crypto.Util.Padding import pad,unpad
import ecdsa
from hashlib import *
from Crypto.Util.number import *
from Crypto.Util.strxor import strxor as xor

sig1 = '3f4a6f288e35a4397201d246a98c1f9cfa463e67717fbbdcbd26d7fac75f875855455c2bfb355f7f593ffbe4c4bd1fc729cc129976b56905639100c8ac716b37'
sig2 = '9f563b21f0ee31b2f7a1a8c6edc8ff23b63e0a9d5dd4a699ecc3164871b4982df51bb2feb4bc06c578afd21d3e6227231dd5fe1d8440f3dcd025fd3ea68f5516'
enc = 'cc66d251bfa54954890c81dc1c607bae716573949f327db18aa1f4c0f420b8d29dc7e7ff9edb17b90306bd2aa753fc3fd4dafb9cc4b771cbdd79000ef05a40c0'
# print(long_to_bytes(int(enc,16)))
p = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2F
a = 0
b = 7
n= 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141
# E = EllipticCurve(GF(p),[a,b])
# G = E(0x79BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798, 0x483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8)

r1 = int(sig1[:64], 16)
r2 = int(sig2[:64], 16)
s1 = int(sig1[64:], 16)
s2 = int(sig2[64:], 16)
enc = int(enc, 16)

z1 = sha1(b'This is the first message.').digest()
z2 = sha1(b'Here is another message.').digest()
s1_1 = inverse(s1,n)
s2_1 = inverse(s2,n)

for i in range(-2**16,2**16):
    x = (s2_1*bytes_to_long(z2) - s1_1*bytes_to_long(z1) + i)%n
    key = long_to_bytes(x * inverse(s1_1*r1 - s2_1*r2,n) % n)
    # print(sha512(key).digest())
    flag = long_to_bytes(bytes_to_long(sha512(key).digest()) ^ enc)
    if b'flag' in flag:
        print(flag)

标签:enc,相同,16,s2,s1,bytes,问题,import,ECDSA
From: https://www.cnblogs.com/JustGo12/p/17725857.html

相关文章

  • 关于wake on lan远程唤醒主机的问题,长时间关机无法远程唤醒
    英特尔在年初发布了几款低功耗的CPU,国内厂商在迷你主机领域纷纷搭载新款CPU,卖的火爆。之前关注过迷你主机这块,于是,我也入手一个迷你主机玩玩,买的是板载N100的迷你主机。使用过程中会涉及到如何远程开启主机服务,从网上查了一些方法,无碍乎就是智能插座、开机棒、开机盒子等。如何在......
  • 函数递归-汉诺塔问题
    1.问题描述:①有三根柱子X,Y,Z。X杆上有n只碟子②每次移动一块碟子,小的只能叠在大的上面③把所有碟子从X杆经Y杆全部移动到Z杆上.2.递归求解:①n<=1若只有一只碟子,直接X杆→Z杆;②n>1<1>把n-1只碟子按大小递减的次序从X杆经Z杆移动到Y杆;<2>将X杆上第n只碟子移到Z杆;<3>然后再将n-1......
  • 【机器学习 | 分类指标大全】全面解析分类评估指标:从准确率到AUC,多分类问题也不在话下
    ......
  • FreeSWITCH容器化问题之rtp端口占用
    操作系统:CentOS7.6_x64、debian11(bullseye,docker)FreeSWITCH版本:1.10.9Docker版本:23.0.6FreeSWITCH容器化带来部署便利的同时,也会遇到一些问题,比如今天要讨论的RTP端口占用问题(FreeSWITCH申请宿主机已占用的端口)。我将从以下三个方面进行展开:1)从源码层面分析FreeSWITCH......
  • 日常遇到的问题
     过滤器是受Spring管理的 可以直接注入 拦截器不行 需要给他在外层的配置给他注入进去Bean ......
  • springBoot上传文件时MultipartFile报空问题解决方法
    1.问题描述:之前用springMVC,转成springboot之后发现上传不能用。网上参考说是springboot已经有CommonsMultipartResolver了,但是我的上传后台接收的还是null。2.解决方法加入配置类importorg.springframework.context.annotation.Bean;importorg.springframework.context......
  • WebShell不能执行命令常见问题总结
    一:执行命令相关组件/函数/类和方法ASP:Wscript.shell,Shell.ApplicationASPX:ProcessStartInfo、Wscript.shell,Shell.Application...PHP:system,passthru,shell_exec,exec,popen,proc_open...JSP:Runtime.getRuntime().exec(command)...二:WebShell执行命令常见问题说明1.说明解决:可能是D盾,不......
  • WebShell不能执行命令常见问题总结
    一:执行命令相关组件/函数/类和方法ASP:Wscript.shell,Shell.ApplicationASPX:ProcessStartInfo、Wscript.shell,Shell.Application...PHP:system,passthru,shell_exec,exec,popen,proc_open...JSP:Runtime.getRuntime().exec(command)...二:WebShell执行命令常见问题说明1.说明解决:可能是D盾,不......
  • async/await 致WPF卡死问题
    问题代码:xmal:一个按钮+一个显示框 1<ButtonWidth="100"Height="50"Margin="10"Click="Button_Click">test</Button>2<TextBoxx:Name="display"Width="300"Height="300"></Te......
  • 微信小程序自定义tabbar遮挡scroll-view问题
    在使用小程序开发时,底部为自定义导航栏,在使用scroll-view滚动页面时,滚动到底部时最后一条或多条数据被导航栏遮挡,如下:解决方案:1.获取用户手机宽度和高度letdeviceWidth=wx.getSystemInfoSync().windowWidth;//获取屏幕宽度letdeviceHeight=wx.getSystemInfoSync().win......