defadd(A, B): if A == (0, 0): return B if B == (0, 0): return A x1, y1 = A x2, y2 = B if A != B: λ = (y2 - y1) * pow((x2 - x1), p - 2, p) else: λ = (x1 * x1 * 3 + a) * pow(2 * y1, p - 2, p) x3 = λ * λ - x1 - x2 y3 = λ * (x1 - x3) - y1 return (x3 % p, y3 % p)
if __name__ == '__main__': p = 15424654874903 a = 305423748 b = 315284355172 G = (15079176652031, 83237376468) k = 655321 C = (0, 0) for i inrange(k): C = add(C, G) print(C) print(C[0] ^ C[1])
defdecrypt(cipher, box): res = [] i = j = 0 cipher = base64.b64decode(cipher).decode() for s in cipher: i = (i + 1) % 256 j = (j + box[i]) % 256 box[i], box[j] = box[j], box[i] t = (box[i] + box[j]) % 256 k = box[t] res.append(chr(ord(s) ^ k)) for r in res: print(r, end='')
# baby_rsa c = 10037709916698055005402119185691833127096330074819596592018139982119855547820 n = 73069886771625642807435783661014062604264768481735145873508846925735521695159 e = 65537
思路
给出了 RSA 加密的c(密文)、n、e,则考虑先将 n 大数分解得到 p 和 q,再根据 RSA 加密的原理求解 d,并根据解密公式求解明文 m,最后将 m 转换成 bytes 格式,得到 flag值。
解密脚本
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
from Crypto.Util.number import long_to_bytes
n = 73069886771625642807435783661014062604264768481735145873508846925735521695159 p = 189239861511125143212536989589123569301 q = 386123125371923651191219869811293586459 c = 10037709916698055005402119185691833127096330074819596592018139982119855547820 e = 65537 phi_n = (p - 1) * (q - 1) k = 0 whileTrue: if (k * phi_n + 1) % e == 0: d = (k * phi_n + 1) // e break k += 1 print("d值为:", d) m = pow(c, d, n) print("m值为:", m) print(long_to_bytes(m))
心得
本题我最后没有求解成功,按理说就是很常规的 RSA 加密求解,但是本题出的很坑的一点在于题目并没有说明最后需要对明文 m 进行 long_to_bytes() 的处理,这很容易让解题者误以为是明文求解错误。不过另一方面也反映了我对于将整型数据转换成字节数据这一知识点的缺失。
MISC
easy_disk
问题描述
题目给出了一个名为 bomb.img 的磁盘文件,查找 flag 值。
思路
dishgenius 打开虚拟磁盘文件 bomb.img,打开后点击右边窗口的“浏览文 件”,发现三个0字节的空文件,点击软件上面的“恢复文件”,得到一个 ZIP 压缩包和一个 txt 文件。