实现 RSA 破解
在该网站 http://factordb.com/ 上分解 n,得到 p、q 如下:
1 2
| p = 2499568793 q = 4568695582742345507136251229217400959960856046691733722988345503429689799935696593516299458516865110324638359470761456115925725067558499862591063153473862179550706262380644940013531317571260647226561004191266100720745936563550699000939117068559232225644277283541933064331891245169739139886735615435506152070330233107807124410892978280063993668726927377177983100529270996547002022341628251905780873531481682713820809147098305289391835297208890779643623465917824350382592808578978330348769060448006691307027594085634520759293965723855183484366752511654099121387261343686017189426761536281948007104498017003911
|
然后编写 RSA 解密脚本如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| import gmpy2 import libnum
n = ... e = 65537 c = ...
p = 2499568793 q = ...
def Decrypt(c, e, p, q): L = (p - 1) * (q - 1) d = gmpy2.invert(e, L) n = p * q m = gmpy2.powmod(c, d, n) print(libnum.n2s(int(m)))
Decrypt(c, e, p, q)
|
执行得到结果如下:

实现容差隐写脚本将二维码写入图片中
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| from PIL import Image
background = Image.open("background.png") qr = Image.open("QR.png") x, y = qr.height, qr.width
for i in range(0, x): for j in range(0, y): lastrgb = background.getpixel((i, j)) QRrgb = qr.getpixel((i, j)) if str(QRrgb) == "(255, 255, 255)": background.putpixel((i, j), lastrgb) else: lastrgb = (lastrgb[0], lastrgb[1], lastrgb[2] - 5) background.putpixel((i, j), lastrgb)
background.save('output.png')
|
使用 Stepsovle.jar 工具打开输出的 output.png 文件,然后选择 Analyse 中的 Image Combiner,选择没有进行隐写的原图。通过底下的箭头符号,将两张图片的运算方式修改为 sub,即可得到我们隐写的二维码。

扫描即可得到结果如下:

MD5 算法求解 flag
FLAG IS:flag{www_shiyanbar_com_is_very_good_???}
MD5:38e4c352809e150186920aac37190cbc
对于这道题,我们使用穷举来解决,不过算法的复杂度达到了 108 这个级别,为了加快求解的速度,我们可以结合多线程来实现。代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| import hashlib from multiprocessing.dummy import Pool as ThreadPool
target = "38e4c352809e150186920aac37190cbc"
def check(x): for i in range(33, 128): for j in range(33, 128): for k in range(33, 128): temp = chr(x) + chr(i) + chr(j) + chr(k) flag = "flag{www_shiyanbar_com_is_very_good_%s}" % temp md5 = hashlib.md5() md5.update(flag.encode("utf-8")) if md5.hexdigest() == target: print(flag)
x = [i for i in range(33, 128)] pool = ThreadPool(10) pool.map(check, x)
|
结果如下:

用自己的语言描述 base64 编码
Base64 编码是一种将二进制数据转换为 ASCII 字符的编码方式。它将每 3 个字节的二进制数据转换为 4 个 ASCII 字符,因此会使编码后的数据长度增加约 33%。具体地,它将每个字节拆分成两个 4 比特的部分,每个 4 比特部分对应一个 ASCII 字符。编码过程中,如果剩余字节数不足 3 个,则会用 0 补齐,最后加上若干个等号表示补齐的字节数。解码过程则是将每个 ASCII 字符转换为对应的 6 比特的二进制数据,再将这些二进制数据拼接在一起,最后去掉可能存在的末尾的 0。