首页 > 其他分享 >HITCON CTF 2022 Secret

HITCON CTF 2022 Secret

时间:2023-02-12 17:33:13浏览次数:61  
标签:cdot sum Secret CTF 2022 cs prod es equiv

源码

prob.py

import random, os
from Crypto.Util.number import getPrime, bytes_to_long

p = getPrime(1024)
q = getPrime(1024)
n = p * q

flag = open('flag','rb').read()
pad_length = 256 - len(flag)
m = bytes_to_long(os.urandom(pad_length) + flag)
assert(m < n)
es = [random.randint(1, 2**512) for _ in range(64)]
cs = [pow(m, p + e, n) for e in es]
print(es)
print(cs)

思路

Recover N

题目给出了64组

\[c_i\equiv m^{p+e_i} \pmod{n} \]

但是并没有给模数\(n\)。其实这类题目在N1CTF(EzDLP)以及maple师傅的另一道题目中出现过。

需要恢复模数,就需要构造出像这样的式子

\[\begin{aligned} C &\equiv 0 \pmod{n} \\ C &=Kn \end{aligned} \]

如果有两个或多个像这样子的同余式,就可以用\(\gcd(C_1, C_2)\)来恢复\(n\)。如果我们能找到多组\(a_i\),并且\(a_i\)中有正数也存在负数。使得

\[\begin{aligned} \prod c_i^a \equiv m^{p\sum{a_i}}\cdot m^{\sum{e_i\cdot a_i}}\equiv 1 \pmod{n} \end{aligned} \]

由于我们不知道\(n\),所以不能直接计算模逆,但是可以写成

\[\prod{c_{i}^{a_i}}\equiv \prod_{a_i\ge{0}}{m^{p\sum{a_i}}\cdot m^{\sum{a_ie_i}}} * \prod_{a_i<{0}}{m^{p\sum{a_i}}\cdot m^{\sum{a_ie_i}}} \equiv 1 \pmod{n} \]

两边同乘\(\prod_{a_i<{0}}{m^{p\sum{-a_i}}\cdot m^{\sum{-a_ie_i}}}\)

\[\begin{aligned} \prod{c_{i}^{a_i}}\equiv \prod_{a_i\ge{0}}{m^{p\sum{a_i}}\cdot m^{\sum{a_ie_i}}} \equiv \prod_{a_i<{0}}{m^{p\sum{-a_i}}\cdot m^{\sum{-a_ie_i}}} \pmod{n} \end{aligned} \]

移项

\[\prod_{a_i\ge{0}}{m^{p\sum{a_i}}\cdot m^{\sum{a_ie_i}}} - \prod_{a_i<{0}}{m^{p\sum{-a_i}}\cdot m^{\sum{-a_ie_i}}} \pmod{n} \equiv 0 \pmod{n} \]

\[\prod_{a_i\ge{0}}{c_{i}^{a_i}} - \prod_{a_i<{0}}{c_{i}^{-a_i}}\equiv 0 \pmod{n} \]

这样就找到了一开始说的同余式的形式。满足上面等式的\(a_i\)一定满足

  • 1 \(\sum{e_i*a_i} = 0\)

  • 2 \(\sum{a_i}=0\)

于是就可以构造格子

\[L= \left[\begin{array}{cccccc} e_0 & 1 & 1 & 0 & \cdots & 0 & 0 \\ e_1 & 1 & 0 & 1 & \cdots & 0 & 0 \\ & \vdots & & &\ddots & & \\ e_{62} & 1 & 0 & 0 & \cdots & 1 & 0 \\ e_{63} & 1 & 0 & 0 & \cdots & 0 & 1 \end{array}\right] \]

类似于背包问题的格,只不过背包问题中求解的向量只有0和1。

可以得到

\[[a_0, a_1,\cdots,a_{62}, a_{63}]\cdot L=[0, 0,a_0, a_1,\cdots,a_{62}, a_{63}] \]

由于我们要保证\([0,0, a_0, a_1, \cdots, a_{62}, a_{63}]\)在格中足够小,并且可以找到多组\(a_i\),可以在第一列和第二列乘一个大的系数。

from sage.all import *

with open('output.txt') as f:
    es = eval(f.readline().strip())
    cs = eval(f.readline().strip())

L = matrix(es).T.augment(matrix([1]*len(es)).T)
L = L.augment(matrix.identity(len(es)))
L[:, 0] *= 2**512
L[:, 1] *= 2**512
L = L.LLL()

assert sum([a*e for a, e in zip(L[0][2:], es)]) == 0
assert sum([b*e for b, e in zip(L[1][2:], es)]) == 0
assert sum(L[0]) == 0
assert sum(L[1]) == 0

实际上不只前两个向量满足等式,不过我们只需要两个\(kn\)就可以用gcd来恢复n了。

recover_n.py

def get_kn(an):
    prod_p = 1
    prod_n = 1
    for i, a in enumerate(an):
        if a < 0:
            prod_n *= cs[i]**(-a)
        else:
            prod_p *= cs[i]**(a)
    return prod_p - prod_n


n1 = get_kn(L[0][2:])
n2 = get_kn(L[1][2:])

n = gcd(n1, n2)

for i in range(2, 300):
    while n % i == 0:
        n //= i 

print(n)

