步骤
步骤 1:信息提取
- 目标:从题目描述或文件中提取相关信息,如加密算法、已知参数和目标。
- 适配方式:
- 提取
p
和q
的部分已知数字,以及模数 n=p⋅qn = p \cdot qn=p⋅q。 - 读取
output.txt
中的加密结果。 - 读取
source.py
提供的加密逻辑。
- 提取
- 工具示例:
extract_rsa_parameters
:从文件中提取 RSA 参数和加密数据。parse_source_code
:分析加密逻辑并记录关键点。
步骤 2:问题建模
- 目标:将问题建模为一个数学解算问题。
- 适配方式:
- 定义 n=p⋅qn = p \cdot qn=p⋅q 和部分 p,qp, qp,q 的数字组合约束。
- 结合爆破算法,生成可能的 p,qp, qp,q 候选值。
- 工具示例:
model_rsa_problem
:将部分已知的 p,qp, qp,q 转化为约束求解模型。
步骤 3:解算核心问题
- 目标:恢复完整的 p,qp, qp,q。
- 适配方式:
- 基于部分已知数字和 nnn,暴力枚举可能的 p,qp, qp,q。
- 验证 p⋅q=np \cdot q = np⋅q=n 是否成立。
- 工具示例:
solve_rsa_primes
:使用约束求解库(如z3
或sympy
)恢复 p,qp, qp,q。
步骤 4:结构复原
- 目标:通过完整的 p,qp, qp,q 计算私钥 ddd。
- 适配方式:
- 计算 ϕ(n)=(p−1)(q−1)\phi(n) = (p-1)(q-1)ϕ(n)=(p−1)(q−1)。
- 通过 e⋅d≡1mod ϕ(n)e \cdot d \equiv 1 \mod \phi(n)e⋅d≡1modϕ(n) 计算私钥指数 ddd。
- 工具示例:
reconstruct_private_key
:用 RSA 数学公式生成私钥。
步骤 5:验证并完成任务
- 目标:使用私钥解密密文并找到 Flag。
- 适配方式:
- 使用 RSA 库(如
Crypto.PublicKey.RSA
和Crypto.Cipher.PKCS1_OAEP
)解密密文。 - 验证解密结果是否包含目标 Flag。
- 使用 RSA 库(如
- 工具示例:
decrypt_rsa_flag
:加载私钥并解密密文。verify_flag
:检查解密结果是否符合 Flag 格式。
[Very Easy] Dynastic✅
给定由加密代码输出的文本,根据代码倒推文本得到flag
[Very Easy] Primary Knowledge✅
利用了一个特殊的RSA生成过程,其中n是单个大素数,而非通常的两个素数的乘积,这使得解密只需要计算模反运算即可
[Medium] Partial Tenacity❌
恢复p和q后,根据公式计算私钥d,然后解密密文ct,最后复原flag
[Hard] Permuted❌
解决这一挑战的关键是理解和利用置换群的性质,特别是这些群中的离散对数问题(DLP)的应用
解决方案包括以下步骤:
- 首先根据给定的输出重构置换g、A、B,然后采用基于置换群DLP的密码学攻击策略来解密标志位。这涉及到将排列分解为不相交的环,并使用这些环使用中国剩余定理来计算指数。
- 然后,使用确定的指数a计算并验证用于生成AES加密密钥的共享密钥。
- 最后,使用导出的密钥解密aes加密的消息,以揭示隐藏的标志
skilift✅
这个技巧挑战是由一个加密密钥锁定的,包括一个硬件描述语言文件,暗示了密钥生成过程涉及位操作和
对十六进制值进行算术计算。通过对这些操作进行逆向工程,我们可以做到取回钥匙,打开技能,揭示旗帜