RSA1
RSA1和RSA2是一樣的代碼。
整個然後告訴了我們大整數N,公鑰e。
然後告訴我們flag使用該私鑰e加密。加密方法就是典型的RSA,即求flag的e次方然後模N1。
根據大整數N1後面的提示,我們可以直接將N1分解,有一個在線分解大整數的網站:
得到N1=p*q=41 · 40094690950920881030683735292761468389214899724061。
因此可以計算出φ(N1)=(p-1)*(q-1)
進而可以求得e模φ(n)的逆元,即私鑰d。然後就可以對密文進行解密了。
RSA2對應的就是分解第二個整數,在factordb.com上都可以直接分解。
這兩題的exp入下:from gmpy2 import *
from binascii import *
N1 = 1643882328987756122258033147003220203957810888686501L # Can be divided by 41
N2 = 513352092060876320461180050358021687540568869136658646287263380737663567842231221L
e = 65537
num1 = 395704890252923154682805499668341909297287252738248L
num2 = 271255491209574840907848875334662527446131329118820278112741718277821867871739560L
p = 41
q = 40094690950920881030683735292761468389214899724061
f = (p - 1) * (q - 1)
d = invert(e, f)
flaghex = hex(pow(num1, d, N1))
print a2b_hex(flaghex[2:])
p = 486216689863901339784066214603244170463
q = 1055809277556001931114509627589707557375467
f = (p - 1) * (q - 1)
d = invert(e, f)
flaghex = hex(pow(num2, d, N2))
print a2b_hex(flaghex[2:])
最終結果入下:
Encode:
看代碼其實是CRC編碼,將flag每四個字符計算一次crc,然後將結果轉化爲小端級聯起來。最終想到的是暴力破解。
首先把結果轉化一下,通過如下代碼:
"a09dd84b85595004c9dedbd07f4b1b531756ea0aaa7a28fcd6a68adc0cb256fb4d5f1320".decode('hex')[::-1].encode('hex_codec')
將所有整數轉化爲大端。
得到:
20135f4dfb56b20cdc8aa6d6fc287aaa0aea5617531b4b7fd0dbdec9045059854bd89da0
然後進行爆破,爆破代碼如下:
import binascii
def crack():
crcs = set([0x20135f4d, 0xfb56b20c, 0xdc8aa6d6, 0xfc287aaa,
0x0aea5617, 0x531b4b7f, 0xd0dbdec9, 0x04505985, 0x4bd89da0])
r = xrange(33, 127)
for a in r:
for b in r:
for c in r:
for d in r:
txt = chr(a)+chr(b)+chr(c)+chr(d)
crc = binascii.crc32(txt)
if (crc & 0xFFFFFFFF) in crcs:
print txt
if __name__ == "__main__":
crack()
大約三分鐘左右,可以出結果,出來的結果因爲寫的exp不夠精緻,所以,需要自己按照語義排下序
*ctf{you_know_it_is_encode_anyway..}