NetDream2025
EzRSA
1 | import sys |
先说一个非预期的解法吧
因为这里的e=3,所以我们可以直接对m开三次方这样可以得到flag
1 | from gmpy2 import iroot |
再说说预期的解法
1 | def generate_close_primes(bit_size, diff): |
这里就是生成两个相邻素数p,q
其中q是p + DIFF的下一个素数
我们可以用费马分解求出p,q
1 | from math import isqrt |
这里我们发现e与phi不互素
1 | GCD(e, phi) = 3 |
因为这里很小,我们可以用公约数暂约来做
1 | from math import isqrt |
Quaternion Lock
1 | import random |
这里一个基于四元数的加密系统,这篇文章有介绍
qmul(q1, q2, p): 四元数乘法(模p)- 计算两个四元数
q1和q2的乘积,并对每个分量取模p。
- 计算两个四元数
qconj(q, p): 四元数共轭- 返回四元数
q的共轭(即(a, -b, -c, -d))。
- 返回四元数
qnorm(q, p): 四元数范数(模长的平方)- 计算
a² + b² + c² + d² mod p。
- 计算
qinv(q, p): 四元数逆元- 通过共轭和范数的逆元计算四元数的乘法逆元。
qpow(q, exp, p): 四元数的快速幂- 使用快速幂算法计算四元数
q的exp次幂
- 使用快速幂算法计算四元数
这里flag被分为四个部分,然后转为整数
1 | def encode_flag(flag): |
同时给了三个参数
1 | p = 9223372036854775783 |
生成密钥
1 | h = qpow(g, ((p * p - 1) // subgroup_order), p) |
加密等式
1 | K_inv = qinv(K, p) |
现在需要先恢复K
我们直接枚举爆破出K,然后算出K_inv
最后F_q = K_inv * X * K mod p
1 | def qmul(q1, q2, p): |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 yskm!