可能是由于\(a_i\)比较接近的原因,在计算gcd后得到的n依然很大,但是通过遍历一些小的因数就可以得到真正的n

Common Modulus Attack

在得到n后,再来看

\[c_i\equiv m^{p+e_i}\equiv m^p\cdot m^{e_i} \]

而且\(m^p\)是固定的,利用任意两组\(c_i\)就可以消去\(m^p\)

\[\begin{aligned} c_i\equiv m^p\cdot m^{e_i} \\ c_j\equiv m^p\cdot m^{e_j} \\ c^i\cdot c_j^{-1} \equiv m^{e_i-e_j} \pmod{n} \end{aligned} \]

只要找到两个互质的\(e_i - e_j\)就可以很轻松的得到flag

common_modulus_attack.py

n = 17724789252315807248927730667204930958297858773674832260928199237060866435185638955096592748220649030149566091217826522043129307162493793671996812004000118081710563332939308211259089195461643467445875873771237895923913260591027067630542357457387530104697423520079182068902045528622287770023563712446893601808377717276767453135950949329740598173138072819431625017048326434046147044619183254356138909174424066275565264916713884294982101291708384255124605118760943142140108951391604922691454403740373626767491041574402086547023530218679378259419245611411249759537391050751834703499864363713578006540759995141466969230839

delta_e1 = es[1] - es[0]
for i in range(64):
    delta_e2 = es[i] - es[1]
    if delta_e2 > 0 and gcd(delta_e2, delta_e1) == 1:
        break
c1 = (cs[1] * inverse_mod(cs[0], n)) % n
c2 = (cs[i] * inverse_mod(cs[1], n)) % n

def attack(c1, c2, e1, e2):
    g, a, b = xgcd(e1, e2)
    if g != 1:
        return
    return power_mod(c1, a, n) * power_mod(c2, b, n) % n

m = attack(c1, c2, delta_e1, delta_e2)
from Crypto.Util.number import long_to_bytes
print(long_to_bytes(m))

flag: hitcon{K33p_ev3rythIn9_1nd3p3ndent!}

总结

整体复现下来,发现以前还是有很多细节没有弄懂,实际上很早之前就看过了maple师傅出的那道on_modulus,但是在hitcon的比赛中还有之前的N1CTF都没有用上。

标签:cdot,sum,Secret,CTF,2022,cs,prod,es,equiv
From: https://www.cnblogs.com/tr0uble/p/17114212.html

相关文章

  • HSCSEC CTF 2023部分WP
    EZSSTI?name={{''.__class__.__mro__[-1].__subclasses__()}}查看所有子类fromrequestsimport*foriinrange(300):url="http://4dcc7f0f-0e07-49e1-b2c8-b9c......
  • .NET技术分享日活动20221022
    2022年10月22日下午,个人组织举办了山东地区的第六次.NET技术分享日活动。围绕.NET、低代码LowCode、云原生CloudNative、大数据、算法等方向进行创新技术的实践分享。......
  • Visual Studio 2019 与 Visual Studio 2022的下载方式
    相信大家目前百度或者其他搜索引擎搜索到的都是2022了,那么vs2019该如何安装呢?vs2019下载地址:https://visualstudio.microsoft.com/zh-hans/thank-you-downloading-visu......
  • CSP NOIP 游记 2022
    CSP2022.9.17初赛前一天,++rp。今年flag:搞到7级钩子。2022.9.18CSP2022J1ACACBBBCADDACABFFFFFBFTTCCBTTTFCBAABCDAABCCACSP2022S1感觉考完非常不好。B......
  • 我的2022——有点卷、没学习、还羊了
    夜幕下的北京,迎来全新的一年,屏幕前的我,又到了该做年终总结的时候了。MacBook的摄像头像Moss一样,注视着我,注视着红尘。在Moss的眼中,可能所有的悲欢离合都没有什么大不了,世间......
  • 新版国家标准GB/T 28181—2022将于2023年7月1日正式实施,与GB/T 28181—2016差别有哪些
    新版国家标准GB/T28181-2022《公共安全视频监控联网系统信息传输、交换、控制技术要求》已于2022年12月30日发布,将于2023年7月1日正式实施。与GB/T28181—2016相比,除结构调......
  • 2022年最全Elasticsearch面试题附答案解析大汇总
    2022年最全Elasticsearch面试题附答案解析大汇总全部面试题答案,更新日期:01月30日,直接下载吧!下载链接:高清500+份面试题资料及电子书,累计10000+页大厂面试题PDFElasti......
  • 最新2022年Elasticsearch面试题高级面试题及附答案解析
    最新2022年Elasticsearch面试题高级面试题及附答案解析全部面试题答案,更新日期:01月30日,直接下载吧!下载链接:高清500+份面试题资料及电子书,累计10000+页大厂面试题PDF......
  • NOI2022 游记
    突然发现到现在还没写这篇游记,不过总有些事情要面对,痛定思过才能更好地重新出发虽然主要原因其实是懒得更赛前没啥好说的,前一天就看了眼自己最近做的题,还顺便回忆一下学......
  • CSP-J 2022 T2-解密
    原题目链接题目描述给定一个正整数\(k\),有\(k\)次询问,每次给定三个正整数\(n_i,e_i,d_i\),求两个正整数\(p_i,q_i\),使\(n_i=p_i\timesq_i\)、\(e_i\timesd......