ctf之py反编译求p*q%n==1

拿到一个pyc反编译,分析了一下,要求t1,t2,t3

from flag import t1, t2, t3
N = 91080783459224114417419735848141602413276894709356670475166857901383529276788422992031159L
s1 = 11411269144987772222786703496950992585276983184692849555141859373112423610294869112786252L
s2 = 58599619676130565690598871824198278116020685570207351127154648707502599199944142046246402L
s3 = 65974795812758987659130564760412992885703783478354682873750151867682024151063561297876490L
if s1 * t1 % N != 1:
    exit()
if s2 * t2 % N != 1:
    exit()
if s3 * t3 % N != 1:
    exit()
flag = hex(t1 + t2 + t3)[2:-1].decode('hex')
print flag

已知s1*t1%N==1,求t1,这其实是个数论问题,t1=ModReverse(s1,N)
链接:https://blog.csdn.net/CosmopolitanMe/article/details/78948011
解题代码:

def gcd(a, b):
    while a != 0:
        a, b = b % a, a
    return b


def findModReverse(a, m):

    if gcd(a, m) != 1:
        return None
    u1, u2, u3 = 1, 0, a
    v1, v2, v3 = 0, 1, m
    while v3 != 0:
        q = u3 // v3
        v1, v2, v3, u1, u2, u3 = (u1 - q * v1), (u2 - q * v2), (u3 - q * v3), v1, v2, v3
    return u1 % m

t1=0
t2=0
t3=0
N = 91080783459224114417419735848141602413276894709356670475166857901383529276788422992031159L
s1 = 11411269144987772222786703496950992585276983184692849555141859373112423610294869112786252L
s2 = 58599619676130565690598871824198278116020685570207351127154648707502599199944142046246402L
s3 = 65974795812758987659130564760412992885703783478354682873750151867682024151063561297876490L
t1=findModReverse(s1,N)
t2=findModReverse(s2,N)
t3=findModReverse(s3,N)

flag = hex(t1 + t2 + t3)[2:-1].decode('hex')
print flag
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值