from Crypto.Util.number import * from hashlib import sha256 import random p = 104013039882501274693449938443150870046676177290878392003647959897761590749237 a = 10 b = 55 E = EllipticCurve(GF(p),[a,b]) # 创建一个椭圆曲线 O = E.order() # 计算该椭圆曲线的阶 G = E.gen(0) # 获取该椭圆曲线的一个生成元 d = random.randint(1,O-1) # 生成一个私钥
defh(message): # 计算消息的哈希值 t = sha256(message.encode('utf-8')).digest() returnint.from_bytes(t,'big')
defecdsa(k,G,d,h_,O): # 进行椭圆曲线数字签名 K = k*G x = int(K.x()) r = x % O k_ = inverse_mod(k,O) s = k_ * (h_ + r * d) % O return (r,s) message = ["Hello_world","this_is_a_meesage"] h1 = h(message[0]) h2 = h(message[1]) k = random.randint(1,O-1) sig1 = ecdsa(k,G,d,h1,O) sig2 = ecdsa(k,G,d,h2,O) # k的复用 print(f"(r1,s1) = {sig1}") print(f"(r2,s2) = {sig2}") #print(f"flag=flag{{{str(d)}}}") """ (r1,s1) = (40006709387573641419946125303569413158469101955768758583457507808179101337206, 1585768849918578394723965791955160503009311951479720516547647283934983942200) (r2,s2) = (40006709387573641419946125303569413158469101955768758583457507808179101337206, 85267507776229139224293234455627206003745480460349166116613720730622564486718) """
from Crypto.Util.number import * from hashlib import sha256 import random p = 104013039882501274693449938443150870046676177290878392003647959897761590749237 a = 10 b = 55 E = EllipticCurve(GF(p),[a,b]) # 创建一个椭圆曲线 O = E.order() # 计算该椭圆曲线的阶 G = E.gen(0) # 获取该椭圆曲线的一个生成元 d = random.randint(1,O-1) # 生成一个私钥
curve = NIST256p n = curve.order G = curve.generator #print(curve.curve) print(G.x()) print(G.y()) #print(n) private_key = SigningKey.from_secret_exponent(random.randrange(1, n), curve=curve) d = private_key.privkey.secret_multiplier public_key = private_key.get_verifying_key()
messages = [ b"Hello player, welcome to L3HCTF 2025!", b"This is a crypto challenge, as you can probably tell.", b"It's about ECDSA, a very... robust algorithm.", b"I'm sure there are no implementation flaws whatsoever.", b"Anyway, here are your signatures. Good luck!", f"Oh, and the flag is L3HCTF{{{d}}}. Don't tell anyone!".encode(), ] nonce_generator = FlawedNonceGenerator(n) f = open('signatures.txt', 'w')
for i inrange(6): k = nonce_generator.generate_nonce() message = messages[i] h = int.from_bytes(hashlib.sha256(message).digest(), 'big') R = k * curve.generator # 计算R r = R.x() % n # 取Rx % n 为r s_inv = pow(k, -1, n) # k^(-1) mod n s = (s_inv * (h + d * r)) % n #s = k^(-1) * (h+d*r) # ki = a*k_i-1 **2 + b*k_i-1 + c % n f.write(f"h: {h}, r: {r}, s: {s}\n") print(f"Oh, and the flag is L3HCTF{{{d}}}. Don't tell anyone!".encode())