CryptoHack_rsa_SIGNATURES PART 1

Signing Server

比较简单,给了密文,去pow d就出来了。

p = remote('socket.cryptohack.org', 13374)
a=p.recvline().strip()
p.sendline('{"option": "get_secret"}')
a=p.recvline().strip()
bb=json.loads(a.decode())
print(bb['secret'])
p.sendline('{"option": "sign", "msg": "'+bb['secret']+'"}')
c=p.recvline().strip()
bb=json.loads(c.decode())
dd=bb['signature']
print(dd)
dd=int(dd[2:],16)
print(long_to_bytes(dd))

Let's Decrypt

vefiry中N E可控,操作空间大,SIGNATURE%(SIGNATURE-digest)==digest

r = pwn.remote('socket.cryptohack.org', 13391)

def json_recv():
    line = r.recvline()
    return json.loads(line.decode())

def json_send(hsh):
    request = json.dumps(hsh).encode()
    r.sendline(request)

r.recvline()
json_send({"option": "get_signature"})
line = json_recv()
print(line)
msg = "I am Mallory own CryptoHack.org"
rr = re.match(r'^I am Mallory.*own CryptoHack.org$', msg)
print(rr)
digest = emsa_pkcs1_v15.encode(msg.encode(), 256)
json_send({"option": "verify", "msg": msg, "N" : hex(int(line["signature"], 16) - bytes_to_long(digest)), "e" : hex(1)})
received = json_recv()
print(received)

Blinding Light

获取pow(2,d,n)和pow(2*m,d,n)可以算出pow(m,d,n),解决

ADMIN_TOKEN = b"admin=True"
m0=bytes_to_long(ADMIN_TOKEN)
print(m0)
N=0x954e1412ba207b8a246ea515e81425aeb5471cf5062b6497b2c76312ccf150498779ca540464b09fe573df68b0cfdcac124ba799b8546b45b49eaae9fadd630d1b5562a9993c6a3da72d5222e24aa6e1f9c663bfd07f31f0cdef87a54f2fbf7151afc3fd329bd16692dcfa6794c3d94d00fb2e11b49557a491be3e510f0c3e22163487df65e54d68f43a3ecea44e48dc929f2d321c6bfdb2c6c233c704e0618041ace0be91f637f423e6161b36a1fe0f04445ee1f48dc5960659706bbcb97c1667c5f17d0f2395dad348a88f3efb7fa06f99f7963749679eb697cd178fce6f65cfee5b6c9c36096c96f5b5532a6a3b44127afe27f10015dd71a644d455f800d5
e=0x10001

r = pwn.remote('socket.cryptohack.org', 13376)

def json_recv():
    line = r.recvline()
    return json.loads(line.decode())

def json_send(hsh):
    request = json.dumps(hsh).encode()
    print(request)
    r.sendline(request)

r.recvline()
json_send({"option": "get_pubkey"})
line = json_recv()
print(line)
json_send({"option": "sign","msg":"02"})
line = json_recv()
print(line)
c0=int(line["signature"][2:],16)
print(c0)
m0=m0*2
json_send({"option": "sign","msg":hex(m0)[2:]})
line = json_recv()
print(line)
c1=int(line["signature"][2:],16)
print(c1)
c=invert(c0,N)*c1%N
json_send({"option": "verify","msg":hex(bytes_to_long(ADMIN_TOKEN))[2:],"signature":hex(c)[2:]})
line = json_recv()
print(line)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值