[GUET-CTF2019]BabyRSA 1
题目给的东西
p+q : 0x1232fecb92adead91613e7d9ae5e36fe6bb765317d6ed38ad890b4073539a6231a6620584cea5730b5af83a3e80cf30141282c97be4400e33307573af6b25e2ea
(p+1)(q+1) : 0x5248becef1d925d45705a7302700d6a0ffe5877fddf9451a9c1181c4d82365806085fd86fbaab08b6fc66a967b2566d743c626547203b34ea3fdb1bc06dd3bb765fd8b919e3bd2cb15bc175c9498f9d9a0e216c2dde64d81255fa4c05a1ee619fc1fc505285a239e7bc655ec6605d9693078b800ee80931a7a0c84f33c851740
e : 0xe6b1bee47bd63f615c7d0a43c529d219
d : 0x2dde7fbaed477f6d62838d55b0d0964868cf6efb2c282a5f13e6008ce7317a24cb57aec49ef0d738919f47cdcd9677cd52ac2293ec5938aa198f962678b5cd0da344453f521a69b2ac03647cdd8339f4e38cec452d54e60698833d67f9315c02ddaa4c79ebaa902c605d7bda32ce970541b2d9a17d62b52df813b2fb0c5ab1a5
enc_flag : 0x50ae00623211ba6089ddfae21e204ab616f6c9d294e913550af3d66e85d0c0693ed53ed55c46d8cca1d7c2ad44839030df26b70f22a8567171a759b76fe5f07b3c5a6ec89117ed0a36c0950956b9cde880c575737f779143f921d745ac3bb0e379c05d9a3cc6bf0bea8aa91e4d5e752c7eb46b2e023edbc07d24a7c460a34a9a
分析:
p+q:两个质数的和
(p+1)(q+1):经过变换的乘积
e, d:公钥和私钥指数
enc_flag:加密后的密文
假如我们不知道以上是什么意思
展开 (p+1)(q+1)就是:
(p+1)(q+1) = pq + p + q + 1
= n + (p+q) + 1
把 p×q 换成 n,(p+1)(q+1) = n + (p+q) + 1
(因为我们需要解出n,所以拟了一个+1,当我们弄到了n我们就需要-1,这个就是还原就有了:这是我的见解,是不对的)
减1是因为展开式中有 +1
n = (p+1)(q+1) - (p+q) - 1
有了n,我们的下一步就是验证这个n是否在 1 到 n 之间与 n有互质的数,有几个
:φ(n) = n - (p+q) + 1
满足e × d ≡ 1 (mod φ(n))的前提是φ(n) = (p-1)(q-1)
如何判断 e 和 d 是配对的:e × d ≡ 1 (mod φ(n))
只有拿到e × d 才可以m = cᵈ mod n
明文 m = c^d mod n
把整数 m 转成字节串
flag = m.to_bytes(字节长度, 'big')
总结:
从 (p+1)(q+1) 和 p+q 推出 n
用已知的 d 和 n 解密密文 c
整数转字节串得到 flag
代码实现:
点击查看代码
pqsum = 0x1232fecb92adead91613e7d9ae5e36fe6bb765317d6ed38ad890b4073539a6231a6620584cea5730b5af83a3e80cf30141282c97be4400e33307573af6b25e2ea
p_1q_1 = 0x5248becef1d925d45705a7302700d6a0ffe5877fddf9451a9c1181c4d82365806085fd86fbaab08b6fc66a967b2566d743c626547203b34ea3fdb1bc06dd3bb765fd8b919e3bd2cb15bc175c9498f9d9a0e216c2dde64d81255fa4c05a1ee619fc1fc505285a239e7bc655ec6605d9693078b800ee80931a7a0c84f33c851740
d = 0x2dde7fbaed477f6d62838d55b0d0964868cf6efb2c282a5f13e6008ce7317a24cb57aec49ef0d738919f47cdcd9677cd52ac2293ec5938aa198f962678b5cd0da344453f521a69b2ac03647cdd8339f4e38cec452d54e60698833d67f9315c02ddaa4c79ebaa902c605d7bda32ce970541b2d9a17d62b52df813b2fb0c5ab1a5
c = 0x50ae00623211ba6089ddfae21e204ab616f6c9d294e913550af3d66e85d0c0693ed53ed55c46d8cca1d7c2ad44839030df26b70f22a8567171a759b76fe5f07b3c5a6ec89117ed0a36c0950956b9cde880c575737f779143f921d745ac3bb0e379c05d9a3cc6bf0bea8aa91e4d5e752c7eb46b2e023edbc07d24a7c460a34a9a
# 1. 计算 n
n = p_1q_1 - pqsum - 1
# 2. 解密
m = pow(c, d, n)
# 3. 转换为字节串
byte_length = (m.bit_length() + 7) // 8
flag_bytes = m.to_bytes(byte_length, 'big')
# 4. 输出结果
print("Flag:", flag_bytes.decode())
一些知识点:
在RSA中,p和q是两个大质数。n = p * q 是模数。那么,(p+1)(q+1) 是 (p+1) 乘以 (q+1)
p+1 和 q+1,然后将两个结果相乘

互质:两个数除了 1 以外没有其他公共的因数
p, q:两个大质数(保密)
n = p × q:模数(公开)
φ(n) = (p-1)(q-1):欧拉函数值(保密)
e:公钥指数(公开),满足 1 < e < φ(n) 且 gcd(e, φ(n)) = 1
d:私钥指数(保密),满足 e × d ≡ 1 (mod φ(n))
加密:c ≡ mᵉ (mod n)
解密:m ≡ cᵈ (mod n)

浙公网安备 33010602011771号