知识点:Fermat分解
首先使用openssl:
openssl rsa -text -modulus -pubin < almost_almost_almost_almost_there.pub
得到第一关的n和e(这里也可以yafu.exe)
然后使用Fermat分解,得到p和q,求得明文(即压缩包的密码)
def isqrt(n): x = n y = (x + n // x) // 2 while y < x: x = y y = (x + n // x) // 2 return x def fermat(n): x = isqrt(n) + 1 y = isqrt(x * x - n) while True: w = x * x - n - y * y if w == 0: break elif w > 0: y += 1 else: x += 1 return x+y, x-y
XtCgoEKksjKFWlqOSxqsEhK/+tsr1k5c
第二关:
上factordb.com得到:
rlSpJ6HbP+cZXaOuSPOe4pgfevGnXtLt
(其实题目作者的意思可能是:求第一个n和第二个n的gcd……)
第三关:
小素数暴力打表分解n
#!/usr/bin/env python # coding=utf-8 prime = [0 for x in range(1000000)] tot = 0 maxint = 1000000 i = 2 while i * i <= maxint: if prime[i] == 0: j = i * i while j < maxint: prime[j] = 1 j += i i += 1 i = 2 while i < maxint: if prime[i] == 0: tot += 1 prime[tot] = i i += 1 #print prime[1],prime[2] #print tot n3 = 0xBAD20CF97ED5042DF696CE4DF3E5A678CF4FB3693D3DF12DFE9FD3FD8CC8AAB8B95533E414E3FC0C377F4EE54827118B1D30561A3C741BEA7C76899789B51743E076092DF9EB05DC97EB1505CE9EB12B5AB9E10ABF56F920A58E7E00ECF05977E872834DD8584CF4AC87CB7DC50159BD962C75CBEFB6C6AC3A31A74E7D8F1E4C10D5 p = 0 q = 0 for i in xrange(1,tot+1): if n3 % prime[i] == 0: p = prime[i] q = n3 / prime[i] break print "[+]p:",p print "[+]q:",q #!/usr/bin/env python # coding=utf-8 maxint = 1000000 vis = [0 for x in range(maxint)] prime = [0 for x in range(maxint)] tot = 0 i = 2 while i < maxint: if vis[i] == 0: tot += 1 prime[tot] = i j = 1 while ((j <= tot) + (i * prime[j] < maxint) == 2): vis[i * prime[j]] = 1 if (i % prime[j] == 0): break j += 1 i += 1 i = 2 while i < maxint: if prime[i] == 0: tot += 1 prime[tot] = i i += 1 #print prime[1],prime[2] #print tot n3 = 0xBAD20CF97ED5042DF696CE4DF3E5A678CF4FB3693D3DF12DFE9FD3FD8CC8AAB8B95533E414E3FC0C377F4EE54827118B1D30561A3C741BEA7C76899789B51743E076092DF9EB05DC97EB1505CE9EB12B5AB9E10ABF56F920A58E7E00ECF05977E872834DD8584CF4AC87CB7DC50159BD962C75CBEFB6C6AC3A31A74E7D8F1E4C10D5 p = 0 q = 0 for i in xrange(1,tot+1): if n3 % prime[i] == 0: p = prime[i] q = n3 / prime[i] break print "[+]p:",p print "[+]q:",q
然后得到明文
hQdK+dKleMJqth/dofWyFaiWp3PW7jil
第四关:
wiener-attack,直接上github搜工具就好
/3aAP5dF2zmrPh9K6A4AqMLsIiYDk2C2
就得到了flag:BKPCTF{Its_not_you,_its_rsa_(that_is_broken)}
这个题降低了很多难度,因为题目有提示:
> Alice and Bob are close together, likely because they have a lot of things in common. This is why Alice asked him a small \*q\*uestion, about something cooler than a wiener
close together:yafu.exe或者Fermat
in common:考虑gcd
small question:小素数暴力
wiener:工具