[Zer0pts2020]ROR

源码:

import random
from secret import flag

ror = lambda x, l, b: (x >> l) | ((x & ((1<<l)-1)) << (b-l))

N = 1
for base in [2, 3, 7]:
    N *= pow(base, random.randint(123, 456))
e = random.randint(271828, 314159)

m = int.from_bytes(flag, byteorder='big')
assert m.bit_length() < N.bit_length()

for i in range(m.bit_length()):
    print(pow(ror(m, i, m.bit_length()), e, N))

好久没做过这么简单的题了,下午已经快让lfsr搞疯了

分析ror函数,就是让m右移i位,然后把这个i位移到前面,是一个循环位移

但是这个i位移不移到前面不重要,因为最后print的就是依次打印m右移i位的e次方模n,奇数相乘还是奇数,也就是二进制最后一位是1那么多少次方都是1,所以我们取chall每个数的二进制最后一位拼起来,因为打印的时候是从m的低位开始打的,所以将二进制倒序才是真正的m

chall=open('chall.txt').read().split()
mm=[]
for i in chall:
    mm.append(int(i))
m=''
for i in mm:
    m+=bin(i)[-1]
from Crypto.Util.number import long_to_bytes
m=int(m[::-1],2)
print(long_to_bytes(m))

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Paintrain

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值