<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>yizhixiaojiuli-Blog</title>
  
  <subtitle>从零开始的CTF crypto之旅</subtitle>
  <link href="http://www.yizhixiaojiuli.cn/atom.xml" rel="self"/>
  
  <link href="http://www.yizhixiaojiuli.cn/"/>
  <updated>2025-12-15T08:29:00.000Z</updated>
  <id>http://www.yizhixiaojiuli.cn/</id>
  
  <author>
    <name>玖离</name>
    
  </author>
  
  <generator uri="https://hexo.io/">Hexo</generator>
  
  <entry>
    <title>2025-hscctf-wp</title>
    <link href="http://www.yizhixiaojiuli.cn/2025/11/18/2025-hscctf-wp/"/>
    <id>http://www.yizhixiaojiuli.cn/2025/11/18/2025-hscctf-wp/</id>
    <published>2025-11-18T09:00:00.000Z</published>
    <updated>2025-12-15T08:29:00.000Z</updated>
    
    <content type="html"><![CDATA[<h2 id="ancient"><a href="#ancient" class="headerlink" title="ancient"></a>ancient</h2><p>Base58 → Base62 → Base45 → Base85 → Base32 → Base64<br>按照这个顺序加密的，对着反向解密即可</p><p>密文:<br><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">RzVJVFlaSkZGUk1HV1daWkdOQ0RFNEpJSE5RWEdOS05ISlNHSTNCT0daWVVXS1pDRzQzV01UQ0NISkVTNElKQkdKUkZFUEpYRjVIVk0zMlpIQVpXNjQyTkdaSlRBNFMzR1pKVENPMllIVjJWWVRMQ0daTERDTVpYR0JURk1TMlpHQlRWR0xDWkdaS1ZRWUo1R0ZURVFRSlNHQlRGNFQyTUc1SVRHUURFSFU3REVZSkVHNVdFS1FEUEdKUEVJS1NYRzQ0RkNRU0lITkNIQ1NaUEdWWlc0UlJZR1pZSEdRVFBHSVVXSVMzQkc0M0RHMkJIRzQ0R1lLU0VHQlFBPT09PQ==</span><br></pre></td></tr></table></figure></p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">flag&#123;cl@ss1cal_c1pher_@re_really_1nterest1ng&#125;</span><br></pre></td></tr></table></figure><h2 id="sign-in"><a href="#sign-in" class="headerlink" title="sign_in"></a>sign_in</h2><p>题目：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br></pre></td><td class="code"><pre><span class="line">from Crypto.Util.number import *</span><br><span class="line">from gmpy2 import *</span><br><span class="line">import random</span><br><span class="line"></span><br><span class="line">get_context().precision = 2048</span><br><span class="line"></span><br><span class="line">L = 5</span><br><span class="line">S = getPrime(144)</span><br><span class="line">a = getPrime(32)</span><br><span class="line">b = random.randint(0, S - 1)</span><br><span class="line"></span><br><span class="line">def split_and_pad_single_char_rule(msg, L):</span><br><span class="line">    segments = []</span><br><span class="line">    assert L &gt;= 1</span><br><span class="line">    pad_len = L - 1</span><br><span class="line">    for char_idx, char_byte in enumerate(msg):</span><br><span class="line">        char_ascii = char_byte</span><br><span class="line">        pad_bytes = bytes([(char_ascii + i + 1) % 256 for i in range(pad_len)])</span><br><span class="line">        seg_bytes = bytes([char_byte]) + pad_bytes</span><br><span class="line">        segments.append(bytes_to_long(seg_bytes))</span><br><span class="line">    return segments</span><br><span class="line"></span><br><span class="line">def encrypt_segment(m_i, a, b, M):</span><br><span class="line">    return (a * m_i + b) % M</span><br><span class="line"></span><br><span class="line">flag = &quot;flag&#123;___________________&#125;&quot;</span><br><span class="line">msg_bytes = flag.encode()</span><br><span class="line">m_segments = split_and_pad_single_char_rule(msg_bytes, L)</span><br><span class="line">c_segments = [encrypt_segment(mi, a, b, S) for mi in m_segments]</span><br><span class="line"></span><br><span class="line">print(f&quot;a = &#123;a&#125;&quot;)</span><br><span class="line">print(f&quot;S = &#123;S&#125;&quot;)</span><br><span class="line">print(f&quot;L = &#123;L&#125;&quot;)</span><br><span class="line">print(f&quot;C = &#123;c_segments&#125;&quot;)</span><br><span class="line">print(f&#x27;M = &#123;m_segments&#125;&#x27;)</span><br><span class="line"></span><br><span class="line">&#x27;&#x27;&#x27;</span><br><span class="line">a = 3517115977</span><br><span class="line">S = 13338196046628817705384101887069807236659077</span><br><span class="line">L = 5</span><br><span class="line">C = [6399813929853868574459915097120849511644924, 6399813929853868574460006087942330564102834, 6399813929853868574459839271436281967929999, 6399813929853868574459930262257763020387909, 6399813929853868574460233564996033195247609, 6399813929853868574460112243900725125303729, 6399813929853868574459111344864433548266719, 6399813929853868574459930262257763020387909, 6399813929853868574460036418216157581588804, 6399813929853868574459808941162454950444029, 6399813929853868574459111344864433548266719, 6399813929853868574460036418216157581588804, 6399813929853868574459808941162454950444029, 6399813929853868574460127409037638634046714, 6399813929853868574459096179727520039523734, 6399813929853868574459930262257763020387909, 6399813929853868574459899931983936002901939, 6399813929853868574460127409037638634046714, 6399813929853868574459945427394676529130894, 6399813929853868574459172005412087583238659, 6399813929853868574460097078763811616560744, 6399813929853868574459808941162454950444029, 6399813929853868574460188069585292669018654, 6399813929853868574459960592531590037873879, 6399813929853868574460188069585292669018654, 6399813929853868574459960592531590037873879, 6399813929853868574460263895269860212733579]</span><br><span class="line">&#x27;&#x27;&#x27;</span><br></pre></td></tr></table></figure><p>解题思路:</p><p>很直白的一个题，把flag的每个字符都处理为长度5的字节段，填充字节的规则为：</p><ul><li>第一个字节为flag的第i个字符</li><li>后面的字节为flag的第i个字符的ascii码加i再对256取模</li></ul><p>然后对每个字节段 ( m_i ) 进行线性变换：</p><script type="math/tex; mode=display">c_i = (a \times m_i + b) \mod S</script><p>给出了$a、S、L、C$,因为我们已知flag头，所以我们可以据此来回推出$b$,从而得到$M$。</p><p>exp:<br><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br></pre></td><td class="code"><pre><span class="line">#python</span><br><span class="line">from Crypto.Util.number import *</span><br><span class="line"></span><br><span class="line">a = 3517115977</span><br><span class="line">S = 13338196046628817705384101887069807236659077</span><br><span class="line">L = 5</span><br><span class="line">C = [6399813929853868574459915097120849511644924, 6399813929853868574460006087942330564102834, 6399813929853868574459839271436281967929999, 6399813929853868574459930262257763020387909, 6399813929853868574460233564996033195247609, 6399813929853868574460112243900725125303729, 6399813929853868574459111344864433548266719, 6399813929853868574459930262257763020387909, 6399813929853868574460036418216157581588804, 6399813929853868574459808941162454950444029, 6399813929853868574459111344864433548266719, 6399813929853868574460036418216157581588804, 6399813929853868574459808941162454950444029, 6399813929853868574460127409037638634046714, 6399813929853868574459096179727520039523734, 6399813929853868574459930262257763020387909, 6399813929853868574459899931983936002901939, 6399813929853868574460127409037638634046714, 6399813929853868574459945427394676529130894, 6399813929853868574459172005412087583238659, 6399813929853868574460097078763811616560744, 6399813929853868574459808941162454950444029, 6399813929853868574460188069585292669018654, 6399813929853868574459960592531590037873879, 6399813929853868574460188069585292669018654, 6399813929853868574459960592531590037873879, 6399813929853868574460263895269860212733579]</span><br><span class="line"></span><br><span class="line">def construct_m_from_char(char, L):</span><br><span class="line">    char_ascii = ord(char)</span><br><span class="line">    pad_len = L - 1</span><br><span class="line">    pad_bytes = bytes([(char_ascii + i + 1) % 256 for i in range(pad_len)])</span><br><span class="line">    seg_bytes = bytes([ord(char)]) + pad_bytes</span><br><span class="line">    return bytes_to_long(seg_bytes)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">known_chars = [&#x27;f&#x27;, &#x27;l&#x27;, &#x27;a&#x27;, &#x27;g&#x27;]</span><br><span class="line">derived_b = []</span><br><span class="line">for idx, char in enumerate(known_chars):</span><br><span class="line">    m_i = construct_m_from_char(char, L)</span><br><span class="line">    b = (C[idx] - a * m_i) % S</span><br><span class="line">    derived_b.append(b)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">b = derived_b[0]</span><br><span class="line">print(f&quot;推导出的私钥b = &#123;b&#125;&quot;)</span><br><span class="line"></span><br><span class="line">a_inv = inverse(a, S)</span><br><span class="line"></span><br><span class="line">flag = &quot;&quot;</span><br><span class="line">M = []</span><br><span class="line">for c in C:</span><br><span class="line">    m_i = ((c - b) % S) * a_inv % S</span><br><span class="line">    M.append(m_i)</span><br><span class="line">    seg_bytes = long_to_bytes(m_i)</span><br><span class="line">    original_char = chr(seg_bytes[0])</span><br><span class="line">    flag += original_char</span><br><span class="line"></span><br><span class="line">print(flag)</span><br><span class="line">#flag&#123;s1gn_1n_t0geth5r_xixi&#125;</span><br></pre></td></tr></table></figure></p><h2 id="where"><a href="#where" class="headerlink" title="where"></a>where</h2><p>题目：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br></pre></td><td class="code"><pre><span class="line">from Crypto.Util.number import *</span><br><span class="line">import random</span><br><span class="line"></span><br><span class="line">flag = &quot;flag&#123;_______________________________&#125;&quot;</span><br><span class="line">m = bin(bytes_to_long(flag.encode()))[2:]</span><br><span class="line">p = getPrime(300)</span><br><span class="line">q = getPrime(300)</span><br><span class="line">n = p * q</span><br><span class="line"></span><br><span class="line">R.&lt;x&gt; = PolynomialRing(Zmod(n))</span><br><span class="line"></span><br><span class="line">def gen(m):</span><br><span class="line">    C = []</span><br><span class="line">    for bit in m:</span><br><span class="line">        if bit == &#x27;0&#x27;:</span><br><span class="line">            C.append(random.randint(1, n-1))</span><br><span class="line">        else:</span><br><span class="line">            x = random.randint(1, 2^80)</span><br><span class="line">            y = random.randint(1, p-1)</span><br><span class="line">            val = 65537 + x*(1-x) +(q - x)*y + (y + x)*(q + x)</span><br><span class="line">            C.append(R(val))</span><br><span class="line">    return C</span><br><span class="line"></span><br><span class="line">c = gen(m)</span><br><span class="line">print(f&quot;n = &#123;n&#125;&quot;)</span><br><span class="line">print(f&quot;c = &#123;c&#125;&quot;)</span><br></pre></td></tr></table></figure><p>output.txt太长了就不放出来了，想要的师傅可以去<a href="https://ctf.hscsec.cn/">hscctf</a>的靶场下载(虽然可能还没更新)</p><p>解题思路：<br>一个小decision:<br><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">0: c_i为mod(n)的随机数</span><br><span class="line">1: c_i为65537 + x*(1-x) +(q - x)*y + (y + x)*(q + x) --&gt;  65537 + qx + 2qy + x</span><br></pre></td></tr></table></figure><br>我们可以发现对于1的方程模q下，会有一个80bit的小根x，所以copper会有解，而0则没有,所以我们可以以此做出decision</p><p>exp:<br><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><span class="line">#sage</span><br><span class="line">from Crypto.Util.number import *</span><br><span class="line">n = </span><br><span class="line">c = </span><br><span class="line">flag = &quot;&quot;</span><br><span class="line"></span><br><span class="line">PR.&lt;x&gt; = PolynomialRing(Zmod(n))</span><br><span class="line">for i in range(len(c)):</span><br><span class="line">    f = x - c[i]</span><br><span class="line">    res = f.small_roots(X=2^80,beta=0.49)</span><br><span class="line">    if(res != []):</span><br><span class="line">        flag += &quot;1&quot;</span><br><span class="line">    else:</span><br><span class="line">        flag += &quot;0&quot;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">print(long_to_bytes(int(flag,2)))</span><br><span class="line">#flag&#123;where_1s_th5_flag_where&#125;</span><br></pre></td></tr></table></figure></p><h2 id="stillRSA"><a href="#stillRSA" class="headerlink" title="stillRSA"></a>stillRSA</h2><p>题目：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br></pre></td><td class="code"><pre><span class="line">from Crypto.Util.number import *</span><br><span class="line">from gmpy2 import *</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">def gen():</span><br><span class="line">    while(1):</span><br><span class="line">        p1 = getPrime(128)</span><br><span class="line">        p2 = getPrime(512)</span><br><span class="line">        q2 = getPrime(512)</span><br><span class="line">        s = q2 &amp; ((1 &lt;&lt; 56) - 1)</span><br><span class="line">        q1 = 2 * p1 + s</span><br><span class="line">        r1 = 2 * q1 + s</span><br><span class="line">        if is_prime(q1) and is_prime(r1):</span><br><span class="line">            n1 = p1 * q1 * r1</span><br><span class="line">            n2 = p2 * q2</span><br><span class="line">            break</span><br><span class="line">    return n1,n2,p1,p2</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">n1,n2, p1, p2 = gen()</span><br><span class="line">e = 65537</span><br><span class="line"></span><br><span class="line">flag = &quot;flag&#123;---------------------------------------&#125;&quot;.encode()</span><br><span class="line">m1 = bytes_to_long(flag[: (len(flag)+1) // 2])</span><br><span class="line">m2 = bytes_to_long(flag[(len(flag)+1) // 2 :])</span><br><span class="line"></span><br><span class="line">c1 = powmod(m1, e, n1)</span><br><span class="line">c2 = powmod(m2, e, n2)</span><br><span class="line"></span><br><span class="line">gift = p2 &gt;&gt; 262</span><br><span class="line"></span><br><span class="line">print(f&quot;e = &#123;e&#125;&quot;)</span><br><span class="line">print(f&quot;n1 = &#123;n1&#125;&quot;)</span><br><span class="line">print(f&quot;n2 = &#123;n2&#125;&quot;)</span><br><span class="line">print(f&quot;c1 = &#123;c1&#125;&quot;)</span><br><span class="line">print(f&quot;c2 = &#123;c2&#125;&quot;)</span><br><span class="line">print(f&quot;p1 = &#123;p1&#125;&quot;)</span><br><span class="line">print(f&quot;gift = &#123;gift&#125;&quot;)</span><br><span class="line"></span><br><span class="line">&#x27;&#x27;&#x27;</span><br><span class="line">e = 65537</span><br><span class="line">n1 = 153535945724301761635048132162798014938917969845079448489545851494873442295873133893384411532854581537976576911336083</span><br><span class="line">n2 = 84803188245030813883191077133506154725049469687779805365997839479650548017159380111143407950887981137367898417071670318175553216747909857623397932606557900805065642334402683077054566841962022705300815246585360967197421835628665369002004215185956537117678561509558467837953178340079218753108643544534307300779</span><br><span class="line">c1 = 91344805342373294041484814707589753503672726499268929615405258196853851463816933913580106446612439099622637694719344</span><br><span class="line">c2 = 65030067863230521561732635665855986696538207379818716373900645903663706519394086998921178373079966943522635174648820466855368885032783946013202871621053763074374114131710373913193434831822631037825109588592562599802388631816046111419285162200967000421088941791542557891726383026274591733889350668008350880276</span><br><span class="line">p1 = 267735952598198080786845163083151774667</span><br><span class="line">gift = 1068605981024067598428983610552162240530726981658336444437430658822896756780</span><br><span class="line">&#x27;&#x27;&#x27;</span><br></pre></td></tr></table></figure><p>解题思路：<br>可以观察到这是一个双重RSA:</p><ul><li>p1是一个128位的素数，p2和q2是一个512位的素数</li><li>s是q2的低56位</li><li>q1 = 2 * p1 + s</li><li>r1 = 2 * q1 + s</li></ul><ol><li>已知 $n_1$ 和 $p_1$，且 $q_1$、$r_1$ 均与 $p_1$ 相关，可在 $\mod(n_1 // p_1)$ 下通过 Copper 算法求解 $s$，进而还原 $q_1$ 和 $r_1$；</li><li>已知 $gift = p_2 &gt;&gt; 262$，且 $s$ 为 $q_2$ 的低 56 位，可通过以下方式还原 $p_2$ 的低 56 位：<br>$n_2 \times \text{inverse}(s, 2^{56}) \mod 2^{56}$</li><li>基于上述结果，再次通过 Copper 算法还原 $p_2$；</li><li>最终分别解两个 RSA 即可完成解题。</li></ol><p>exp:</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br></pre></td><td class="code"><pre><span class="line">#sage</span><br><span class="line">from Crypto.Util.number import *</span><br><span class="line">from gmpy2 import *</span><br><span class="line"></span><br><span class="line">e = 65537</span><br><span class="line">n1 = 153535945724301761635048132162798014938917969845079448489545851494873442295873133893384411532854581537976576911336083</span><br><span class="line">n2 = 84803188245030813883191077133506154725049469687779805365997839479650548017159380111143407950887981137367898417071670318175553216747909857623397932606557900805065642334402683077054566841962022705300815246585360967197421835628665369002004215185956537117678561509558467837953178340079218753108643544534307300779</span><br><span class="line">c1 = 91344805342373294041484814707589753503672726499268929615405258196853851463816933913580106446612439099622637694719344</span><br><span class="line">c2 = 65030067863230521561732635665855986696538207379818716373900645903663706519394086998921178373079966943522635174648820466855368885032783946013202871621053763074374114131710373913193434831822631037825109588592562599802388631816046111419285162200967000421088941791542557891726383026274591733889350668008350880276</span><br><span class="line">p1 = 267735952598198080786845163083151774667</span><br><span class="line">gift = 1068605981024067598428983610552162240530726981658336444437430658822896756780</span><br><span class="line"></span><br><span class="line">PR.&lt;x&gt; = PolynomialRing(Zmod(n1//p1))</span><br><span class="line">f = (2*p1 + x)*(4*p1 + 3*x)</span><br><span class="line">res1 = f.monic().small_roots(X=2^56,beta=0.4)</span><br><span class="line">print(res1)</span><br><span class="line">s = int(res1[0])</span><br><span class="line">q1 = 2 * p1 + s</span><br><span class="line">r1 = 2 * q1 + s</span><br><span class="line">d1 = inverse(e , (p1 - 1)*(q1 - 1) * (r1 - 1))</span><br><span class="line">m1 = powmod(c1, d1, n1)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">p2l = n2 * inverse(s, 2 ** 56) % 2 ** 56</span><br><span class="line">PR.&lt;x&gt; = PolynomialRing(Zmod(n2))</span><br><span class="line">g = gift * (2 ** 262) + x * 2 ** 56 + p2l</span><br><span class="line">res2 = g.monic().small_roots(X=2^206,beta=0.4)</span><br><span class="line">print(res2)</span><br><span class="line">p2 = gift * (2 ** 262) + int(res2[0]) * 2 ** 56 + p2l</span><br><span class="line">q2 = n2 // p2</span><br><span class="line">d2 = inverse(e, (p2-1)*(q2-1))</span><br><span class="line">m2 = powmod(c2, d2, n2)</span><br><span class="line"></span><br><span class="line">print(long_to_bytes(m1) + long_to_bytes(m2))</span><br><span class="line">#flag&#123;Im_a_fw_that_only_crafts_RSA_challenges&#125;</span><br></pre></td></tr></table></figure><h2 id="EZRSA"><a href="#EZRSA" class="headerlink" title="EZRSA"></a>EZRSA</h2><p>题目：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br></pre></td><td class="code"><pre><span class="line">from Crypto.Util.number import *</span><br><span class="line"></span><br><span class="line">def tran(n):</span><br><span class="line">s_bin = bin(n)[2:]</span><br><span class="line">bit_map = &#123;&#x27;0&#x27;: &#x27;10&#x27;, &#x27;1&#x27;: &#x27;01&#x27;&#125;</span><br><span class="line">p_bin = &#x27;11&#x27; + &#x27;&#x27;.join([bit_map[bit] for bit in s_bin[1:]])</span><br><span class="line">return int(p_bin, 2)</span><br><span class="line"></span><br><span class="line">def keygen(nbit):</span><br><span class="line">while True:</span><br><span class="line">s = getPrime(nbit)</span><br><span class="line">p = tran(s)</span><br><span class="line">if not isPrime(p):</span><br><span class="line">continue</span><br><span class="line">s_bin = bin(s)[2:].zfill(nbit)</span><br><span class="line">q_bin = (s_bin[:nbit // 2]</span><br><span class="line"> + &#x27;1&#x27; * (nbit // 2)</span><br><span class="line"> + s_bin[nbit // 2:]</span><br><span class="line"> + &#x27;1&#x27; * (nbit // 2))</span><br><span class="line">q = int(q_bin, 2)</span><br><span class="line">if isPrime(q):</span><br><span class="line">return p,q</span><br><span class="line"></span><br><span class="line">flag = &quot;flag&#123;____________________________&#125;&quot;</span><br><span class="line">nbit = 256</span><br><span class="line">p, q = keygen(nbit)</span><br><span class="line">m = bytes_to_long(flag.encode())</span><br><span class="line">e= 65537</span><br><span class="line">n = p * q</span><br><span class="line">c = pow(m, e, n)</span><br><span class="line"></span><br><span class="line">print(f&#x27;n = &#123;n&#125;&#x27;)</span><br><span class="line">print(f&#x27;c = &#123;c&#125;&#x27;)</span><br><span class="line"></span><br><span class="line">&quot;&quot;&quot;</span><br><span class="line">n = 97500437901440388417198788454954892885829765317271438600836638419723842224011100091990654907349042873594131382232421640267091732569264390052236076620148372084122607139079558728860385251369576795723604753566616558793072715394596559965112752835650808765911364805382628147988309718393764596614456741590220757591</span><br><span class="line">c = 7738615614182124736230909980262535479827406389377664909203540758689122759528168600427345931034997504030657746278863273550729288326235414854206217548620396163736109673531409510422631464901846302450760457216706035370273167926580473904029057693564485585891556568420324605915383565319685765532478198539656924536</span><br><span class="line">&quot;&quot;&quot;</span><br></pre></td></tr></table></figure><p>我们可以发现:</p><ul><li>先生成256位的素数s</li><li>p由256位的s，通过0变成10，1变成01的方式拓展成的512位的素数，其中首两位是11</li><li>q是前128的s+128位的1+后128位的s+128位的1得到的</li></ul><p>解题思路：</p><p>很明显是一个剪枝问题，按照生成方式约束一下深搜即可</p><p>exp:<br><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br></pre></td><td class="code"><pre><span class="line">#python</span><br><span class="line"></span><br><span class="line">from Crypto.Util.number import *</span><br><span class="line"></span><br><span class="line">nbit = 256</span><br><span class="line">e = 65537</span><br><span class="line">n = 97500437901440388417198788454954892885829765317271438600836638419723842224011100091990654907349042873594131382232421640267091732569264390052236076620148372084122607139079558728860385251369576795723604753566616558793072715394596559965112752835650808765911364805382628147988309718393764596614456741590220757591</span><br><span class="line">c = 7738615614182124736230909980262535479827406389377664909203540758689122759528168600427345931034997504030657746278863273550729288326235414854206217548620396163736109673531409510422631464901846302450760457216706035370273167926580473904029057693564485585891556568420324605915383565319685765532478198539656924536</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">def dfs(h, s_prefix, p_prefix):</span><br><span class="line">    p_remain = 2 * nbit - len(p_prefix)</span><br><span class="line">    p_max = int(p_prefix + &quot;1&quot; * p_remain, 2)</span><br><span class="line">    p_min = int(p_prefix + &quot;0&quot; * p_remain, 2)</span><br><span class="line"></span><br><span class="line">    s_half = nbit // 2</span><br><span class="line">    s_len = len(s_prefix)</span><br><span class="line">    s_remain = nbit - s_len</span><br><span class="line"></span><br><span class="line">    if s_len &lt;= s_half:</span><br><span class="line">        q_pre0 = (s_prefix + &quot;0&quot; * (s_half - s_len)</span><br><span class="line">                  + &quot;1&quot; * s_half</span><br><span class="line">                  + &quot;0&quot; * s_half</span><br><span class="line">                  + &quot;1&quot; * s_half)</span><br><span class="line">        q_pre1 = (s_prefix + &quot;1&quot; * (s_half - s_len)</span><br><span class="line">                  + &quot;1&quot; * s_half</span><br><span class="line">                  + &quot;1&quot; * s_half</span><br><span class="line">                  + &quot;1&quot; * s_half)</span><br><span class="line">    else:</span><br><span class="line">        s_pre128 = s_prefix[:s_half]</span><br><span class="line">        s_suf_cur = s_prefix[s_half:]</span><br><span class="line">        q_pre0 = (s_pre128 + &quot;1&quot; * s_half</span><br><span class="line">                  + s_suf_cur + &quot;0&quot; * (s_half - (s_len - s_half))</span><br><span class="line">                  + &quot;1&quot; * s_half)</span><br><span class="line">        q_pre1 = (s_pre128 + &quot;1&quot; * s_half</span><br><span class="line">                  + s_suf_cur + &quot;1&quot; * (s_half - (s_len - s_half))</span><br><span class="line">                  + &quot;1&quot; * s_half)</span><br><span class="line"></span><br><span class="line">    q_max = int(q_pre1, 2)</span><br><span class="line">    q_min = int(q_pre0, 2)</span><br><span class="line"></span><br><span class="line">    if q_max * p_max &lt; n or q_min * p_min &gt; n:</span><br><span class="line">        return</span><br><span class="line"></span><br><span class="line">    if h == nbit:</span><br><span class="line">        p = p_max</span><br><span class="line">        q = int(s_prefix[:s_half] + &quot;1&quot; * s_half + s_prefix[s_half:] + &quot;1&quot; * s_half, 2)</span><br><span class="line"></span><br><span class="line">        if p * q != n:</span><br><span class="line">            return</span><br><span class="line">        if isPrime(p) and isPrime(q):</span><br><span class="line">            phi = (p - 1) * (q - 1)</span><br><span class="line">            d = inverse(e, phi)</span><br><span class="line">            flag = long_to_bytes(pow(c, d, n))</span><br><span class="line">            print(f&quot;flag: &#123;flag.decode()&#125;&quot;)</span><br><span class="line">            print(f&quot;p = &#123;p&#125;&quot;)</span><br><span class="line">            print(f&quot;q = &#123;q&#125;&quot;)</span><br><span class="line">            exit()</span><br><span class="line">        return</span><br><span class="line"></span><br><span class="line">    dfs(h + 1, s_prefix + &quot;0&quot;, p_prefix + &quot;10&quot;)</span><br><span class="line">    dfs(h + 1, s_prefix + &quot;1&quot;, p_prefix + &quot;01&quot;)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">dfs(1, s_prefix=&quot;1&quot;, p_prefix=&quot;11&quot;)</span><br><span class="line">#flag&#123;n1ce_th1s_RSA_I_can_do_it&#125;</span><br></pre></td></tr></table></figure></p><h2 id="abg"><a href="#abg" class="headerlink" title="abg"></a>abg</h2><p>题目：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br></pre></td><td class="code"><pre><span class="line">from Crypto.Util.number import *</span><br><span class="line"></span><br><span class="line">def ECC(bit):</span><br><span class="line">    g = getPrime(bit)</span><br><span class="line">    a = getPrime(bit)</span><br><span class="line">    b = getPrime(bit)</span><br><span class="line"></span><br><span class="line">    E = EllipticCurve(GF(g),[a,b])</span><br><span class="line">    J = E.random_point()</span><br><span class="line">    K = E.random_point()</span><br><span class="line">    L = E.random_point()</span><br><span class="line"></span><br><span class="line">    r = getPrime(bit // 2)</span><br><span class="line">    k = getPrime(16)</span><br><span class="line"></span><br><span class="line">    s  = r * J</span><br><span class="line">    s1 = r * J + k * L</span><br><span class="line">    s2 = r * k * J</span><br><span class="line"></span><br><span class="line">    return L.xy(), s.xy(), s1.xy(), s2.xy(), K.xy()</span><br><span class="line"></span><br><span class="line">def RSA(m, s, bit):</span><br><span class="line">    p = getPrime(bit)</span><br><span class="line">    q = getPrime(bit)</span><br><span class="line">    rr = getPrime(bit)</span><br><span class="line">    n = p * q</span><br><span class="line"></span><br><span class="line">    gift = pow(rr, rr * (p-1), n)</span><br><span class="line">    enc = pow(m, int(s), n)</span><br><span class="line"></span><br><span class="line">    return gift, n, enc</span><br><span class="line"></span><br><span class="line">flag = &quot;flag&#123;--------------------------------&#125;&quot;</span><br><span class="line">m = bytes_to_long(flag.encode())</span><br><span class="line"></span><br><span class="line">L, s, s1, s2, K = ECC(256)</span><br><span class="line">gift, n, enc = RSA(m, abs(int(s[0] - s[1])), 512) </span><br><span class="line"></span><br><span class="line">print(&quot;L =&quot;, L)</span><br><span class="line">print(&quot;s1 =&quot;, s1)</span><br><span class="line">print(&quot;s2 =&quot;, s2)</span><br><span class="line">print(&quot;K =&quot;, K)</span><br><span class="line">print(&quot;enc =&quot;, enc)</span><br><span class="line">print(&quot;gift =&quot;, gift)</span><br><span class="line">print(&quot;n =&quot;, n)</span><br><span class="line"></span><br><span class="line">&#x27;&#x27;&#x27;</span><br><span class="line">L = (5612832632021037413595021905856059690922175615680426850888866965067320107819, 44286844991960812568914524464365492264373223903614475371204877844888511445056)</span><br><span class="line">s1 = (3105425529931638108939225244969805843864193431777172585017902596003213488900, 21204057924591170352686471525538286905154747896755584173932333298433282086561)</span><br><span class="line">s2 = (17163600514231693116809112204202083823354850361231568034507586407851022654385, 54523130652066750636213932541583111123904814992668862332727980305098543395332)</span><br><span class="line">K = (84626796737477467367556465702814556148204747766624017939626441693356336891461, 20412858373065309258609569831347478221615957387864164638932871773748933195219)</span><br><span class="line">enc = 77779248799562415787538731320739960822457760506615718084036279480880899171418681853821326436404494983875803921684003465855970542931724878457768817162166413967384579329072032251210520838992258491716245608876204830909672245330785235016998427930933850050898878548191256398496024681498083646200326639489612460844</span><br><span class="line">gift = 27203859362379532209762716293585970661584968016465564915669656593570376250661463300469214869975225133883120425672896040102408082124157996563344160198308488970094544684114508100388704667496464400261830996514109943777210955076236899363247079300339008914936852187908757699066223721473477803084358704291887973927</span><br><span class="line">n = 99350851709648177478181442570691890135193362203180628334780894515389735176666242281991349782055218048443285160186921692026870729324336754641181928398906259668775047724023372863155472201773397077316170491389813660679924150036914095032544796724427607899057109320556570067643629947815982002736525967748207154359</span><br><span class="line">&#x27;&#x27;&#x27;</span><br></pre></td></tr></table></figure><p>解题思路:<br>其实就是很直白的ECC+RSA,其中flag本质上是被RSA加密了，其中隐藏了加密指数为ECC上的一个点s的横纵坐标之差的绝对值<br>虽然没有给出abg，但是给出了四个点L, s1, s2, K，所以我们可以通过任意取两个点有:</p><script type="math/tex; mode=display">k_1 p = y_1^2 - \left(x_1^3 + a x_1 + b\right)</script><script type="math/tex; mode=display">k_2 p = y_2^2 - \left(x_2^3 + a x_2 + b\right)</script><p>之后我们可以通过$gcd(k_1, k_2)$再消除一些小因子来得到g，之后再还原a和b<br>又因为给出了<script type="math/tex">gift = pow(rr, rr * (p-1), n)</script>,根据费马小定理我们可以得到<script type="math/tex">rr^{(p-1)} ≡ 1 mod p</script><br>所以我们可以通过$gcd(gift-1, n)$来得到p，之后解RSA即可</p><p>exp:<br><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br></pre></td><td class="code"><pre><span class="line">#sage</span><br><span class="line">from Crypto.Util.number import *</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">L = (5612832632021037413595021905856059690922175615680426850888866965067320107819, 44286844991960812568914524464365492264373223903614475371204877844888511445056)</span><br><span class="line">s1 = (3105425529931638108939225244969805843864193431777172585017902596003213488900, 21204057924591170352686471525538286905154747896755584173932333298433282086561)</span><br><span class="line">s2 = (17163600514231693116809112204202083823354850361231568034507586407851022654385, 54523130652066750636213932541583111123904814992668862332727980305098543395332)</span><br><span class="line">K = (84626796737477467367556465702814556148204747766624017939626441693356336891461, 20412858373065309258609569831347478221615957387864164638932871773748933195219)</span><br><span class="line">enc = 77779248799562415787538731320739960822457760506615718084036279480880899171418681853821326436404494983875803921684003465855970542931724878457768817162166413967384579329072032251210520838992258491716245608876204830909672245330785235016998427930933850050898878548191256398496024681498083646200326639489612460844</span><br><span class="line">gift = 27203859362379532209762716293585970661584968016465564915669656593570376250661463300469214869975225133883120425672896040102408082124157996563344160198308488970094544684114508100388704667496464400261830996514109943777210955076236899363247079300339008914936852187908757699066223721473477803084358704291887973927</span><br><span class="line">n = 99350851709648177478181442570691890135193362203180628334780894515389735176666242281991349782055218048443285160186921692026870729324336754641181928398906259668775047724023372863155472201773397077316170491389813660679924150036914095032544796724427607899057109320556570067643629947815982002736525967748207154359</span><br><span class="line"></span><br><span class="line">temp1 = (s2[1] ** 2 - s1[1] ** 2 - s2[0] ** 3 + s1[0] ** 3)</span><br><span class="line">temp2 = (L[1] ** 2 - s2[1] ** 2 - L[0] ** 3 + s2[0] ** 3)</span><br><span class="line">temp3 = (K[1] ** 2 - L[1] ** 2 - K[0] ** 3 + L[0] ** 3)</span><br><span class="line">k1g = temp1 * (L[0] - s2[0]) - temp2 * (s2[0] - s1[0])</span><br><span class="line">k2g = temp2 * (K[0] - L[0]) - temp3 * (L[0] - s2[0])</span><br><span class="line">k3g = temp1 * (K[0] - L[0]) - temp3 * (s2[0] - s1[0])</span><br><span class="line">g = GCD(k1g, k2g)</span><br><span class="line">g = GCD(g, k3g)</span><br><span class="line"></span><br><span class="line">for i in range(2,1000):</span><br><span class="line">        while(g % i == 0):</span><br><span class="line">            g //= i</span><br><span class="line">a = inverse(s2[0]-s1[0],g)*temp1 % g</span><br><span class="line">b = (s1[1] ** 2 - s1[0]**3-a*s1[0]) % g</span><br><span class="line"></span><br><span class="line">E = EllipticCurve(GF(g),[a,b])</span><br><span class="line">L = E(L)</span><br><span class="line">s1 = E(s1)</span><br><span class="line">s2 = E(s2)</span><br><span class="line"></span><br><span class="line">base = L</span><br><span class="line">k = 0</span><br><span class="line">for j in range(2, 1000000):</span><br><span class="line">    base += L</span><br><span class="line">    if (s1 - base) * j == s2:</span><br><span class="line">           k = j</span><br><span class="line">           break</span><br><span class="line">assert (s1 - k * L) * j == s2</span><br><span class="line"></span><br><span class="line">s = s1 - k * L</span><br><span class="line"></span><br><span class="line">e = abs(int(s[0] - s[1]))</span><br><span class="line">p = GCD((gift - 1), n)</span><br><span class="line">q = n // p</span><br><span class="line">d = inverse(e, (p-1)*(q-1))</span><br><span class="line">m = pow(enc, d, n)</span><br><span class="line">print(long_to_bytes(int(m)))</span><br><span class="line">#flag&#123;this_1s_a_so_EZ_Ecc_and_RSA_&#125;</span><br></pre></td></tr></table></figure></p><h2 id="math"><a href="#math" class="headerlink" title="math"></a>math</h2><p>题目：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br></pre></td><td class="code"><pre><span class="line">from Crypto.Util.number import *</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">def gen_rev_sum(m,p):</span><br><span class="line">    sum = 0</span><br><span class="line">    round = 0</span><br><span class="line">    while m &gt; 0:</span><br><span class="line">        digit = m % p</span><br><span class="line">        if round % 2 == 0:</span><br><span class="line">            sum -= digit</span><br><span class="line">        else:</span><br><span class="line">            sum += digit</span><br><span class="line">        m = m // p</span><br><span class="line">        round += 1</span><br><span class="line">    return sum // 2025</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">e = 65537</span><br><span class="line">p = getPrime(256)</span><br><span class="line">q = getPrime(256)</span><br><span class="line">n = p*q</span><br><span class="line"></span><br><span class="line">m1 = getRandomNBitInteger(2048)</span><br><span class="line">m2 = getRandomNBitInteger(2048)</span><br><span class="line">sum1 = gen_rev_sum(m1, p)</span><br><span class="line">sum2 = gen_rev_sum(m2, p)</span><br><span class="line"></span><br><span class="line">flag = &quot;flag&#123;--------------------------&#125;&quot;</span><br><span class="line">m = bytes_to_long(flag.encode())</span><br><span class="line"></span><br><span class="line">print(&quot;m1 =&quot;,m1)</span><br><span class="line">print(&quot;m2 =&quot;,m2)</span><br><span class="line">print(&quot;sum1 =&quot;,sum1)</span><br><span class="line">print(&quot;sum2 =&quot;,sum2)</span><br><span class="line">print(&quot;n =&quot;,n)</span><br><span class="line">print(&quot;c =&quot;,pow(m,e,n))</span><br><span class="line"></span><br><span class="line">&#x27;&#x27;&#x27;</span><br><span class="line">m1 = 17322548249387769406385507000191215801044910756841784387283679508067232037647009879640247663005640315645559929483973978388785385751219073137080976227046261663059832428571101292873255962114141666488474602734594597852331665601154571683480014721045567844719377268571343706508041194359642732322649799872642255094259428635455750138217286588825326703937255171250131117864604764478573786940615096044575610751081788573681131616312486987096717266320380202191909867687322859634487150465591581523036586129341984826904474237818210411872793917742756628712320922128969576851582027757934655202892557206052328142121974846460835879379</span><br><span class="line">m2 = 29770749505949559271464509877642735633388289947852331255230201935471628731047838190019590503471311260422939188831886032391799282413808339483805109656799786202448656409753608524222447399741340441803183979217817801933166848028113568228217090419247166878248450792302177597130681740006379413412297487888656975884867850858832779733076818160854085244264177562471933684902341628858046181331683501978826962693104997686104748486850900546849316714934730338449894336151567737740558472664876717516650156395237362632196760323299658988296623556674223583771795447537227301625104687705109034611911834940501083977979641467845119043780</span><br><span class="line">sum1 = -108877560874638575191632670246326227208412819991287356983577291185528002487</span><br><span class="line">sum2 = -47122048431044787786292644180145597499319125719652288525187634667738055282</span><br><span class="line">n = 9020951256034058214321622067945640395058903219618790136239198219605516437223449048642101160150934286238922049363203171871230111420670637737169565825694393</span><br><span class="line">c = 3323425622556846027480153848276857423081641901016156494250966280342935316300495906916254739461788219592704051961044937129981786472345610933524261214506540</span><br><span class="line">e = 65537</span><br><span class="line">&#x27;&#x27;&#x27;</span><br></pre></td></tr></table></figure><p>解题思路:</p><p>题目把两个随机数m1,m2表示为:</p><script type="math/tex; mode=display">m = -a_0 * p^0 + a_1 * p^1 - a_2 * p^2 + ... + d_n * p^n</script><p>因为 $p \equiv -1 \pmod{p+1}$<br>那么m可以表示为:</p><script type="math/tex; mode=display">m \equiv a_0 * (-1)^0 + a_1 * (-1)^1 + a_2 * (-1)^2 + ... + d_n * (-1)^n \pmod{p+1}</script><p>那么就有 $m + sum = k*p$,所以只需要求一下gcd即可，由于给出的sum//2025，可能会有误差还原的时候还需要进行一下小爆破即可</p><p>exp:<br><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br></pre></td><td class="code"><pre><span class="line">#python</span><br><span class="line">from Crypto.Util.number import *</span><br><span class="line">from tqdm import *</span><br><span class="line"></span><br><span class="line">m1 = 17322548249387769406385507000191215801044910756841784387283679508067232037647009879640247663005640315645559929483973978388785385751219073137080976227046261663059832428571101292873255962114141666488474602734594597852331665601154571683480014721045567844719377268571343706508041194359642732322649799872642255094259428635455750138217286588825326703937255171250131117864604764478573786940615096044575610751081788573681131616312486987096717266320380202191909867687322859634487150465591581523036586129341984826904474237818210411872793917742756628712320922128969576851582027757934655202892557206052328142121974846460835879379</span><br><span class="line">m2 = 29770749505949559271464509877642735633388289947852331255230201935471628731047838190019590503471311260422939188831886032391799282413808339483805109656799786202448656409753608524222447399741340441803183979217817801933166848028113568228217090419247166878248450792302177597130681740006379413412297487888656975884867850858832779733076818160854085244264177562471933684902341628858046181331683501978826962693104997686104748486850900546849316714934730338449894336151567737740558472664876717516650156395237362632196760323299658988296623556674223583771795447537227301625104687705109034611911834940501083977979641467845119043780</span><br><span class="line">sum1 = -108877560874638575191632670246326227208412819991287356983577291185528002487</span><br><span class="line">sum2 = -47122048431044787786292644180145597499319125719652288525187634667738055282</span><br><span class="line">n = 9020951256034058214321622067945640395058903219618790136239198219605516437223449048642101160150934286238922049363203171871230111420670637737169565825694393</span><br><span class="line">c = 3323425622556846027480153848276857423081641901016156494250966280342935316300495906916254739461788219592704051961044937129981786472345610933524261214506540</span><br><span class="line">e = 65537</span><br><span class="line"></span><br><span class="line">for i in trange(2025):</span><br><span class="line">        for j in range(2025):</span><br><span class="line">            sum1_ = sum1*2025+i</span><br><span class="line">            sum2_ = sum2*2025+j</span><br><span class="line">            kp = GCD(m1 + sum1_, m2 + sum2_)</span><br><span class="line">            if kp &gt; 2 ** 255:</span><br><span class="line">                for k in range(1, 10000):</span><br><span class="line">                    if (kp % k == 0):</span><br><span class="line">                        p = kp // k - 1</span><br><span class="line">                        if (isPrime(p) and len(bin(p)[2:]) == 256):</span><br><span class="line">                            q = n // p</span><br><span class="line">                            d = inverse(e, (p - 1) * (q - 1))</span><br><span class="line">                            print(long_to_bytes(pow(c, d, n)))</span><br><span class="line">                            break</span><br><span class="line">#flag&#123;Reverse_Sum_Mod_p+i_GCD_2025!&#125;</span><br></pre></td></tr></table></figure></p><h2 id="1ZRSA"><a href="#1ZRSA" class="headerlink" title="1ZRSA"></a>1ZRSA</h2><p>题目：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br></pre></td><td class="code"><pre><span class="line">from Crypto.Util.number import *</span><br><span class="line">from gmpy2 import *</span><br><span class="line">import random</span><br><span class="line"></span><br><span class="line">def RSA(m,nbit):</span><br><span class="line">    while True:</span><br><span class="line">        p, q, e = getPrime(nbit), getPrime(nbit), getPrime(nbit)</span><br><span class="line">        n = p * q</span><br><span class="line">        phi_n = (p - 1) * (q - 1)</span><br><span class="line">        d = int(inverse(e, phi_n))</span><br><span class="line">        if len(bin(d)[2:]) == 1024:</span><br><span class="line">            break</span><br><span class="line"></span><br><span class="line">    keep_bits = nbit * 2 - 100</span><br><span class="line">    mask = int((1 &lt;&lt; keep_bits) - 1)</span><br><span class="line">    d_ = d &amp; mask</span><br><span class="line">    c = powmod(m, e, n)</span><br><span class="line">    return c,n,e,d_</span><br><span class="line"></span><br><span class="line">def gen(nbit):</span><br><span class="line"></span><br><span class="line">    c, n, e, d_ = RSA(m, nbit)</span><br><span class="line">    N = getPrime(nbit * 2)</span><br><span class="line">    t = random.randint(1, nbit * 2 - 1)</span><br><span class="line">    C = [random.randint(0, N - 1) for _ in range(t - 1)] + [powmod(d_,1,N)]</span><br><span class="line">    R.&lt;x&gt; = GF(N)[]</span><br><span class="line">    f = R(0)</span><br><span class="line">    for i in range(t):</span><br><span class="line">        f += x ** (t - i - 1) * C[i]</span><br><span class="line">    enc = [(a, f(a)) for a in [random.randint(1, N - 1) for _ in range(t)]]</span><br><span class="line"></span><br><span class="line">    with open(&quot;output.txt&quot;, &quot;w&quot;, encoding=&quot;utf-8&quot;) as f_out:</span><br><span class="line">        f_out.write(f&quot;c = &#123;c&#125;\n&quot;)</span><br><span class="line">        f_out.write(f&quot;n = &#123;n&#125;\n&quot;)</span><br><span class="line">        f_out.write(f&quot;e = &#123;e&#125;\n&quot;)</span><br><span class="line">        f_out.write(f&quot;N = &#123;N&#125;\n&quot;)</span><br><span class="line">        f_out.write(f&quot;enc = &#123;enc&#125;\n&quot;)</span><br><span class="line"></span><br><span class="line">flag = &quot;flag&#123;-------------------------------&#125;&quot;</span><br><span class="line">m = bytes_to_long(flag.encode())</span><br><span class="line"></span><br><span class="line">if __name__ == &quot;__main__&quot;:</span><br><span class="line">    gen(512)</span><br></pre></td></tr></table></figure><p>output.txt太长了就不放出来了，想要的师傅可以去<a href="https://ctf.hscsec.cn/">hscctf</a>的靶场下载(虽然可能还没更新)</p><p>有空再补</p>]]></content>
    
    
      
      
    <summary type="html">&lt;h2 id=&quot;ancient&quot;&gt;&lt;a href=&quot;#ancient&quot; class=&quot;headerlink&quot; title=&quot;ancient&quot;&gt;&lt;/a&gt;ancient&lt;/h2&gt;&lt;p&gt;Base58 → Base62 → Base45 → Base85 → Base32 → Base64&lt;br&gt;按照这个顺序加密的，对着反向解密即可&lt;/p&gt;
&lt;p&gt;密文:&lt;br&gt;&lt;figure class=&quot;highlight plaintext&quot;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&quot;gutter&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;1&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;RzVJVFlaSkZGUk1HV1daWkdOQ0RFNEpJSE5RWEdOS05ISlNHSTNCT0daWVVXS1pDRzQzV01UQ0NISkVTNElKQkdKUkZFUEpYRjVIVk0zMlpIQVpXNjQyTkdaSlRBNFMzR1pKVENPMllIVjJWWVRMQ0daTERDTVpYR0JURk1T</summary>
      
    
    
    
    <category term="crypto - write_up" scheme="http://www.yizhixiaojiuli.cn/categories/crypto-write-up/"/>
    
    
  </entry>
  
  <entry>
    <title>2025-SWPU-NSSCTF-秋季招新入门训练赛-wp</title>
    <link href="http://www.yizhixiaojiuli.cn/2025/08/29/2025-SWPU-NSSCTF-%E7%A7%8B%E5%AD%A3%E6%8B%9B%E6%96%B0%E5%85%A5%E9%97%A8%E8%AE%AD%E7%BB%83%E8%B5%9B/"/>
    <id>http://www.yizhixiaojiuli.cn/2025/08/29/2025-SWPU-NSSCTF-%E7%A7%8B%E5%AD%A3%E6%8B%9B%E6%96%B0%E5%85%A5%E9%97%A8%E8%AE%AD%E7%BB%83%E8%B5%9B/</id>
    <published>2025-08-29T09:00:00.000Z</published>
    <updated>2025-09-03T03:40:00.000Z</updated>
    
    <content type="html"><![CDATA[<p>偶然看到nss上的新生赛，正好也快有新生入学了，写一下wp吧<br>ps：这里面好多litctf的题，23年还是新手的时候打过写过wp，没想到现在又会写一遍，怪感慨的</p><h2 id="happy"><a href="#happy" class="headerlink" title="happy"></a>happy</h2><p>题目：<br><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">(&#x27;c=&#x27;, &#x27;0x7a7e031f14f6b6c3292d11a41161d2491ce8bcdc67ef1baa9eL&#x27;)</span><br><span class="line">(&#x27;e=&#x27;, &#x27;0x872a335&#x27;)</span><br><span class="line">#q + q*p^3 =1285367317452089980789441829580397855321901891350429414413655782431779727560841427444135440068248152908241981758331600586</span><br><span class="line">#qp + q *p^2 = 1109691832903289208389283296592510864729403914873734836011311325874120780079555500202475594</span><br></pre></td></tr></table></figure></p><ol><li><p><strong>定义 A、B</strong><br>$A = q + q \cdot p^3$，$B = q \cdot p + q \cdot p^2$</p></li><li><p><strong>化简 A、B</strong>  </p><ul><li>A 提取公因子并应用立方和公式：<br>$A = q \cdot (1 + p^3) = q \cdot (1 + p) \cdot (p^2 - p + 1)$  </li><li>B 提取公因子：<br>$B = q \cdot p \cdot (1 + p)$</li></ul></li><li><p><strong>计算 A/B</strong><br>消去公共项 $q \cdot (1 + p)$：<br>$\frac{A}{B} = \frac{p^2 - p + 1}{p} = p - 1 + \frac{1}{p}$</p><ul><li>整数商：$A // B = p - 1$  </li><li>余数：$A \mod B$ 对应分数部分</li></ul></li><li><p><strong>求解素数 p</strong><br>设 $c = A \mod B$，由 $\frac{B}{p} = c$ 得：<br>$p = B // c$（整数除法）</p></li><li><p><strong>求解素数 q</strong><br>代入 $B = q \cdot p \cdot (1 + p)$ 得：<br>$q = B // [p \cdot (1 + p)]$（整数除法）</p></li></ol><p>exp:<br><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><span class="line"># happy</span><br><span class="line"># python</span><br><span class="line">A = 1285367317452089980789441829580397855321901891350429414413655782431779727560841427444135440068248152908241981758331600586</span><br><span class="line">B = 1109691832903289208389283296592510864729403914873734836011311325874120780079555500202475594</span><br><span class="line">e_hex = &quot;0x872a335&quot;</span><br><span class="line">c_hex = &quot;0x7a7e031f14f6b6c3292d11a41161d2491ce8bcdc67ef1baa9e&quot;</span><br><span class="line">e = int(e_hex, 16)</span><br><span class="line">c = int(c_hex, 16)</span><br><span class="line"></span><br><span class="line">quotient = A // B</span><br><span class="line">remainder = A % B</span><br><span class="line"></span><br><span class="line">p = B // remainder</span><br><span class="line">q = B // (p*(1+p))</span><br><span class="line">n = p*q</span><br><span class="line">d = inverse(e, n - p - q + 1)</span><br><span class="line">print(&quot;happy:&quot;,long_to_bytes(powmod(c, d, n)))</span><br><span class="line">#flag&#123;happy_rsa_1&#125;</span><br></pre></td></tr></table></figure></p><h2 id="crypto1"><a href="#crypto1" class="headerlink" title="crypto1"></a>crypto1</h2><p>题目:<br><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br></pre></td><td class="code"><pre><span class="line">from gmpy2 import *</span><br><span class="line">from Crypto.Util.number import *</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line">flag  = &#x27;****************************&#x27;</span><br><span class="line">p = getPrime(2048)</span><br><span class="line">q = getPrime(2048)</span><br><span class="line">m1 = bytes_to_long(bytes(flag.encode()))</span><br><span class="line"></span><br><span class="line">e1e2 = 3087</span><br><span class="line">n = p*q</span><br><span class="line">print()</span><br><span class="line"></span><br><span class="line">flag1 = pow(m1,e1,n)</span><br><span class="line">flag2 = pow(m1,e2,n)</span><br><span class="line">print(&#x27;flag1= &#x27;+str(flag1))</span><br><span class="line">print(&#x27;flag2= &#x27;+str(flag2))</span><br><span class="line">print(&#x27;n= &#x27;+str(n))</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">#flag1= 463634070971821449698012827631572665302589213868521491855038966879005784397309389922926838028598122795187584361359142761652619958273094398420314927073008031088375892957173280915904309949716842152249806486027920136603248454946737961650252641668562626310035983343018705370077783879047584582817271215517599531278507300104564011142229942160380563527291388260832749808727470291331902902518196932928128107067117198707209620169906575791373793854773799564060536121390593687449884988936522369331738199522700261116496965863870682295858957952661531894477603953742494526632841396338388879198270913523572980574440793543571757278020533565628285714358815083303489096524318164071888139412436112963845619981511061231001617406815056986634680975142352197476024575809514978857034477688443230263761729039797859697947454810551009108031457294164840611157524719173343259485881089252938664456637673337362424443150013961181619441267926981848009107466576314685961478748352388452114042115892243272514245081604607798243817586737546663059737344687130881861357423084448027959893402445303299089606081931041217035955143939567456782107203447898345284731038150377722447329202078375870541529539840051415759436083384408203659613313535094343772238691393447475364806171594</span><br><span class="line">#flag2= 130959534275704453216282334815034647265875632781798750901627773826812657339274362406246297925411291822193191483409847323315110393729020700526946712786793380991675008128561863631081095222226285788412970362518398757423705216112313533155390315204875516645459370629706277876211656753247984282379731850770447978537855070379324935282789327428625259945250066774049650951465043700088958965762054418615838049340724639373351248933494355591934236360506778496741051064156771092798005112534162050165095430065000827916096893408569751085550379620558282942254606978819033885539221416335848319082054806148859427713144286777516251724474319613960327799643723278205969253636514684757409059003348229151341200451785288395596484563480261212963114071064979559812327582474674812225260616757099890896900340007990585501470484762752362734968297532533654846190900571017635959385883945858334995884341767905619567505341752047589731815868489295690574109758825021386698440670611361127170896689015108432408490763723594673299472336065575301681055583084547847733168801030191262122130369687497236959760366874106043801542493392227424890925595734150487586757484304609945827925762382889592743709682485229267604771944535469557860120878491329984792448597107256325783346904408</span><br><span class="line">#n= 609305637099654478882754880905638123124918364116173050874864700996165096776233155524277418132679727857702738043786588380577485490575591029930152718828075976000078971987922107645530323356525126496562423491563365836491753476840795804040219013880969539154444387313029522565456897962200817021423704204077133003361140660038327458057898764857872645377236870759691588009666047187685654297678987435769051762120388537868493789773766688347724903911796741124237476823452505450704989455260077833828660552130714794889208291939055406292476845194489525212129635173284301782141617878483740788532998492403101324795726865866661786740345862631916793208037250277376942046905892342213663197755010315060990871143919384283302925469309777769989798197913048813940747488087191697903624669415774198027063997058701217124640082074789591591494106726857376728759663074734040755438623372683762856958888826373151815914621262862750497078245369680378038995425628467728412953392359090775734440671874387905724083226246587924716226512631671786591611586774947156657178654343092123117255372954798131265566301316033414311712092913492774989048057650627801991277862963173961355088082419091848569675686058581383542877982979697235829206442087786927939745804017455244315305118437</span><br></pre></td></tr></table></figure></p><ul><li><p><strong>共模攻击适用场景</strong>：两组公钥对同一消息加密，且公钥的 $n$ 相同。</p></li><li><p><strong>共模攻击原理</strong>：</p><ol><li>由裴蜀定理：$ax + by = \gcd(a,b)$，可得 $s_1e_1 + s_2e_2 = \gcd(e_1,e_2)$  </li><li>推导过程：  <script type="math/tex; mode=display">\begin{align*}c_1^{s_1} \cdot c_2^{s_2} &\equiv (m^{e_1})^{s_1} \cdot (m^{e_2})^{s_2} \pmod{n} \\&\equiv m^{s_1e_1 + s_2e_2} \pmod{n} \\&\equiv m^{\gcd(e_1,e_2)} \pmod{n}\end{align*}</script></li><li>前提条件：$m^t \ll n$（$t = \gcd(e_1,e_2)$）</li></ol><ul><li>gmpy2 库函数：$ gcdext(e1,e2) = (t, s1, s2)$，其中 $t = gcd(e1,e2)$  </li><li>由于这里给的是 $e_1e_2$，所以需要爆破分解一下来得到 $e_1$ 和 $e_2$</li></ul></li></ul><p>exp:<br><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line">e1e2 = 3087</span><br><span class="line">flag1= 463634070971821449698012827631572665302589213868521491855038966879005784397309389922926838028598122795187584361359142761652619958273094398420314927073008031088375892957173280915904309949716842152249806486027920136603248454946737961650252641668562626310035983343018705370077783879047584582817271215517599531278507300104564011142229942160380563527291388260832749808727470291331902902518196932928128107067117198707209620169906575791373793854773799564060536121390593687449884988936522369331738199522700261116496965863870682295858957952661531894477603953742494526632841396338388879198270913523572980574440793543571757278020533565628285714358815083303489096524318164071888139412436112963845619981511061231001617406815056986634680975142352197476024575809514978857034477688443230263761729039797859697947454810551009108031457294164840611157524719173343259485881089252938664456637673337362424443150013961181619441267926981848009107466576314685961478748352388452114042115892243272514245081604607798243817586737546663059737344687130881861357423084448027959893402445303299089606081931041217035955143939567456782107203447898345284731038150377722447329202078375870541529539840051415759436083384408203659613313535094343772238691393447475364806171594</span><br><span class="line">flag2= 130959534275704453216282334815034647265875632781798750901627773826812657339274362406246297925411291822193191483409847323315110393729020700526946712786793380991675008128561863631081095222226285788412970362518398757423705216112313533155390315204875516645459370629706277876211656753247984282379731850770447978537855070379324935282789327428625259945250066774049650951465043700088958965762054418615838049340724639373351248933494355591934236360506778496741051064156771092798005112534162050165095430065000827916096893408569751085550379620558282942254606978819033885539221416335848319082054806148859427713144286777516251724474319613960327799643723278205969253636514684757409059003348229151341200451785288395596484563480261212963114071064979559812327582474674812225260616757099890896900340007990585501470484762752362734968297532533654846190900571017635959385883945858334995884341767905619567505341752047589731815868489295690574109758825021386698440670611361127170896689015108432408490763723594673299472336065575301681055583084547847733168801030191262122130369687497236959760366874106043801542493392227424890925595734150487586757484304609945827925762382889592743709682485229267604771944535469557860120878491329984792448597107256325783346904408</span><br><span class="line">n= 609305637099654478882754880905638123124918364116173050874864700996165096776233155524277418132679727857702738043786588380577485490575591029930152718828075976000078971987922107645530323356525126496562423491563365836491753476840795804040219013880969539154444387313029522565456897962200817021423704204077133003361140660038327458057898764857872645377236870759691588009666047187685654297678987435769051762120388537868493789773766688347724903911796741124237476823452505450704989455260077833828660552130714794889208291939055406292476845194489525212129635173284301782141617878483740788532998492403101324795726865866661786740345862631916793208037250277376942046905892342213663197755010315060990871143919384283302925469309777769989798197913048813940747488087191697903624669415774198027063997058701217124640082074789591591494106726857376728759663074734040755438623372683762856958888826373151815914621262862750497078245369680378038995425628467728412953392359090775734440671874387905724083226246587924716226512631671786591611586774947156657178654343092123117255372954798131265566301316033414311712092913492774989048057650627801991277862963173961355088082419091848569675686058581383542877982979697235829206442087786927939745804017455244315305118437</span><br><span class="line">for e1 in range(2, e1e2):</span><br><span class="line">    if e1e2 % e1 == 0:</span><br><span class="line">        e2 = e1e2 // e1</span><br><span class="line">        t, s1, s2 = gcdext(e1, e2)</span><br><span class="line">        m = iroot((powmod(flag1,s1,n)*powmod(flag2,s2,n)) % n, t)</span><br><span class="line">        if m[1]:</span><br><span class="line">            if long_to_bytes(m[0]).startswith(b&#x27;NSSCTF&#123;&#x27;): # 知道flag头，过滤非flag，不知道就输出全部找flag</span><br><span class="line">                print(long_to_bytes(m[0]))</span><br><span class="line">#NSSCTF&#123;d64dba66-b608-4255-b888-0b0f25c2f90e&#125;</span><br></pre></td></tr></table></figure></p><h2 id="crypto2"><a href="#crypto2" class="headerlink" title="crypto2"></a>crypto2</h2><p>题目:<br><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br></pre></td><td class="code"><pre><span class="line">from gmpy2 import *</span><br><span class="line">from Crypto.Util.number import *</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line">flag  = &#x27;***************&#x27;</span><br><span class="line"></span><br><span class="line">p = getPrime(512)</span><br><span class="line">q = getPrime(512)</span><br><span class="line">m1 = bytes_to_long(bytes(flag.encode()))</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">n = p*q</span><br><span class="line">e1 = getPrime(32)</span><br><span class="line">e2 = getPrime(32)</span><br><span class="line">print()</span><br><span class="line"></span><br><span class="line">flag1 = pow(m1,e1,n)</span><br><span class="line">flag2 = pow(m1,e2,n)</span><br><span class="line">print(&#x27;flag1= &#x27;+str(flag1))</span><br><span class="line">print(&#x27;flag2= &#x27;+str(flag2))</span><br><span class="line">print(&#x27;e1= &#x27; +str(e1))</span><br><span class="line">print(&#x27;e2= &#x27;+str(e2))</span><br><span class="line">print(&#x27;n= &#x27;+str(n))</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">#flag1= 100156221476910922393504870369139942732039899485715044553913743347065883159136513788649486841774544271396690778274591792200052614669235485675534653358596366535073802301361391007325520975043321423979924560272762579823233787671688669418622502663507796640233829689484044539829008058686075845762979657345727814280</span><br><span class="line">#flag2= 86203582128388484129915298832227259690596162850520078142152482846864345432564143608324463705492416009896246993950991615005717737886323630334871790740288140033046061512799892371429864110237909925611745163785768204802056985016447086450491884472899152778839120484475953828199840871689380584162839244393022471075</span><br><span class="line">#e1= 3247473589</span><br><span class="line">#e2= 3698409173</span><br><span class="line">#n= 103606706829811720151309965777670519601112877713318435398103278099344725459597221064867089950867125892545997503531556048610968847926307322033117328614701432100084574953706259773711412853364463950703468142791390129671097834871371125741564434710151190962389213898270025272913761067078391308880995594218009110313</span><br></pre></td></tr></table></figure><br>$共模攻击最基础的形式两个e互素$<br>exp:<br><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">flag1= 100156221476910922393504870369139942732039899485715044553913743347065883159136513788649486841774544271396690778274591792200052614669235485675534653358596366535073802301361391007325520975043321423979924560272762579823233787671688669418622502663507796640233829689484044539829008058686075845762979657345727814280</span><br><span class="line">flag2= 86203582128388484129915298832227259690596162850520078142152482846864345432564143608324463705492416009896246993950991615005717737886323630334871790740288140033046061512799892371429864110237909925611745163785768204802056985016447086450491884472899152778839120484475953828199840871689380584162839244393022471075</span><br><span class="line">e1= 3247473589</span><br><span class="line">e2= 3698409173</span><br><span class="line">n= 103606706829811720151309965777670519601112877713318435398103278099344725459597221064867089950867125892545997503531556048610968847926307322033117328614701432100084574953706259773711412853364463950703468142791390129671097834871371125741564434710151190962389213898270025272913761067078391308880995594218009110313</span><br><span class="line">_, s1, s2 = gcdext(e1, e2)</span><br><span class="line">m = (powmod(flag1, s1, n)*(powmod(flag2, s2, n))) % n</span><br><span class="line">print(long_to_bytes(m))</span><br><span class="line">#NSSCTF&#123;xxxxx******xxxxx&#125;</span><br></pre></td></tr></table></figure></p><h2 id="crypto4"><a href="#crypto4" class="headerlink" title="crypto4"></a>crypto4</h2><p>题目:<br><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br></pre></td><td class="code"><pre><span class="line">from gmpy2 import *</span><br><span class="line">from Crypto.Util.number import *</span><br><span class="line"></span><br><span class="line">flag  = &#x27;**********&#x27;</span><br><span class="line"></span><br><span class="line">p = getPrime(512)</span><br><span class="line">q = next_prime(p)</span><br><span class="line">m1 = bytes_to_long(bytes(flag.encode()))</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">e = 0x10001</span><br><span class="line">n = p*q</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">flag1 = pow(m1,e,n)</span><br><span class="line">print(&#x27;flag= &#x27;+str(flag1))</span><br><span class="line">print(&#x27;n= &#x27;+str(n))</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">flag= 10227915341268619536932290456122384969242151167487654201363877568935534996454863939953106193665663567559506242151019201314446286458150141991211233219320700112533775367958964780047682920839507351492644735811096995884754664899221842470772096509258104067131614630939533042322095150722344048082688772981180270243</span><br><span class="line">n= 52147017298260357180329101776864095134806848020663558064141648200366079331962132411967917697877875277103045755972006084078559453777291403087575061382674872573336431876500128247133861957730154418461680506403680189755399752882558438393107151815794295272358955300914752523377417192504702798450787430403387076153</span><br></pre></td></tr></table></figure></p><p>我们可以发现用于加密的素数他们两个是相邻的, 我们知道$\sqrt{n}$是p和q的几何平均值，很容易知道$\sqrt{n}$为p和q的中间值，</p><script type="math/tex; mode=display">p< \sqrt{n} < q</script><p>exp:<br><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">flag= 10227915341268619536932290456122384969242151167487654201363877568935534996454863939953106193665663567559506242151019201314446286458150141991211233219320700112533775367958964780047682920839507351492644735811096995884754664899221842470772096509258104067131614630939533042322095150722344048082688772981180270243</span><br><span class="line">n= 52147017298260357180329101776864095134806848020663558064141648200366079331962132411967917697877875277103045755972006084078559453777291403087575061382674872573336431876500128247133861957730154418461680506403680189755399752882558438393107151815794295272358955300914752523377417192504702798450787430403387076153</span><br><span class="line"></span><br><span class="line">temp = iroot(n, 2)[0]</span><br><span class="line">q = next_prime(temp)</span><br><span class="line">p = n // q</span><br><span class="line">d = inverse(65537, n - p - q + 1)</span><br><span class="line">print(long_to_bytes(powmod(flag, d, n)))</span><br><span class="line">#NSSCTF&#123;no_why&#125;</span><br></pre></td></tr></table></figure></p><h2 id="crypto6"><a href="#crypto6" class="headerlink" title="crypto6"></a>crypto6</h2><p>题目:<br><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">var=&quot;************************************&quot;</span><br><span class="line">flag=&#x27;NSSCTF&#123;&#x27; + base64.b16encode(base64.b32encode(base64.b64encode(var.encode()))) + &#x27;&#125;&#x27;</span><br><span class="line">print(flag)</span><br><span class="line"></span><br><span class="line">小明不小心泄露了源码，输出结果为：4A5A4C564B36434E4B5241544B5432454E4E32465552324E47424758534D44594C4657564336534D4B5241584F574C4B4B463245365643424F35485649534C584A5A56454B4D4B5049354E47593D3D3D，你能还原出var的正确结果吗？</span><br></pre></td></tr></table></figure><br>base16<br>base32<br>base64<br>exp:<br><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">c = &quot;4A5A4C564B36434E4B5241544B5432454E4E32465552324E47424758534D44594C4657564336534D4B5241584F574C4B4B463245365643424F35485649534C584A5A56454B4D4B5049354E47593D3D3D&quot;</span><br><span class="line">base32_bytes = bytes.fromhex(c)</span><br><span class="line">base64_bytes = base64.b32decode(base32_bytes)</span><br><span class="line">var = base64.b64decode(base64_bytes).decode(&quot;utf-8&quot;)</span><br><span class="line">print(&quot;还原的var：&quot;, var)</span><br><span class="line">#5e110989-dc43-1bd3-00b4-9009206158fe</span><br></pre></td></tr></table></figure></p><h2 id="crypto7"><a href="#crypto7" class="headerlink" title="crypto7"></a>crypto7</h2><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">#69f7906323b4f7d1e4e972acf4abfbfc,得到的结果用NSSCTF&#123;&#125;包裹。</span><br><span class="line">md5在线解密即可</span><br><span class="line">#md5yyds</span><br></pre></td></tr></table></figure><h2 id="拟态签到题"><a href="#拟态签到题" class="headerlink" title="拟态签到题"></a>拟态签到题</h2><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">#ZmxhZ3tHYXFZN0t0RXRyVklYMVE1b1A1aUVCUkNZWEVBeThyVH0=</span><br><span class="line">base64</span><br><span class="line">#flag&#123;GaqY7KtEtrVIX1Q5oP5iEBRCYXEAy8rT&#125;</span><br></pre></td></tr></table></figure><h2 id="这是base"><a href="#这是base" class="headerlink" title="这是base?"></a>这是base?</h2><p>题目:<br><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">#dict:&#123;0: &#x27;J&#x27;, 1: &#x27;K&#x27;, 2: &#x27;L&#x27;, 3: &#x27;M&#x27;, 4: &#x27;N&#x27;, 5: &#x27;O&#x27;, 6: &#x27;x&#x27;, 7: &#x27;y&#x27;, 8: &#x27;U&#x27;, 9: &#x27;V&#x27;, 10: &#x27;z&#x27;, 11: &#x27;A&#x27;, 12: &#x27;B&#x27;, 13: &#x27;C&#x27;, 14: &#x27;D&#x27;, 15: &#x27;E&#x27;, 16: &#x27;F&#x27;, 17: &#x27;G&#x27;, 18: &#x27;H&#x27;, 19: &#x27;7&#x27;, 20: &#x27;8&#x27;, 21: &#x27;9&#x27;, 22: &#x27;P&#x27;, 23: &#x27;Q&#x27;, 24: &#x27;I&#x27;, 25: &#x27;a&#x27;, 26: &#x27;b&#x27;, 27: &#x27;c&#x27;, 28: &#x27;d&#x27;, 29: &#x27;e&#x27;, 30: &#x27;f&#x27;, 31: &#x27;g&#x27;, 32: &#x27;h&#x27;, 33: &#x27;i&#x27;, 34: &#x27;j&#x27;, 35: &#x27;k&#x27;, 36: &#x27;l&#x27;, 37: &#x27;m&#x27;, 38: &#x27;W&#x27;, 39: &#x27;X&#x27;, 40: &#x27;Y&#x27;, 41: &#x27;Z&#x27;, 42: &#x27;0&#x27;, 43: &#x27;1&#x27;, 44: &#x27;2&#x27;, 45: &#x27;3&#x27;, 46: &#x27;4&#x27;, 47: &#x27;5&#x27;, 48: &#x27;6&#x27;, 49: &#x27;R&#x27;, 50: &#x27;S&#x27;, 51: &#x27;T&#x27;, 52: &#x27;n&#x27;, 53: &#x27;o&#x27;, 54: &#x27;p&#x27;, 55: &#x27;q&#x27;, 56: &#x27;r&#x27;, 57: &#x27;s&#x27;, 58: &#x27;t&#x27;, 59: &#x27;u&#x27;, 60: &#x27;v&#x27;, 61: &#x27;w&#x27;, 62: &#x27;+&#x27;, 63: &#x27;/&#x27;, 64: &#x27;=&#x27;&#125;</span><br><span class="line"></span><br><span class="line">#chipertext:FlZNfnF6Qol6e9w17WwQQoGYBQCgIkGTa9w3IQKw</span><br></pre></td></tr></table></figure></p><p>换表base64，表也给了直接写一下即可，懒得写了ai写的exp</p><p>exp:<br><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br></pre></td><td class="code"><pre><span class="line">encode_dict = &#123;</span><br><span class="line">    0: &#x27;J&#x27;, 1: &#x27;K&#x27;, 2: &#x27;L&#x27;, 3: &#x27;M&#x27;, 4: &#x27;N&#x27;, 5: &#x27;O&#x27;, 6: &#x27;x&#x27;, 7: &#x27;y&#x27;, 8: &#x27;U&#x27;, 9: &#x27;V&#x27;,</span><br><span class="line">    10: &#x27;z&#x27;, 11: &#x27;A&#x27;, 12: &#x27;B&#x27;, 13: &#x27;C&#x27;, 14: &#x27;D&#x27;, 15: &#x27;E&#x27;, 16: &#x27;F&#x27;, 17: &#x27;G&#x27;, 18: &#x27;H&#x27;,</span><br><span class="line">    19: &#x27;7&#x27;, 20: &#x27;8&#x27;, 21: &#x27;9&#x27;, 22: &#x27;P&#x27;, 23: &#x27;Q&#x27;, 24: &#x27;I&#x27;, 25: &#x27;a&#x27;, 26: &#x27;b&#x27;, 27: &#x27;c&#x27;,</span><br><span class="line">    28: &#x27;d&#x27;, 29: &#x27;e&#x27;, 30: &#x27;f&#x27;, 31: &#x27;g&#x27;, 32: &#x27;h&#x27;, 33: &#x27;i&#x27;, 34: &#x27;j&#x27;, 35: &#x27;k&#x27;, 36: &#x27;l&#x27;,</span><br><span class="line">    37: &#x27;m&#x27;, 38: &#x27;W&#x27;, 39: &#x27;X&#x27;, 40: &#x27;Y&#x27;, 41: &#x27;Z&#x27;, 42: &#x27;0&#x27;, 43: &#x27;1&#x27;, 44: &#x27;2&#x27;, 45: &#x27;3&#x27;,</span><br><span class="line">    46: &#x27;4&#x27;, 47: &#x27;5&#x27;, 48: &#x27;6&#x27;, 49: &#x27;R&#x27;, 50: &#x27;S&#x27;, 51: &#x27;T&#x27;, 52: &#x27;n&#x27;, 53: &#x27;o&#x27;, 54: &#x27;p&#x27;,</span><br><span class="line">    55: &#x27;q&#x27;, 56: &#x27;r&#x27;, 57: &#x27;s&#x27;, 58: &#x27;t&#x27;, 59: &#x27;u&#x27;, 60: &#x27;v&#x27;, 61: &#x27;w&#x27;, 62: &#x27;+&#x27;, 63: &#x27;/&#x27;, 64: &#x27;=&#x27;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">decode_dict = &#123;v: k for k, v in encode_dict.items()&#125;</span><br><span class="line">ciphertext = &quot;FlZNfnF6Qol6e9w17WwQQoGYBQCgIkGTa9w3IQKw&quot;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">def custom_base64_decode(s):</span><br><span class="line">    values = [decode_dict[c] for c in s]</span><br><span class="line"></span><br><span class="line">    padding = 0</span><br><span class="line">    if values and values[-1] == 64:</span><br><span class="line">        padding = 1</span><br><span class="line">        if len(values) &gt; 1 and values[-2] == 64:</span><br><span class="line">            padding = 2</span><br><span class="line"></span><br><span class="line">    # 移除填充字符</span><br><span class="line">    values = [v for v in values if v != 64]</span><br><span class="line"></span><br><span class="line">    # 将数值转换为6位二进制字符串，不足6位的在前面补0</span><br><span class="line">    bits = []</span><br><span class="line">    for v in values:</span><br><span class="line">        bits.append(format(v, &#x27;06b&#x27;))</span><br><span class="line"></span><br><span class="line">    # 合并所有二进制位</span><br><span class="line">    all_bits = &#x27;&#x27;.join(bits)</span><br><span class="line"></span><br><span class="line">    # 按8位分割成字节</span><br><span class="line">    bytes_list = []</span><br><span class="line">    for i in range(0, len(all_bits) - (len(all_bits) % 8), 8):</span><br><span class="line">        byte_bits = all_bits[i:i + 8]</span><br><span class="line">        if len(byte_bits) == 8:  # 确保是完整的8位</span><br><span class="line">            bytes_list.append(int(byte_bits, 2))</span><br><span class="line"></span><br><span class="line">    # 根据填充数量移除相应的字节</span><br><span class="line">    if padding &gt; 0:</span><br><span class="line">        bytes_list = bytes_list[:-padding]</span><br><span class="line"></span><br><span class="line">    # 转换为字符串并返回</span><br><span class="line">    return bytes(bytes_list).decode(&#x27;utf-8&#x27;, errors=&#x27;replace&#x27;)</span><br><span class="line"></span><br><span class="line">plaintext = custom_base64_decode(ciphertext)</span><br><span class="line">print(&quot;解密结果:&quot;, plaintext)</span><br><span class="line">#BJD&#123;D0_Y0u_kNoW_Th1s_b4se_map&#125;</span><br></pre></td></tr></table></figure></p><h2 id="谁懂啊RSA签到题都不会"><a href="#谁懂啊RSA签到题都不会" class="headerlink" title="谁懂啊RSA签到题都不会"></a>谁懂啊RSA签到题都不会</h2><p>题目:<br><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line">from Crypto.Util.number import *</span><br><span class="line">from secret import flag</span><br><span class="line"></span><br><span class="line">m = bytes_to_long(flag)</span><br><span class="line">p = getPrime(512)</span><br><span class="line">q = getPrime(512)</span><br><span class="line">e = 65537</span><br><span class="line">n = p*q</span><br><span class="line">c = pow(m,e,n)</span><br><span class="line">print(f&#x27;p = &#123;p&#125;&#x27;)</span><br><span class="line">print(f&#x27;q = &#123;q&#125;&#x27;)</span><br><span class="line">print(f&#x27;c = &#123;c&#125;&#x27;)</span><br><span class="line">&#x27;&#x27;&#x27;</span><br><span class="line">p = 12567387145159119014524309071236701639759988903138784984758783651292440613056150667165602473478042486784826835732833001151645545259394365039352263846276073</span><br><span class="line">q = 12716692565364681652614824033831497167911028027478195947187437474380470205859949692107216740030921664273595734808349540612759651241456765149114895216695451</span><br><span class="line">c = 108691165922055382844520116328228845767222921196922506468663428855093343772017986225285637996980678749662049989519029385165514816621011058462841314243727826941569954125384522233795629521155389745713798246071907492365062512521474965012924607857440577856404307124237116387085337087671914959900909379028727767057</span><br><span class="line">&#x27;&#x27;&#x27;</span><br></pre></td></tr></table></figure><br>嗯，就是RSA的签到题，给了p和q直接解密即可</p><p>exp:<br><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">p = 12567387145159119014524309071236701639759988903138784984758783651292440613056150667165602473478042486784826835732833001151645545259394365039352263846276073</span><br><span class="line">q = 12716692565364681652614824033831497167911028027478195947187437474380470205859949692107216740030921664273595734808349540612759651241456765149114895216695451</span><br><span class="line">c = 108691165922055382844520116328228845767222921196922506468663428855093343772017986225285637996980678749662049989519029385165514816621011058462841314243727826941569954125384522233795629521155389745713798246071907492365062512521474965012924607857440577856404307124237116387085337087671914959900909379028727767057</span><br><span class="line">n = p*q</span><br><span class="line">d = inverse(65537, n - p - q + 1)</span><br><span class="line">print(long_to_bytes(powmod(c, d, n)))</span><br><span class="line">#LitCTF&#123;it_is_easy_to_solve_question_when_you_know_p_and_q&#125;</span><br></pre></td></tr></table></figure></p><h2 id="Bigrsa"><a href="#Bigrsa" class="headerlink" title="Bigrsa"></a>Bigrsa</h2><p>题目:<br><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line">from Crypto.Util.number import *</span><br><span class="line">from flag import *</span><br><span class="line"></span><br><span class="line">n1 = 103835296409081751860770535514746586815395898427260334325680313648369132661057840680823295512236948953370895568419721331170834557812541468309298819497267746892814583806423027167382825479157951365823085639078738847647634406841331307035593810712914545347201619004253602692127370265833092082543067153606828049061</span><br><span class="line">n2 = 115383198584677147487556014336448310721853841168758012445634182814180314480501828927160071015197089456042472185850893847370481817325868824076245290735749717384769661698895000176441497242371873981353689607711146852891551491168528799814311992471449640014501858763495472267168224015665906627382490565507927272073</span><br><span class="line">e = 65537</span><br><span class="line">m = bytes_to_long(flag)</span><br><span class="line">c = pow(m, e, n1)</span><br><span class="line">c = pow(c, e, n2)</span><br><span class="line"></span><br><span class="line">print(&quot;c = %d&quot; % c)</span><br><span class="line"></span><br><span class="line"># output</span><br><span class="line"># c = 60406168302768860804211220055708551816238816061772464557956985699400782163597251861675967909246187833328847989530950308053492202064477410641014045601986036822451416365957817685047102703301347664879870026582087365822433436251615243854347490600004857861059245403674349457345319269266645006969222744554974358264</span><br></pre></td></tr></table></figure><br>其实就是双重RSA,$n_1$和$n_2$都能分解,分解后直接解密即可<br>exp:<br><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line">n1 = 103835296409081751860770535514746586815395898427260334325680313648369132661057840680823295512236948953370895568419721331170834557812541468309298819497267746892814583806423027167382825479157951365823085639078738847647634406841331307035593810712914545347201619004253602692127370265833092082543067153606828049061</span><br><span class="line">n2 = 115383198584677147487556014336448310721853841168758012445634182814180314480501828927160071015197089456042472185850893847370481817325868824076245290735749717384769661698895000176441497242371873981353689607711146852891551491168528799814311992471449640014501858763495472267168224015665906627382490565507927272073</span><br><span class="line">e = 65537</span><br><span class="line">c = 60406168302768860804211220055708551816238816061772464557956985699400782163597251861675967909246187833328847989530950308053492202064477410641014045601986036822451416365957817685047102703301347664879870026582087365822433436251615243854347490600004857861059245403674349457345319269266645006969222744554974358264</span><br><span class="line">p1 = 10169921435575123642561867469669552661717864247752251361375671837367086221354750692635829007786009042729357644276462913457660789233674358081650339142863821</span><br><span class="line">q1 = 10210039189276167395636779557271057346691950991057423589319031237857569595284598319093522326723650646963251941930167018746859556383067696079622198265424441</span><br><span class="line">p2 = 10210039189276167395636779557271057346691950991057423589319031237857569595284598319093522326723650646963251941930167018746859556383067696079622198265424441</span><br><span class="line">q2 = 11300955505231233842374743324817494386700809291852528704864397779486924493760947925710590633254027339824598181322986060728301639209174112581120081509548753</span><br><span class="line"></span><br><span class="line">d2 = inverse(e, n2 - p2 - q2 + 1)</span><br><span class="line">d1 = inverse(e, n1 - p1 - q1 + 1)</span><br><span class="line">print(long_to_bytes(powmod(powmod(c,d2, n2), d1, n1)))</span><br><span class="line">#SangFor&#123;qSccmm1WrgvIg2Uq_cZhmqNfEGTz2GV8&#125;</span><br></pre></td></tr></table></figure></p><h2 id="MD5的破解"><a href="#MD5的破解" class="headerlink" title="MD5的破解"></a>MD5的破解</h2><p>题目:<br><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line">from Crypto.Util.number import *</span><br><span class="line">from hashlib import md5</span><br><span class="line">from secret import flag</span><br><span class="line"></span><br><span class="line">#flag全是由小写字母及数字组成</span><br><span class="line">m=md5(flag).hexdigest()</span><br><span class="line">print(flag[:13]+flag[15:18]+flag[19:34]+flag[35:38])</span><br><span class="line">print(m)</span><br><span class="line"># b&#x27;LitCTF&#123;md5can3derypt213thoughcrsh&#125;&#x27;</span><br><span class="line"># 496603d6953a15846cd7cc476f146771</span><br></pre></td></tr></table></figure><br>题目泄露了绝大多数的明文和完整的明文 md5,我们只需要爆破未知明文之后再进行 md5 碰撞(也就是遍历可能明文再进行md5与已知的md5对比)即可。</p><p>exp:<br><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br></pre></td><td class="code"><pre><span class="line">known_part = &quot;LitCTF&#123;md5can3derypt213thoughcrsh&#125;&quot;</span><br><span class="line">md5_hash = &quot;496603d6953a15846cd7cc476f146771&quot;</span><br><span class="line"># 我们需要找到 flag[13:15], flag[18:19], flag[34:35]</span><br><span class="line">chars = &#x27;abcdefghijklmnopqrstuvwxyz0123456789&#x27;</span><br><span class="line"></span><br><span class="line">def find_flag():</span><br><span class="line">    for part1 in itertools.product(chars, repeat=2):</span><br><span class="line">        p1 = &#x27;&#x27;.join(part1)</span><br><span class="line">        for c2 in chars:</span><br><span class="line">            for c3 in chars:</span><br><span class="line">                flag = f&quot;&#123;known_part[:13]&#125;&#123;p1&#125;&#123;known_part[13:16]&#125;&#123;c2&#125;&#123;known_part[16:31]&#125;&#123;c3&#125;&#123;known_part[31:]&#125;&quot;</span><br><span class="line">                hashed = hashlib.md5(flag.encode()).hexdigest()</span><br><span class="line">                if hashed == md5_hash:</span><br><span class="line">                    print(flag)</span><br><span class="line">                    return flag</span><br><span class="line">    print(&quot;未找到匹配的flag&quot;)</span><br><span class="line">    return None</span><br><span class="line"></span><br><span class="line">if __name__ == &quot;__main__&quot;:</span><br><span class="line">    find_flag()</span><br><span class="line">#LitCTF&#123;md5can123dexrypt213thoughcrpsh&#125;</span><br></pre></td></tr></table></figure></p><h2 id="Vigenere"><a href="#Vigenere" class="headerlink" title="Vigenère"></a>Vigenère</h2><p>密文:<br><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br></pre></td><td class="code"><pre><span class="line">Yzyj ia zqm Cbatky kf uavin rbgfno ig hnkozku fyyefyjzy sut gha pruyte gu famooybn bhr vqdcpipgu jaaju obecu njde pupfyytrj cpez cklb wnbzqmr ntf li wsfavm azupy nde cufmrf uh lba enxcp, tuk uwjwrnzn inq ksmuh sggcqoa zq obecu zqm Lncu gz Jagaam aaj qx Hwthxn&#x27;a Gbj gfnetyk cpez, g fwwang xnapriv li phr uyqnvupk ib mnttqnq xgioerry cpag zjws ohbaul drinsla tuk liufku obecu ovxey zjwg po gnn aecgtsneoa.</span><br><span class="line"></span><br><span class="line">Cn poyj vzyoe gxdbhf zq ty oeyl-ndiqkpl, ndag gut mrt cjy yrrgcmd rwwsf, phnz cpel gtw yjdbcnl bl zjwcn Cekjboe cklb yeezjqn htcdcannhum Rvmjlm, phnz juoam vzyoe nxn Tisk, Navarge jvd gng honshoc wf Ugrhcjefy. — Cpag zq kyyuek cpefk taadtf, Mxdeetowhps nxn qnfzklopeq gvwnt Sgf, xarvbrvg gngal fufz ywwrxu xlkm gnn koaygfn kf gnn ooiktfyz, — Tugc ehrtgnyn aae Owrz uh Yireetvmng hguiief jnateaelcre bl cpefk gfxo, ig ob bhr Xkybp os zqm Prurdy po nrcmr bx vg uxoyobp ig, gpv nk iaycqthzg fys Gbbnznzkpl, fwyvtp qtf lqmhzagoxv oa ywub lrvtlqpyku shz oemjvimopy cps cufmrf op koyh suau, af zq lbam fnjtl fkge gksg rrseye vg ybfric bhrot Kubege jvd Ugrhcjefy. Yzuqkpuy, enqknl, wvrn vcytnzn bhnz Igparasnvtf rqfa asggktifngv mdohrm vog hg ubwntkm noe rkybp aaj czaaykwhp cnabms; ntf swyoejrvgye cdf axckaqeaig zuph fnnen gncl gwnxowl aek ogla dvyywsrj vg mqfska, ehvrg wpelf gam shlhwlwbyk cpaa zq jcchg zqmmfknnyo bl gkwlvyjahc tuk owrzy vg qdipn cpel gtw uychycwmrj. Dmn shrt j toam vjuen bl jjufku shz ufaaxagoqfm, lueydqnt opnuninhug tuk usga Oopnkt rbkfwas n jnaitt vg ladhin bhrs wfxar nhbwlhzg Vyopbzram, vz kk ndevx aqguz, kl co tukrz dhza, li pheuf wfs ywub Coikavmrtv, shz tb vawvvjg fys Ghgals sut lbaie ldbuek uwwqrvzh. — Aupn jsm xert cpe cgvayjt faoneegpuy kf gnnae Pungheef; gwl shij am joj zqm nrigkmetl cqqcu iqfmprnowa tuko li wlgka bhrot xinmrx Bgsgkok ib Gbbnznzkpl. Nde uobboee qx nde cxnaeaz Mahc os Mamag Htanwia ob i hvyvglu os xnxenzgv cjjhxrms ntf mmqrcgcqoay, cdf daiowo ia jkjyyt bhsmcg zjw yotnhuqsusgfn kf nt jjsbrwly Pyegwvy bbgj ndefk Bbagku. Li lrbbn bhvy, nwn Bapzb je fadecptrj cw a pgpvcz wbxul.</span><br><span class="line"></span><br><span class="line">Hr nck lafhynl hvy Ckmang zx Tajy, vzy iofz fpoykugga aaj wmcryuslu fbx cpe caddcy gbum.</span><br><span class="line"></span><br><span class="line">Pe ugu xinbvjmmn uou Yireetxzs gu rsmo Lncb wf vsowxeagk jvd cxgkment ovxoezcfwa, uarnas fauhyjdrj rv tukkj ileegcqoa zkdf dif Gbaeaz uziqlq hn wbggkfyz; aaj fpea yq kooprtmmd, uk jsm qtgkaty akidyytrj cw agzgfx po gnnu.</span><br><span class="line"></span><br><span class="line">Hr nck lafhynl tb vckm ktuka Tajy hgl phr glkozsqvupibt xn lnxiw xesgxrktf uh hykpyk, dvlryu lbksr vnwpyk ygohd ekuqndakkb phr xrohg uh Jylrrynvtnzkgh en gnn Tetoudupuek, j zitnv ahasgovibyk vg ndez gwl fbxoaxwbyk cw tlxcfno oarh.</span><br><span class="line"></span><br><span class="line">Pe ugu uuhlrj cwgrzjwl hetobtagoxw vkdvkb it crcuyo uaabcay, apuiifbxcibyk, cfx zifzjvt sxqe nde qkywsvzqjs kf gnnqr Caddcy Rrixzdf, lqj nde fuum phxrgma os ljbitakfa phrs rvtb iqejhintlm wvzj zco mrgbcrry.</span><br><span class="line"></span><br><span class="line">Jw bws qobaoybgv Lapekbmnggvapa Hbabms ekrwupeqrh, noe urhioiam fqtu scffu fvxvvefy jam enigbqoay qf nde eopptf uh lba pruyte.</span><br><span class="line"></span><br><span class="line">Uk jsm nesabmd sut s fknt zrue, nlvwl oupn mqsfunmneoay, cw cnauw iphrxb bo ok gdyytrj, fpeekdq nde Ykpqsygvapa Pbcnzs, vtesjwbyk xn Aatkzchagoxv, hnbg jypuetnl tb zjw Jaocrn it ygtyy boe zqmie kzwlyifk; cpe Fzcly nezgrviam kf nde zkjv tvsg wrlofkm bo nrn lba dntpmrf uh ahrafoxv feuo ocphbac, inq iqfpqlfoxvs jovzcj.</span><br><span class="line"></span><br><span class="line">Hr nja eajgspkuekm bo cxgnyjt gnn xocansneoa uo bhryg Knwtry; owr gncl jqrcubm ooyvjoytvtp bhr Rcom boe Tjbuegnatwtvuw wf Sutwccnrxb; zesauahc tb vjas bzjwlo tb kwkohxcyy phroa uitxclcknf nrbhrx, cfx navyrvg gng uijdvzrwnf uh fys Acvawpeoclcknf uo Taaju.</span><br><span class="line"></span><br><span class="line">Zy daf ukateaelyz tuk Jlmvtkknnagoxv os Pwknecr hh zesauahc hvy Jasrtv li Hajy owr ryvsvhifnrvg Wafaweaee Ywwrxu.</span><br><span class="line"></span><br><span class="line">Zy daf sjle Wafyyo drvnvdrtv gh dif Crtl nrqfy boe zqm trtwjy kf gnnqr blhawas, ntm bhr gogojt ntm xalsgfn kf gnnqr fgnsleef.</span><br><span class="line"></span><br><span class="line">luig vy cxwpf&#123;Jnxwobuqg_O_Cogiqi!&#125;</span><br><span class="line"></span><br><span class="line">Hr nck ynepznl a zanlcpuqk xn Nrc Qxzecry, jvd fkpl betuka awnxok ib Oslrkeey vg bwrnyb wue vggjhe ntm mag uwl ndevx bcbfzcfwa.</span><br><span class="line"></span><br><span class="line">Hr nja krvv sgknt ab, qn goowm kf ckjke, Fzcfxent Gauiry yandohz cpe Pupkyjt bl xcr ykiamhagaams.</span><br><span class="line"></span><br><span class="line">Uk jsm wfsklbeq zq jyjdrx cpe Zonanwrl owleckpvyjt bl jvd farwleoe zx bhr Iknch Pbcnz.</span><br><span class="line"></span><br><span class="line">Hr nck wkmoowmd jovz iphrxb bo fadbyyt hy cw a watamzipzrwn sutwccn gu xcr pupknethzrwn, ntf mhwcxtxelrjiwx xy baa tajy; iapent nra Afygfn po gnnqr Nivk ib pekcmnqkf Dycifrjbibt:</span><br><span class="line"></span><br><span class="line">Hgl munxcmrvti dungr hxliry qx unmrj czobvu sgknt ab:</span><br><span class="line"></span><br><span class="line">Noe vtgnacgowo tuko, ts w mbit Brvgn xlkm cawqsusgfn boe gwg Mhxfwlo wuolp tuka kbkuyj lwmzov gh phr Owpaoovshps bl cpefk Ulupef:</span><br><span class="line"></span><br><span class="line">Lxz chzvahc osl xcr Gxcvy sign jtl cgtlm kf gnn eoerf:</span><br><span class="line"></span><br><span class="line">Xin izvxaiam Vsras bt da wvzjgop ohx Lwnfkpl:</span><br><span class="line"></span><br><span class="line">Zkr qkyziiopy oo ia sjvy pguwm, kf gnn jeakhan kf Gxril oe Lmlu:</span><br><span class="line"></span><br><span class="line">Fbx czaayrglpiam da breqfx Oeny cw br ztayz fbx yzegkpvyz oslnvcry:</span><br><span class="line"></span><br><span class="line">Hgl wbbrrahvti lba fekn Ayfzge ib Eamuqsu Rcom en n tnqguhqmlent Vawvvtew, yotnhuqsuopy ndeekrv aa Gttcprnxh ooiktfgang, gwl earcjaent oca Bbapvuniry bw af zq jyjdrx rb ag upuy wn rdjupyk cfx big owateaowhp fbx rvteufmwent zqm snsg svooyacm rhrg ahpo gnnae Pungheef</span><br><span class="line"></span><br><span class="line">Lxz tnqkfa wwne xcr Pncjnarf, gkwlvyjahc ohx vwsg bcdowbyk Uiwf gpv uhtrxrvg sapvuieazjtll zjw Zkrzy xn ohx Igparasnvtf:</span><br><span class="line"></span><br><span class="line">Lqj mqsckwliam qml kwa Rnoifrclonef, gwl drinslent zqmmfknnyo iabnatrj yand pbcnz tb rgycolnzn noe au ah wly ijaef cjsnoorbnz.</span><br><span class="line"></span><br><span class="line">Hr nck uxdvijbeq Mqnynnzkwb hrxg, ts zeprjziam wk iqt bl qqs Cxqlyytvuw inq ccycjg Jga ignopkn qs.</span><br><span class="line"></span><br><span class="line">Uk qis crwfxarrj xcr fkck, lwvnmnl ohx eguotf, hdzng uwj nkway, jvd qkullkyrj cpe yoxwm kf baa xebvnw.</span><br><span class="line"></span><br><span class="line">Ba if gc bhvy vaga tegwapbxvahc lnxpm Aeskwm kf suamitt Owlyeagaqef zq uiipykjb tuk yglgs bl mmagn, fwmklnzrwn, ntf lsnaath, ilekcvs xetaw eign ealyuzycinpku gz Yrhkuby &amp; Cktxczy fijzcrra hunayrnteq op lba mbyc jaehcjiqs nmna, aaj vgnwlye dvwbxvzs phr Nnid bl c ucriyoimd agvaij.</span><br><span class="line"></span><br><span class="line">Hr nja cbtullwiakm wue lgdfkw Pocqzrtu lugea Ijxtvbg gh phr nroh Fkck nk brga Irzy cyuenfz cpevx Egojtee, cw briqey phr kgmchzkgharf uo bhrot xleeajb inq Htwndrrt, xz tb lcdf phrsbmliku ts phroa Paaju.</span><br><span class="line"></span><br><span class="line">Zy daf kgkigkf viiefzrk iaywjlacgoxvs nsqfaot hy, jvd ugu whzenbxcrrj vg vniam xv tuk kfbwbvzjvtf uh gon feuwbirxu, lba mrxlqlryu Ahzint Bivnmgk qdofk tvojt tmfa os cjzfnxg, am wn htmqsgopyoesukm lefztmwpibt xn ayr cyyo, srdna aaj eghzigoxvs.</span><br><span class="line"></span><br><span class="line">Vt gnyny fzjoe bl vzyoe Bvyzefykgho Wr njde Ckvaneoakm noe Xgvlasf ow bhr sqkn duzhum trxok: Iqr ekymagkf Hypigoxvs ugxw vaea gwawrxgv ijll hh zeckclyz iapdzy. N Vtahye, jnxae pncjuytrx ra tuau eunkrj kg eiktq uyt jnrkh zga vybiak j Byegpl, co ualrb tb hg lba rhrnz os g hjya pruyte.</span><br><span class="line"></span><br><span class="line">Aut zure Jk kmea ccfnent ow itgkplcknf zx wue Htanesu hamtuxgf. Qa hnbn eaetgv ndez lawm goow nk tvsn wf nzvwgltf hh bhrot dycifrjbuek vg yttrtm in htyslnaazjjlr pwjcodvicqoa uxwl qs. Jk qivr xgecjdrj cpez uh lba cvxlcmfzcfwas bl xcr rskylwtvuw inq yglnhezkwb hrxg. Oy daik jxprgnwx po gnnqr agvapa jhycqcr gpv gwgagwqmvza, shz wr njde pupboneq zqmm oe vzy piry xn ohx eggioa qrvdekf li zifgeww gngky qshxyitvupk, qdipn fwuyj kfyriggkty vtvwlnucz xcr pupfyytvuwa aaj eglnefvxvdrtew. Ndel zxw hnbg tyan qkjn tb zjw pkipk xn jhyvawa aaj xn cbtushcuvtrby. Jk ommp, tukamfbxg, swmuvkbke vt vzy jepkbaige, yzcyh qkwwuaigk iqr Fkyirnzkgh, wnq nxtd gnge, uo wr nxtd gng jyot bl vinxopv, Yjezona ia Ccj, cj Prglm Feogfxo.</span><br><span class="line"></span><br><span class="line">Wr, zqmrrlqjy, phr Xnxrrygfnwtvbna os zjw ojigkm Atnzgk ib Azkaqcn, op Yyjeegu Koamtwmo, Afynubykf, sjlenrrvg gu vzy Oucxnue Wafyy kf gnn eoerf xin tuk amcgovmxa os udz iazgfneoay, mw, ia zjw Hwmr, gwl bl Gwlbkrvzh wf gng yikd Ckxxlr uh lbasr Ixtoaogk, mklrswty caddcoh ntm leprcjy, Phnz cpefk wfcpeq Ixtoaogk une, ntm wf Eoizn kutnc bo ok Hjya aaj Rvdrvgfxang Ycitry, vzup tukh irr Gdkihvrj ozoz gnd Uhlrmrinpk vg nde Oxrbifn Ejisn, ntm bhnz cdf loyocqcnr eghjepzrwn okvoyan gnnu aaj vzy Otnzn wf Txgsn Xrvzjqn, vy cfx kutnc bo ok vgnwlye mqsfunnyz; aaj cpag gu Xlae ntm Qnqkrwhzeaz Bbagku, lbay ugem fhrn Hisee zx teie Ysl, yoaiucdr Vgswa, cbtczapz Cdfeaaina, efzctfesu Ixumrxew, ujd gu mw ayr qlbar Nica aaj Vzcjgf cqqcu Opvyleajnvt Fzclyo mne xn rvmjl xk. — Aaj owr gng kolpbxc wf gnkk Xacygaitvup, ocph n lrzm eknaujcr uw bhr vtgnacgoxv os Jkncje Cxxdiqkpuy, se zaccayra hfadtk cw enij gndee udz Lvbgk, iqr Suabuaku, shz ohx bicekf Zijoe.</span><br></pre></td></tr></table></figure></p><p>Encode.c:<br><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br></pre></td><td class="code"><pre><span class="line">#include &lt;stdio.h&gt;</span><br><span class="line">#include &lt;string.h&gt;</span><br><span class="line">#include &lt;stdlib.h&gt;</span><br><span class="line"></span><br><span class="line">int main()</span><br><span class="line">&#123;</span><br><span class="line">freopen(&quot;flag.txt&quot;,&quot;r&quot;,stdin);</span><br><span class="line">freopen(&quot;flag_encode.txt&quot;,&quot;w&quot;,stdout);</span><br><span class="line">char key[] = /*SADLY SAYING! Key is eaten by Monster!*/;</span><br><span class="line">int len = strlen(key);</span><br><span class="line">char ch;</span><br><span class="line">int index = 0;</span><br><span class="line">while((ch = getchar()) != EOF)&#123;</span><br><span class="line">if(ch&gt;=&#x27;a&#x27;&amp;&amp;ch&lt;=&#x27;z&#x27;)&#123;</span><br><span class="line">putchar((ch-&#x27;a&#x27;+key[index%len]-&#x27;a&#x27;)%26+&#x27;a&#x27;);</span><br><span class="line">++index;</span><br><span class="line">&#125;else if(ch&gt;=&#x27;A&#x27;&amp;&amp;ch&lt;=&#x27;Z&#x27;)&#123;</span><br><span class="line">putchar((ch-&#x27;A&#x27;+key[index%len]-&#x27;a&#x27;)%26+&#x27;A&#x27;);</span><br><span class="line">++index;</span><br><span class="line">&#125;else&#123;</span><br><span class="line">putchar(ch);</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line">return 0;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><br>这个有<a href="https://www.guballa.de/vigenere-solver">在线的暴力解密工具</a></p><p><img src="https://source.yizhixiaojiuli.cn/img/2025-SWPU-NSSCTF-秋季招新入门训练赛\Vigenère.webp" alt="afctf{Whooooooo_U_Gotcha!}"></p><h2 id="is-only-base"><a href="#is-only-base" class="headerlink" title="is only base?"></a>is only base?</h2><p>题目:<br><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">SWZxWl=F=DQef0hlEiSUIVh9ESCcMFS9NF2NXFzM</span><br><span class="line">今年是本世纪的第23年呢</span><br></pre></td></tr></table></figure><br><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">key是23</span><br><span class="line"></span><br><span class="line">W型栅栏</span><br><span class="line">BASE64</span><br><span class="line">凯撒密码</span><br><span class="line">#NSSCTF&#123;LeT_Us_H4V3_fU0!!!!!&#125;</span><br></pre></td></tr></table></figure></p><h2 id="childRSA"><a href="#childRSA" class="headerlink" title="childRSA"></a>childRSA</h2><p>题目:<br><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br></pre></td><td class="code"><pre><span class="line">from random import choice</span><br><span class="line">from Crypto.Util.number import isPrime, sieve_base as primes</span><br><span class="line">from flag import flag</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">def getPrime(bits):</span><br><span class="line">    while True:</span><br><span class="line">        n = 2</span><br><span class="line">        while n.bit_length() &lt; bits:</span><br><span class="line">            n *= choice(primes)</span><br><span class="line">        if isPrime(n + 1):</span><br><span class="line">            return n + 1</span><br><span class="line"></span><br><span class="line">e = 0x10001</span><br><span class="line">m = int.from_bytes(flag.encode(), &#x27;big&#x27;)</span><br><span class="line">p, q = [getPrime(2048) for _ in range(2)]</span><br><span class="line">n = p * q</span><br><span class="line">c = pow(m, e, n)</span><br><span class="line"></span><br><span class="line"># n = 32849718197337581823002243717057659218502519004386996660885100592872201948834155543125924395614928962750579667346279456710633774501407292473006312537723894221717638059058796679686953564471994009285384798450493756900459225040360430847240975678450171551048783818642467506711424027848778367427338647282428667393241157151675410661015044633282064056800913282016363415202171926089293431012379261585078566301060173689328363696699811123592090204578098276704877408688525618732848817623879899628629300385790344366046641825507767709276622692835393219811283244303899850483748651722336996164724553364097066493953127153066970594638491950199605713033004684970381605908909693802373826516622872100822213645899846325022476318425889580091613323747640467299866189070780620292627043349618839126919699862580579994887507733838561768581933029077488033326056066378869170169389819542928899483936705521710423905128732013121538495096959944889076705471928490092476616709838980562233255542325528398956185421193665359897664110835645928646616337700617883946369110702443135980068553511927115723157704586595844927607636003501038871748639417378062348085980873502535098755568810971926925447913858894180171498580131088992227637341857123607600275137768132347158657063692388249513</span><br><span class="line"># c = 26308018356739853895382240109968894175166731283702927002165268998773708335216338997058314157717147131083296551313334042509806229853341488461087009955203854253313827608275460592785607739091992591431080342664081962030557042784864074533380701014585315663218783130162376176094773010478159362434331787279303302718098735574605469803801873109982473258207444342330633191849040553550708886593340770753064322410889048135425025715982196600650740987076486540674090923181664281515197679745907830107684777248532278645343716263686014941081417914622724906314960249945105011301731247324601620886782967217339340393853616450077105125391982689986178342417223392217085276465471102737594719932347242482670320801063191869471318313514407997326350065187904154229557706351355052446027159972546737213451422978211055778164578782156428466626894026103053360431281644645515155471301826844754338802352846095293421718249819728205538534652212984831283642472071669494851823123552827380737798609829706225744376667082534026874483482483127491533474306552210039386256062116345785870668331513725792053302188276682550672663353937781055621860101624242216671635824311412793495965628876036344731733142759495348248970313655381407241457118743532311394697763283681852908564387282605279108</span><br></pre></td></tr></table></figure></p><p>这里我们发现素数的生成和以前的题目不一样，它是通过choice在prime中随机选取再做累积得来的，简言之就是我们得到了$p = p_1p_2p_3…p_n + 1$这样形式的素数。</p><p>这样的数被称为光滑数：当一个数的最大素因子组不大于$x$时，称其为$x$-光滑数，例如$12=2^2×3$，可称它为4-光滑数（因$2^2$是最大的素因子组）。这里可称$p$为$p$-光滑数（$p$本身是素数），但$p - 1$包含许多小素因子，假设$p - 1$为$k$-光滑数，则有数$M$满足：</p><script type="math/tex; mode=display">M = \prod_{i} p_i^{\log_{p_i} k}</script><p>显然有：</p><script type="math/tex; mode=display">(p - 1)|M</script><p>因为$M$中包含了$p - 1$中的每一个素因子组，那么有：</p><script type="math/tex; mode=display">\gcd(M,n) = p</script><p>所以我们只需要得到$M$就能求解$p$，但如何得到$M$呢？<br>这里要用到$Pollard’s\ p - 1$分解算法。</p><p>我们设$M = s \times (p - 1)$，根据费马小定理有：</p><script type="math/tex; mode=display">a^M \equiv 1 \pmod{p}</script><p>因为$p - 1$为$k$-光滑数，所以有：</p><script type="math/tex; mode=display">M|k!</script><p>因此有：</p><script type="math/tex; mode=display">\gcd(a^{k!} - 1, n) = p</script><p>由于$p - 1$包含的素因子都较小，$k$也较小，只需遍历所有的$a^x - 1$与$n$求$\gcd$即可找到$p$。</p><p>exp:<br><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre><span class="line">def pollard(N):</span><br><span class="line">    a = 2</span><br><span class="line">    n = 2</span><br><span class="line">    while True:</span><br><span class="line">        a = powmod(a, n, N)</span><br><span class="line">        p = gcd(a-1, N)</span><br><span class="line">        if p != 1 and p != N:</span><br><span class="line">            return p</span><br><span class="line">        n += 1</span><br><span class="line"></span><br><span class="line">n = 32849718197337581823002243717057659218502519004386996660885100592872201948834155543125924395614928962750579667346279456710633774501407292473006312537723894221717638059058796679686953564471994009285384798450493756900459225040360430847240975678450171551048783818642467506711424027848778367427338647282428667393241157151675410661015044633282064056800913282016363415202171926089293431012379261585078566301060173689328363696699811123592090204578098276704877408688525618732848817623879899628629300385790344366046641825507767709276622692835393219811283244303899850483748651722336996164724553364097066493953127153066970594638491950199605713033004684970381605908909693802373826516622872100822213645899846325022476318425889580091613323747640467299866189070780620292627043349618839126919699862580579994887507733838561768581933029077488033326056066378869170169389819542928899483936705521710423905128732013121538495096959944889076705471928490092476616709838980562233255542325528398956185421193665359897664110835645928646616337700617883946369110702443135980068553511927115723157704586595844927607636003501038871748639417378062348085980873502535098755568810971926925447913858894180171498580131088992227637341857123607600275137768132347158657063692388249513</span><br><span class="line">c = 26308018356739853895382240109968894175166731283702927002165268998773708335216338997058314157717147131083296551313334042509806229853341488461087009955203854253313827608275460592785607739091992591431080342664081962030557042784864074533380701014585315663218783130162376176094773010478159362434331787279303302718098735574605469803801873109982473258207444342330633191849040553550708886593340770753064322410889048135425025715982196600650740987076486540674090923181664281515197679745907830107684777248532278645343716263686014941081417914622724906314960249945105011301731247324601620886782967217339340393853616450077105125391982689986178342417223392217085276465471102737594719932347242482670320801063191869471318313514407997326350065187904154229557706351355052446027159972546737213451422978211055778164578782156428466626894026103053360431281644645515155471301826844754338802352846095293421718249819728205538534652212984831283642472071669494851823123552827380737798609829706225744376667082534026874483482483127491533474306552210039386256062116345785870668331513725792053302188276682550672663353937781055621860101624242216671635824311412793495965628876036344731733142759495348248970313655381407241457118743532311394697763283681852908564387282605279108</span><br><span class="line">e = 0x10001</span><br><span class="line"></span><br><span class="line">p = pollard(n)</span><br><span class="line">q = n // p</span><br><span class="line">d = invert(e, (p-1)*(q-1))</span><br><span class="line">print(long_to_bytes(powmod(c, d, n)))</span><br><span class="line">#NCTF&#123;Th3r3_ar3_1ns3cure_RSA_m0duli_7hat_at_f1rst_gl4nce_appe4r_t0_be_s3cur3&#125;</span><br></pre></td></tr></table></figure></p><h2 id="Crazy-Rsa-Tech"><a href="#Crazy-Rsa-Tech" class="headerlink" title="Crazy_Rsa_Tech"></a>Crazy_Rsa_Tech</h2><p>chall.py:<br><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br></pre></td><td class="code"><pre><span class="line">from Crypto.Util.number import *</span><br><span class="line">from Crypto.Util.Padding import *</span><br><span class="line"></span><br><span class="line">FLAG = bytes_to_long(pad(b&quot;flag&#123;??????&#125;&quot;,64))</span><br><span class="line">def init_key():</span><br><span class="line">    p, q = getPrime(512), getPrime(512)</span><br><span class="line">    n = p*q</span><br><span class="line">    e = 9</span><br><span class="line">    while(GCD((p-1)*(q-1),e)!=1):</span><br><span class="line">        p, q = getPrime(512), getPrime(512)</span><br><span class="line">        n = p*q</span><br><span class="line">    d = inverse(e,(p-1)*(q-1))</span><br><span class="line">    return n,e,d</span><br><span class="line"></span><br><span class="line">n_list=list()</span><br><span class="line">c_list=list()</span><br><span class="line">for i in range(9):</span><br><span class="line">    N,e,d=init_key()</span><br><span class="line">    n_list.append(N)</span><br><span class="line">    c=pow(FLAG,e,N)</span><br><span class="line">    c_list.append(pow(FLAG,e,N))</span><br><span class="line">    assert(pow(c,d,N)==FLAG)</span><br><span class="line">print(&quot;n_list:&quot;,n_list)</span><br><span class="line">print(&quot;c_list:&quot;,c_list)</span><br></pre></td></tr></table></figure></p><p>output:<br><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">n_list: [71189786319102608575263218254922479901008514616376166401353025325668690465852130559783959409002115897148828732231478529655075366072137059589917001875303598680931962384468363842379833044123189276199264340224973914079447846845897807085694711541719515881377391200011269924562049643835131619086349617062034608799, 92503831027754984321994282254005318198418454777812045042619263533423066848097985191386666241913483806726751133691867010696758828674382946375162423033994046273252417389169779506788545647848951018539441971140081528915876529645525880324658212147388232683347292192795975558548712504744297104487514691170935149949, 100993952830138414466948640139083231443558390127247779484027818354177479632421980458019929149817002579508423291678953554090956334137167905685261724759487245658147039684536216616744746196651390112540237050493468689520465897258378216693418610879245129435268327315158194612110422630337395790254881602124839071919, 59138293747457431012165762343997972673625934330232909935732464725128776212729547237438509546925172847581735769773563840639187946741161318153031173864953372796950422229629824699580131369991913883136821374596762214064774480548532035315344368010507644630655604478651898097886873485265848973185431559958627423847, 66827868958054485359731420968595906328820823695638132426084478524423658597714990545142120448668257273436546456116147999073797943388584861050133103137697812149742551913704341990467090049650721713913812069904136198912314243175309387952328961054617877059134151915723594900209641163321839502908705301293546584147, 120940513339890268554625391482989102665030083707530690312336379356969219966820079510946652021721814016286307318930536030308296265425674637215009052078834615196224917417698019787514831973471113022781129000531459800329018133248426080717653298100515701379374786486337920294380753805825328119757649844054966712377, 72186594495190221129349814154999705524005203343018940547856004977368023856950836974465616291478257156860734574686154136925776069045232149725101769594505766718123155028300703627531567850035682448632166309129911061492630709698934310123778699316856399909549674138453085885820110724923723830686564968967391721281, 69105037583161467265649176715175579387938714721653281201847973223975467813529036844308693237404592381480367515044829190066606146105800243199497182114398931410844901178842049915914390117503986044951461783780327749665912369177733246873697481544777183820939967036346862056795919812693669387731294595126647751951, 76194219445824867986050004226602973283400885106636660263597964027139613163638212828932901192009131346530898961165310615466747046710743013409318156266326090650584190382130795884514074647833949281109675170830565650006906028402714868781834693473191228256626654011772428115359653448111208831188721505467497494581]</span><br><span class="line">c_list: [62580922178008480377006528793506649089253164524883696044759651305970802215270721223149734532870729533611357047595181907404222690394917605617029675103788705320032707977225447998111744887898039756375876685711148857676502670812333076878964148863713993853526715855758799502735753454247721711366497722251078739585, 46186240819076690248235492196228128599822002268014359444368898414937734806009161030424589993541799877081745454934484263188270879142125136786221625234555265815513136730416539407710862948861531339065039071959576035606192732936477944770308784472646015244527805057990939765708793705044236665364664490419874206900, 85756449024868529058704599481168414715291172247059370174556127800630896693021701121075838517372920466708826412897794900729896389468152213884232173410022054605870785910461728567377769960823103334874807744107855490558726013068890632637193410610478514663078901021307258078678427928255699031215654693270240640198, 14388767329946097216670270960679686032536707277732968784379505904021622612991917314721678940833050736745004078559116326396233622519356703639737886289595860359630019239654690312132039876082685046329079266785042428947147658321799501605837784127004536996628492065409017175037161261039765340032473048737319069656, 1143736792108232890306863524988028098730927600066491485326214420279375304665896453544100447027809433141790331191324806205845009336228331138326163746853197990596700523328423791764843694671580875538251166864957646807184041817863314204516355683663859246677105132100377322669627893863885482167305919925159944839, 2978800921927631161807562509445310353414810029862911925227583943849942080514132963605492727604495513988707849133045851539412276254555228149742924149242124724864770049898278052042163392380895275970574317984638058768854065506927848951716677514095183559625442889028813635385408810698294574175092159389388091981, 16200944263352278316040095503540249310705602580329203494665614035841657418101517016718103326928336623132935178377208651067093136976383774189554806135146237406248538919915426183225265103769259990252162411307338473817114996409705345401251435268136647166395894099897737607312110866874944619080871831772376466376, 31551601425575677138046998360378916515711528548963089502535903329268089950335615563205720969393649713416910860593823506545030969355111753902391336139384464585775439245735448030993755229554555004154084649002801255396359097917380427525820249562148313977941413268787799534165652742114031759562268691233834820996, 25288164985739570635307839193110091356864302148147148153228604718807817833935053919412276187989509493755136905193728864674684139319708358686431424793278248263545370628718355096523088238513079652226028236137381367215156975121794485995030822902933639803569133458328681148758392333073624280222354763268512333515]</span><br></pre></td></tr></table></figure></p><p>我们会发现有<script type="math/tex">c_i \equiv m^e \pmod{n_i}</script></p><p>如果我们把$m^e$看成一个整体，那么问题就变成了给你一个数取不同的模数的余数问你这个数是多少，这类问题我们可以用中国剩余定理(CRT)解决。</p><script type="math/tex; mode=display">m^e \equiv \sum_{i=1}^{n} c_i t_i M_i \pmod{N}</script><p>其中</p><script type="math/tex; mode=display">\begin{align*}N &= n_1 n_2 \dots n_n \\M_i &= N / n_i \\M_i t_i &\equiv 1 \pmod{n_i}\end{align*}</script><p>这样我们就得到了$m^e$再开个e次幂即可</p><p>exp:<br><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br></pre></td><td class="code"><pre><span class="line">n_list = [</span><br><span class="line">   71189786319102608575263218254922479901008514616376166401353025325668690465852130559783959409002115897148828732231478529655075366072137059589917001875303598680931962384468363842379833044123189276199264340224973914079447846845897807085694711541719515881377391200011269924562049643835131619086349617062034608799,</span><br><span class="line">   92503831027754984321994282254005318198418454777812045042619263533423066848097985191386666241913483806726751133691867010696758828674382946375162423033994046273252417389169779506788545647848951018539441971140081528915876529645525880324658212147388232683347292192795975558548712504744297104487514691170935149949,</span><br><span class="line">   100993952830138414466948640139083231443558390127247779484027818354177479632421980458019929149817002579508423291678953554090956334137167905685261724759487245658147039684536216616744746196651390112540237050493468689520465897258378216693418610879245129435268327315158194612110422630337395790254881602124839071919,</span><br><span class="line">   59138293747457431012165762343997972673625934330232909935732464725128776212729547237438509546925172847581735769773563840639187946741161318153031173864953372796950422229629824699580131369991913883136821374596762214064774480548532035315344368010507644630655604478651898097886873485265848973185431559958627423847,</span><br><span class="line">   66827868958054485359731420968595906328820823695638132426084478524423658597714990545142120448668257273436546456116147999073797943388584861050133103137697812149742551913704341990467090049650721713913812069904136198912314243175309387952328961054617877059134151915723594900209641163321839502908705301293546584147,</span><br><span class="line">   120940513339890268554625391482989102665030083707530690312336379356969219966820079510946652021721814016286307318930536030308296265425674637215009052078834615196224917417698019787514831973471113022781129000531459800329018133248426080717653298100515701379374786486337920294380753805825328119757649844054966712377,</span><br><span class="line">   72186594495190221129349814154999705524005203343018940547856004977368023856950836974465616291478257156860734574686154136925776069045232149725101769594505766718123155028300703627531567850035682448632166309129911061492630709698934310123778699316856399909549674138453085885820110724923723830686564968967391721281,</span><br><span class="line">   69105037583161467265649176715175579387938714721653281201847973223975467813529036844308693237404592381480367515044829190066606146105800243199497182114398931410844901178842049915914390117503986044951461783780327749665912369177733246873697481544777183820939967036346862056795919812693669387731294595126647751951,</span><br><span class="line">   76194219445824867986050004226602973283400885106636660263597964027139613163638212828932901192009131346530898961165310615466747046710743013409318156266326090650584190382130795884514074647833949281109675170830565650006906028402714868781834693473191228256626654011772428115359653448111208831188721505467497494581]</span><br><span class="line">c_list = [</span><br><span class="line">   62580922178008480377006528793506649089253164524883696044759651305970802215270721223149734532870729533611357047595181907404222690394917605617029675103788705320032707977225447998111744887898039756375876685711148857676502670812333076878964148863713993853526715855758799502735753454247721711366497722251078739585,</span><br><span class="line">   46186240819076690248235492196228128599822002268014359444368898414937734806009161030424589993541799877081745454934484263188270879142125136786221625234555265815513136730416539407710862948861531339065039071959576035606192732936477944770308784472646015244527805057990939765708793705044236665364664490419874206900,</span><br><span class="line">   85756449024868529058704599481168414715291172247059370174556127800630896693021701121075838517372920466708826412897794900729896389468152213884232173410022054605870785910461728567377769960823103334874807744107855490558726013068890632637193410610478514663078901021307258078678427928255699031215654693270240640198,</span><br><span class="line">   14388767329946097216670270960679686032536707277732968784379505904021622612991917314721678940833050736745004078559116326396233622519356703639737886289595860359630019239654690312132039876082685046329079266785042428947147658321799501605837784127004536996628492065409017175037161261039765340032473048737319069656,</span><br><span class="line">   1143736792108232890306863524988028098730927600066491485326214420279375304665896453544100447027809433141790331191324806205845009336228331138326163746853197990596700523328423791764843694671580875538251166864957646807184041817863314204516355683663859246677105132100377322669627893863885482167305919925159944839,</span><br><span class="line">   2978800921927631161807562509445310353414810029862911925227583943849942080514132963605492727604495513988707849133045851539412276254555228149742924149242124724864770049898278052042163392380895275970574317984638058768854065506927848951716677514095183559625442889028813635385408810698294574175092159389388091981,</span><br><span class="line">   16200944263352278316040095503540249310705602580329203494665614035841657418101517016718103326928336623132935178377208651067093136976383774189554806135146237406248538919915426183225265103769259990252162411307338473817114996409705345401251435268136647166395894099897737607312110866874944619080871831772376466376,</span><br><span class="line">   31551601425575677138046998360378916515711528548963089502535903329268089950335615563205720969393649713416910860593823506545030969355111753902391336139384464585775439245735448030993755229554555004154084649002801255396359097917380427525820249562148313977941413268787799534165652742114031759562268691233834820996,</span><br><span class="line">   25288164985739570635307839193110091356864302148147148153228604718807817833935053919412276187989509493755136905193728864674684139319708358686431424793278248263545370628718355096523088238513079652226028236137381367215156975121794485995030822902933639803569133458328681148758392333073624280222354763268512333515]</span><br><span class="line">n = 1</span><br><span class="line">for i in n_list:</span><br><span class="line">   n = n * i</span><br><span class="line"></span><br><span class="line">n_ = []</span><br><span class="line">for i in n_list:</span><br><span class="line">   n_.append(n // i)</span><br><span class="line"></span><br><span class="line">t = []</span><br><span class="line">for i in range(9):</span><br><span class="line">   t.append(inverse(n_[i], n_list[i]))</span><br><span class="line"></span><br><span class="line">x = 0</span><br><span class="line">for i in range(len(n_list)):</span><br><span class="line">   x = c_list[i] * n_[i] * t[i] + x</span><br><span class="line">x = x % n</span><br><span class="line">print(x)</span><br><span class="line">x = iroot(x, 9)[0]</span><br><span class="line">print(long_to_bytes(x))</span><br><span class="line">flag&#123;H0w_Fun_13_HAstads_broadca5t_AtTack!&#125;</span><br></pre></td></tr></table></figure></p><h2 id="factordb-中级-和yafu-中级"><a href="#factordb-中级-和yafu-中级" class="headerlink" title="factordb (中级)和yafu (中级)"></a>factordb (中级)和yafu (中级)</h2><p>题目：<br>factordb:<br><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">e = 65537</span><br><span class="line">n = 87924348264132406875276140514499937145050893665602592992418171647042491658461</span><br><span class="line">c = 87677652386897749300638591365341016390128692783949277305987828177045932576708</span><br></pre></td></tr></table></figure><br>yafu:<br><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line">from Crypto.Util.number import *</span><br><span class="line">from secret import flag</span><br><span class="line"></span><br><span class="line">m = bytes_to_long(flag)</span><br><span class="line">n  = 1</span><br><span class="line">for i in range(15):</span><br><span class="line">    n *=getPrime(32)</span><br><span class="line">e = 65537</span><br><span class="line">c = pow(m,e,n)</span><br><span class="line">print(f&#x27;n = &#123;n&#125;&#x27;)</span><br><span class="line">print(f&#x27;c = &#123;c&#125;&#x27;)</span><br><span class="line">&#x27;&#x27;&#x27;</span><br><span class="line">n = 15241208217768849887180010139590210767831431018204645415681695749294131435566140166245881287131522331092026252879324931622292179726764214435307</span><br><span class="line">c = 12608550100856399369399391849907846147170257754920996952259023159548789970041433744454761458030776176806265496305629236559551086998780836655717</span><br><span class="line">&#x27;&#x27;&#x27;</span><br></pre></td></tr></table></figure><br>这个就没啥说的题目啥也没给的时候就尝试用<a href="https://factordb.com/">factordb</a>直接分解一下试试<br>yafu是生成n的素数差距很大或很小可是用它试试<br>可以去bilibili上找一下风二西的工具里面就有<br>exp:<br><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br></pre></td><td class="code"><pre><span class="line">#factordb</span><br><span class="line">e = 65537</span><br><span class="line">n = 87924348264132406875276140514499937145050893665602592992418171647042491658461</span><br><span class="line">c = 87677652386897749300638591365341016390128692783949277305987828177045932576708</span><br><span class="line">p = 275127860351348928173285174381581152299</span><br><span class="line">q = 319576316814478949870590164193048041239</span><br><span class="line">d = inverse(e, n - p - q + 1)</span><br><span class="line">print(long_to_bytes(powmod(c,d,n)))</span><br><span class="line">#LitCTF&#123;factordb!!!&#125;</span><br><span class="line"></span><br><span class="line">#yafu</span><br><span class="line"></span><br><span class="line">primes = [</span><br><span class="line">    2201440207,</span><br><span class="line">    2719600579,</span><br><span class="line">    4044505687,</span><br><span class="line">    2758708999,</span><br><span class="line">    2923522073,</span><br><span class="line">    3989697563,</span><br><span class="line">    3355651511,</span><br><span class="line">    2151018733,</span><br><span class="line">    4021078331,</span><br><span class="line">    2315495107,</span><br><span class="line">    2906576131,</span><br><span class="line">    2767137487,</span><br><span class="line">    2585574697,</span><br><span class="line">    3354884521,</span><br><span class="line">    4171911923</span><br><span class="line">]</span><br><span class="line"></span><br><span class="line">c = 12608550100856399369399391849907846147170257754920996952259023159548789970041433744454761458030776176806265496305629236559551086998780836655717</span><br><span class="line">e = 65537</span><br><span class="line">n = 15241208217768849887180010139590210767831431018204645415681695749294131435566140166245881287131522331092026252879324931622292179726764214435307</span><br><span class="line"></span><br><span class="line">phi_factors = [p - 1 for p in primes]</span><br><span class="line">phi = 1</span><br><span class="line">for factor in phi_factors:</span><br><span class="line">    phi *= factor</span><br><span class="line">d = inverse(e, phi)</span><br><span class="line">print(long_to_bytes(powmod(c, d, n)))</span><br><span class="line">#LitCTF&#123;Mu1tiple_3m4ll_prim5_fac7ors_@re_uns4f5&#125;</span><br></pre></td></tr></table></figure></p><h2 id="e的学问"><a href="#e的学问" class="headerlink" title="e的学问"></a>e的学问</h2><p>题目:<br><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line">from Crypto.Util.number import *</span><br><span class="line">m=bytes_to_long(b&#x27;xxxxxx&#x27;)</span><br><span class="line">p=getPrime(256)</span><br><span class="line">q=getPrime(256)</span><br><span class="line">e=74</span><br><span class="line">n=p*q</span><br><span class="line">c=pow(m,e,n)</span><br><span class="line">print(&quot;p=&quot;,p)</span><br><span class="line">print(&quot;q=&quot;,q)</span><br><span class="line">print(&quot;c=&quot;,c)</span><br><span class="line">#p= 86053582917386343422567174764040471033234388106968488834872953625339458483149</span><br><span class="line">#q= 72031998384560188060716696553519973198388628004850270102102972862328770104493</span><br><span class="line">#c= 3939634105073614197573473825268995321781553470182462454724181094897309933627076266632153551522332244941496491385911139566998817961371516587764621395810123</span><br></pre></td></tr></table></figure></p><p>直接解RSA会发现( d )不存在，因为这里( e )和( \phi )并不互素，此时：</p><p>计算( t = \gcd(e, \phi) )，则有：</p><script type="math/tex; mode=display">c \equiv (m^t)^{\frac{e}{t}} \pmod{n}</script><p>把( m^t )当作整体，找到( d’ )得到( m^t )，再开( t )次幂就能得到( m )。</p><p>exp:<br><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line">p= 86053582917386343422567174764040471033234388106968488834872953625339458483149</span><br><span class="line">q= 72031998384560188060716696553519973198388628004850270102102972862328770104493</span><br><span class="line">c= 3939634105073614197573473825268995321781553470182462454724181094897309933627076266632153551522332244941496491385911139566998817961371516587764621395810123</span><br><span class="line">e = 74</span><br><span class="line">n = p*q</span><br><span class="line">phi = (p-1)*(q-1)</span><br><span class="line">t = gcd(e, phi)</span><br><span class="line">d = inverse(e // t, phi)</span><br><span class="line">print(long_to_bytes(iroot(powmod(c, d, n), t)[0]))</span><br><span class="line">#LitCTF&#123;e_1s_n0t_@_Prime&#125;</span><br></pre></td></tr></table></figure></p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;偶然看到nss上的新生赛，正好也快有新生入学了，写一下wp吧&lt;br&gt;ps：这里面好多litctf的题，23年还是新手的时候打过写过wp，没想到现在又会写一遍，怪感慨的&lt;/p&gt;
&lt;h2 id=&quot;happy&quot;&gt;&lt;a href=&quot;#happy&quot; class=&quot;headerlink&quot; title=&quot;happy&quot;&gt;&lt;/a&gt;happy&lt;/h2&gt;&lt;p&gt;题目：&lt;br&gt;&lt;figure class=&quot;highlight plaintext&quot;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&quot;gutter&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;3&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;4&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;(&amp;#x27;c=&amp;#x27;, &amp;#x27;0x7a7e031f14f6b6c3292d11a41161d2491ce8bcdc67ef1baa</summary>
      
    
    
    
    <category term="crypto - write_up" scheme="http://www.yizhixiaojiuli.cn/categories/crypto-write-up/"/>
    
    
  </entry>
  
  <entry>
    <title>2025-2th-parloo-crypto-wp</title>
    <link href="http://www.yizhixiaojiuli.cn/2025/05/23/2025-%E7%AC%AC%E4%BA%8C%E5%B1%8AParlooCTF%E5%BA%94%E6%80%A5%E5%93%8D%E5%BA%94%E6%8C%91%E6%88%98%E8%B5%9B-crypto-wp/"/>
    <id>http://www.yizhixiaojiuli.cn/2025/05/23/2025-%E7%AC%AC%E4%BA%8C%E5%B1%8AParlooCTF%E5%BA%94%E6%80%A5%E5%93%8D%E5%BA%94%E6%8C%91%E6%88%98%E8%B5%9B-crypto-wp/</id>
    <published>2025-05-23T06:45:00.000Z</published>
    <updated>2025-05-23T06:45:00.000Z</updated>
    
    <content type="html"><![CDATA[<h2 id="RSA-Quartic-Quandary"><a href="#RSA-Quartic-Quandary" class="headerlink" title="RSA_Quartic_Quandary"></a>RSA_Quartic_Quandary</h2><script type="math/tex; mode=display">\begin{align}s &= p^4 + q^4 \\\\p + q &= \sqrt{\sqrt{(p^2 + q^2)^2} + 2 \cdot p \cdot q} \\&= \sqrt{\sqrt{p^4 + q^4 + 2 \cdot p^2 \cdot q^2} + 2 \cdot p \cdot q} \\&= \sqrt{\sqrt{s + 2 \cdot n^2} + 2 \cdot n} \\\\\phi &= n - (p + q) + 1\end{align}</script><p>exp:</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line">#python</span><br><span class="line">from Crypto.Util.number import *</span><br><span class="line">from gmpy2 import *</span><br><span class="line"></span><br><span class="line">n = 125997816345753096048865891139073286898143461169514858050232837657906289840897974068391106608902082960171083817785532702158298589600947834699494234633846206712414663927142998976208173208829799860130354978308649020815886262453865196867390105038666506017720712272359417586671917060323891124382072599746305448903</span><br><span class="line">e = 65537</span><br><span class="line">c = 16076213508704830809521504161524867240789661063230251272973700316524961511842110066547743812160813341691286895800830395413052502516451815705610447484880112548934311914559776633140762863945819054432492392315491109745915225117227073045171062365772401296382778452901831550773993089344837645958797206220200272941</span><br><span class="line">s = 35935569267272146368441512592153486419244649035623643902985220815940198358146024590300394059909370115858091217597774010493938674472746828352595432824315405933241792789402041405932624651226442192749572918686958461029988244396875361295785103356745756304497466567342796329331150560777052588294638069488836419744297241409127729615544668547101580333420563318486256358906310909703237944327684178950282413703357020770127158209107658407007489563388980582632159120621869165333921661377997970334407786581024278698231418756106787058054355713472306409772260619117725561889350862414726861327985706773512963177174611689685575805282</span><br><span class="line"></span><br><span class="line">p_q = iroot(iroot((s + 2 * n ** 2), 2)[0] + 2 * n, 2)[0]</span><br><span class="line">phi = n - p_q + 1</span><br><span class="line">d = inverse(e, phi)</span><br><span class="line">print(long_to_bytes(powmod(c, d, n)))</span><br></pre></td></tr></table></figure><h2 id="欧几里得"><a href="#欧几里得" class="headerlink" title="欧几里得"></a>欧几里得</h2><p>Paillier加密的加法同态性：</p><script type="math/tex; mode=display">\begin{align}\text{Decrypt}(\text{Encrypt}(m_1) \cdot \text{Encrypt}(m_2)) &= m_1 + m_2 \mod n \\m_1 &= \text{Decrypt}(c_1 \cdot c_2) - m_2 \mod n\end{align}</script><p>攻击条件：</p><ul><li>$m_2 = \text{bytes_to_long}(\text{os.urandom}(2) \times 35)$</li><li>$\text{os.urandom}(2) \in [0, 65535]$，可爆破获取$m_2$</li></ul><p>模数处理：</p><ul><li>因$m_1$和$m_2$较小不溢出,所以有没有$n$的差别只在负数上，处理一下负数情况不报错就行</li></ul><p>exp:<br><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line">#python</span><br><span class="line">from Crypto.Util.number import *</span><br><span class="line">from tqdm import *</span><br><span class="line"></span><br><span class="line">c = 1426774899479339414711783875769670405758108494041927642533743607154735397076811133205075799614352194241060726689487117802867974494099614371033282640015883625484033889861</span><br><span class="line"></span><br><span class="line">for i in trange(65536):</span><br><span class="line">    byte_pair = i.to_bytes(2, &#x27;big&#x27;)</span><br><span class="line">    repeated_bytes = byte_pair * 35</span><br><span class="line">    m2 = bytes_to_long(repeated_bytes)</span><br><span class="line">    m = abs(c - m2)</span><br><span class="line">    if b&#x27;palu&#x27; in long_to_bytes(m):</span><br><span class="line">        print(long_to_bytes(m))</span><br><span class="line"></span><br></pre></td></tr></table></figure></p><h2 id="易如反掌"><a href="#易如反掌" class="headerlink" title="易如反掌"></a>易如反掌</h2><p>给定4组RSA参数 $(N_i, E_i)$，其中：</p><ul><li>$N_i = p_i \times q_i$（$p_i, q_i$ 为1024位素数）</li><li>$\Phi_i = (p_i^2 - 1)(q_i^2 - 1)$</li><li>$E_i \equiv d^{-1} \mod \Phi_i$（$d$ 为固定的800位素数）</li></ul><p>由于$\Phi_i \approx N_i^2$，可构建方程：</p><script type="math/tex; mode=display">d \cdot E_i - k_i \cdot N_i^2 = 1</script><p>选择放大系数 $M = 2^{1000}$，构造：</p><script type="math/tex; mode=display">L = \begin{bmatrix}M & E_0 & E_1 & E_2 & E_3 \\0 & -N_0^2 & 0 & 0 & 0 \\0 & 0 & -N_1^2 & 0 & 0 \\0 & 0 & 0 & -N_2^2 & 0 \\0 & 0 & 0 & 0 & -N_3^2 \\\end{bmatrix}</script><p>exp:</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br></pre></td><td class="code"><pre><span class="line"># sage</span><br><span class="line"></span><br><span class="line">from gmpy2 import *</span><br><span class="line">from Crypto.Util.number import *</span><br><span class="line">import hashlib</span><br><span class="line"></span><br><span class="line">N = [23796646026878116589547283793150995927866567938335548416869023482791889761195291718895745055959853934513618760888513821480917766191633897946306199721200583177442944168533218236080466338723721813833112934172813408785753690869328477108925253250272864647989241887047368829689684698870160049332949549671046125158024445929082758264311584669347802324514633164611600348485747482925940752960745308927584754759033237553398957651216385369140164712159020014009858771182426893515016507774993840721603911101735647966838456333878426803669855790758035721418868768618171692143354466457771363078719423863861881209003100274869680348729, 19552522218179875003847447592795537408210008360038264050591506858077823059915495579150792312404199675077331435544143983146080988327453540449160493126531689234464110427289951139790715136775261122038034076109559997394039408007831367922647325571759843192843854522333120187643778356206039403073606561618190519937691323868253954852564110558105862497499849080112804340364976236598384571278659796189204447521325485338769935361453819608921520780103184296098278610439625935404967972315908808657494638735904210709873823527111315139018387713381604550946445856087746716671838144925662314348628830687634437271225081272705532826343, 20588310030910623387356293638800302031856407530120841616298227518984893505166480372963166394317326422544430837759332223527939420321960057410073228508230111170414845403161052128790464277007579491219950440477721075788978767309211469555824310913593208232853272958011299985202799390532181335087622499894389777412111445377637396650710486263652440053717323053536700098339137819966260269752816515681602936416736576044630343136577023173210517247609888936337876211461528203642347119434700140264859102502126842250671976238033270367185358966766106988830596616311824691409766437473419074865115209866730272194297815209976737570183, 18468380817178794606027384089796802449939260582378979728469492439450780893746976934315768186829245395964644992296264093276556001477514083927556578752836255491334765496791841945178275793885002188397918857222419803612711637177559554489679414049308077300718317502586411333302434329130562745942681716547306138457088216901181646333860559988117376012816579422902808478175975263110581667936249474308868051767856694498210084853797453949193117835061402537058150493808371384063278793041752943930928932275052745657700368980150842377283198946138726219378646040515809994704174471793592322237777371900834531014326150160506449286179]</span><br><span class="line">E = [229904181453273080302209653709086531153804577507365859149808244958841045687064628362978517491609413507875726243121473678430010600891588643092042173698830147997497783886459583186019270582236955524620567373560535686287255124958954671737097645556109314142383275516997850786599322033792080045303427363366927030304214333894247469120513426641296678531965795930756543043851154646310114366477311633838078242963665452936523438928643273392454483600446242320078010627755587492056369779661382734170244060951095344418599686788550312205964136120979823565225768814898285224838691541122088693411388097496320157113230752327025862802020421665288007529320920942060329299409362236414929126050037144149017275031336018100081931062647888329912802477032857776085190828105602067426203163344931483638271679183910241511044338001446584634203146294743522375846913845041274967653508735863706778364499099286484552570083394223973734909997825522191349543295855925973354640349809770822075226834555111927586299176453943116511915434890643239957459427390624136283086434711471863737451011157026905191204496081860277138227247744470804087252965368757930797560277881668806206419629425126031049566579233056222579590529869798537893505779097868221221068867624660759084762471141, 374749619911728044650812367560174497001343067563440477135516664935394734686391543012901514676044211541958613458868769659861216149364768233000844624035620893309356372294598009760824255187442531508754966566917198975934706398309982525100772311586501118200858124845012643495006029930202324305874402291277845166060497038915773767003006049720519011634861166208163030159519901867416488082395270295488885724507937683469910251316231210838654273986152493722244271430422693265608430755620420680629979226285393465423870727975987787149515374769359243334743541460110042872587610309611770320600248289328406805995688596910226273861759369388105641549933915686192055533242723330981192183310876306968103333706140401422550917946410378174896274789619184565321544130428008804628699594759946577979319393247067750024729672029363433673084437510430506410293512293930056667971242862448029841846596288648691077795207341975907335202945548990662460491169957175452745622341245617265849042542964819126377775749222973138584978725470886059043251544634105653274564085280013340679259157119014619894553239015777411757887293044706448625760604242512494466386343040583010961386979963779928616733980046763291988848903515836247301007113187121999960487508948748354549628160741, 111738429639840672983162926852338651562094139707285850255632987705635459657893186493838711733560515475806567653354737245246745810892238414756414117557971683747269900627524702653772058841085258035513296218047505149691384287812041721130367506731427022265277885965948486359682023555050085264531256406043361391744086539522028829421284667293339869140564699750714145488199268791908205712660933607330454849730499840287271163350865799682565216636393526339218836244889719975150503253630419647851422620890082315396457329065508602521784001607236788620811397449483104884860551374031790663030220424841642241965983726516537123807061999084476076850833658360594525986997125319941689903869138176347916707622148840226672408554102717625456819726220575710494929111642866840516339713870850732638906870325693572445316904688582043485093120585767903009745325497085286577015692005747499504730575062998090846463157669448943725039951120963375521054164657547731579771203443617489609201617736584055562887243883898406182052632245189418568410854530995044542628531851356363297989653392057214167031332353949367816700838296651167799441279086074308299608106786918676697564002641234952760724731325383088682051108589283162705846714876543662335188222683115878319143239781, 185935167438248768027713217055147583431480103445262049361952417166499278728434926508937684304985810617277398880507451351333771783039360671467147075085417403764439214700549777320094501151755362122677245586884124615115132430034242191429064710012407308619977881929109092467325180864745257810774684549914888829203014922855369708286801194645263982661023515570231007900615244109762444081806466412714045462184361892356485713147687194230341085490571821445962465385514845915484336766973332384198790601633964078447446832581798146300515184339036127604597014458389481920870330726947546808739829589808006774479656385317205167932706748974482578749055876192429032258189528408353619365693624106394913101463023497175917598944803733849984703912670992613579847331081015979121834040110652608301633876167262248103403520536210279949844194696898862249482809107840303473964914083996538912970715834110371196970613332286296427286356036576876121010776933023901744994067564045429384172315640135483480089769992730928266885675143187679290648773060781987273082229827156531141515679114580622348238382074084270808291251400949744720804368426414308355267344210055608246286737478682527960260877955900464059404976906697164610891962198768354924180929300959036213841843941]</span><br><span class="line"></span><br><span class="line">M = 2^1000  </span><br><span class="line">L = Matrix(ZZ, [</span><br><span class="line">    [M, E[0], E[1], E[2], E[3]],</span><br><span class="line">    [0, -N[0]^2, 0, 0, 0],</span><br><span class="line">    [0, 0, -N[1]^2, 0, 0],</span><br><span class="line">    [0, 0, 0, -N[2]^2, 0],</span><br><span class="line">    [0, 0, 0, 0, -N[3]^2],</span><br><span class="line">])</span><br><span class="line"></span><br><span class="line">L = L.LLL()</span><br><span class="line">for row in L:</span><br><span class="line">    if row[0] % M == 0:</span><br><span class="line">        d = abs(row[0] // M)</span><br><span class="line">        if 1 &lt; d &lt; 2^800: </span><br><span class="line">            print(&quot;Found d:&quot;, d)</span><br><span class="line">            flag = &quot;palu&#123;&quot; + hashlib.md5(str(d).encode()).hexdigest() + &quot;&#125;&quot;</span><br><span class="line">            print(flag)</span><br><span class="line">            break</span><br></pre></td></tr></table></figure><h2 id="循环锁链"><a href="#循环锁链" class="headerlink" title="循环锁链"></a>循环锁链</h2><p>这纯脑洞题，一开始傻了忘了flag头是palu，想到是循环异或了用flag试了一辈子也没试出来，加密逻辑很简单，就是第一位明文和第二位明文异或当作第一位密文，然后依次重复这个过程，最后一位明文和第一位明文异或是最后一位密文，根据已知的明文palu推回去即可：</p><p>exp:</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br></pre></td><td class="code"><pre><span class="line">#python</span><br><span class="line"></span><br><span class="line">import sys</span><br><span class="line"></span><br><span class="line">def decrypt(c: bytes, prefix: bytes) -&gt; bytes:</span><br><span class="line">    N = len(c)</span><br><span class="line">    p = bytearray(N)</span><br><span class="line">    L = len(prefix)</span><br><span class="line">    p[:L] = prefix</span><br><span class="line">    for i in range(N - 1):</span><br><span class="line">        if i + 1 &gt;= L:</span><br><span class="line">            p[i + 1] = c[i] ^ p[i]</span><br><span class="line">    return bytes(p)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">with open(&#x27;flag.enc&#x27;, &#x27;rb&#x27;) as f:</span><br><span class="line">    ciphertext = f.read()</span><br><span class="line">    known_prefix = b&quot;palu&#123;&quot;</span><br><span class="line">    plaintext = decrypt(ciphertext, known_prefix)</span><br><span class="line">    flag = plaintext.decode(&#x27;utf-8&#x27;)</span><br><span class="line"></span><br><span class="line">print(flag)</span><br></pre></td></tr></table></figure><h2 id="星际广播站"><a href="#星际广播站" class="headerlink" title="星际广播站"></a>星际广播站</h2><p>题目描述：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">这是使用flask框架编写的RSA广播的空间站系统，你有办法登录并解密密文吗</span><br></pre></td></tr></table></figure><p>说实话一打开是一个web界面看傻了，查看源码发现：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line">function downloadAppFile(filename) &#123;</span><br><span class="line">          const iframe = document.createElement(&#x27;iframe&#x27;);</span><br><span class="line">          iframe.style.display = &#x27;none&#x27;;</span><br><span class="line">          document.body.appendChild(iframe);</span><br><span class="line">          const downloadUrl = `/file/download?path=$&#123;encodeURIComponent(filename)&#125;`;</span><br><span class="line">          iframe.src = downloadUrl;</span><br><span class="line">          </span><br><span class="line">          setTimeout(() =&gt; &#123;</span><br><span class="line">          document.body.removeChild(iframe);</span><br><span class="line">          &#125;, 2000);</span><br><span class="line">          &#125;</span><br></pre></td></tr></table></figure><p>很明显的任意文件下载漏洞，由于这是使用flask框架编写的，所以下载一下app.py文件看看:</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">downloadAppFile(&quot;app.py&quot;);</span><br></pre></td></tr></table></figure><p>app.py:</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br><span class="line">145</span><br><span class="line">146</span><br><span class="line">147</span><br><span class="line">148</span><br><span class="line">149</span><br><span class="line">150</span><br><span class="line">151</span><br><span class="line">152</span><br><span class="line">153</span><br><span class="line">154</span><br><span class="line">155</span><br><span class="line">156</span><br><span class="line">157</span><br><span class="line">158</span><br><span class="line">159</span><br><span class="line">160</span><br><span class="line">161</span><br><span class="line">162</span><br><span class="line">163</span><br><span class="line">164</span><br><span class="line">165</span><br><span class="line">166</span><br><span class="line">167</span><br><span class="line">168</span><br><span class="line">169</span><br><span class="line">170</span><br><span class="line">171</span><br><span class="line">172</span><br><span class="line">173</span><br><span class="line">174</span><br><span class="line">175</span><br><span class="line">176</span><br><span class="line">177</span><br><span class="line">178</span><br><span class="line">179</span><br><span class="line">180</span><br><span class="line">181</span><br><span class="line">182</span><br><span class="line">183</span><br><span class="line">184</span><br><span class="line">185</span><br><span class="line">186</span><br><span class="line">187</span><br><span class="line">188</span><br><span class="line">189</span><br><span class="line">190</span><br><span class="line">191</span><br><span class="line">192</span><br><span class="line">193</span><br><span class="line">194</span><br><span class="line">195</span><br><span class="line">196</span><br><span class="line">197</span><br><span class="line">198</span><br><span class="line">199</span><br><span class="line">200</span><br><span class="line">201</span><br><span class="line">202</span><br><span class="line">203</span><br><span class="line">204</span><br><span class="line">205</span><br><span class="line">206</span><br><span class="line">207</span><br><span class="line">208</span><br><span class="line">209</span><br><span class="line">210</span><br><span class="line">211</span><br><span class="line">212</span><br><span class="line">213</span><br><span class="line">214</span><br><span class="line">215</span><br><span class="line">216</span><br><span class="line">217</span><br><span class="line">218</span><br><span class="line">219</span><br><span class="line">220</span><br><span class="line">221</span><br><span class="line">222</span><br><span class="line">223</span><br><span class="line">224</span><br><span class="line">225</span><br><span class="line">226</span><br><span class="line">227</span><br><span class="line">228</span><br><span class="line">229</span><br><span class="line">230</span><br><span class="line">231</span><br><span class="line">232</span><br><span class="line">233</span><br><span class="line">234</span><br><span class="line">235</span><br><span class="line">236</span><br><span class="line">237</span><br><span class="line">238</span><br><span class="line">239</span><br><span class="line">240</span><br></pre></td><td class="code"><pre><span class="line">import sqlite3</span><br><span class="line">import os</span><br><span class="line">import hashlib</span><br><span class="line">from flask import Flask, render_template, request, redirect, url_for, session, flash, g,send_file, abort</span><br><span class="line">from Crypto.PublicKey import RSA</span><br><span class="line">from Crypto.Util.number import bytes_to_long, getPrime</span><br><span class="line">import string</span><br><span class="line">from secret import flag    </span><br><span class="line"></span><br><span class="line">app = Flask(__name__)</span><br><span class="line">app.secret_key = os.urandom(24) # 用于 session 管理</span><br><span class="line"></span><br><span class="line"># 修改数据库路径</span><br><span class="line"># Ensure this line points to the data directory</span><br><span class="line">DATABASE = &#x27;data/users.db&#x27;</span><br><span class="line">E = getPrime(7)</span><br><span class="line">NUM_USERS = 128</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"># assert NUM_USERS &gt;= E </span><br><span class="line">print(f&quot;E: &#123;E&#125;&quot;)</span><br><span class="line">FLAG = flag.encode(&#x27;utf-8&#x27;)</span><br><span class="line"></span><br><span class="line">def get_db():</span><br><span class="line">    db = getattr(g, &#x27;_database&#x27;, None)</span><br><span class="line">    if db is None:</span><br><span class="line">        # Ensure the directory exists when connecting</span><br><span class="line">        db_dir = os.path.dirname(DATABASE)</span><br><span class="line">        if not os.path.exists(db_dir):</span><br><span class="line">             os.makedirs(db_dir, exist_ok=True)</span><br><span class="line">        db = g._database = sqlite3.connect(DATABASE)</span><br><span class="line">        db.row_factory = sqlite3.Row # 让查询结果可以通过列名访问</span><br><span class="line">    return db</span><br><span class="line"></span><br><span class="line">@app.teardown_appcontext</span><br><span class="line">def close_connection(exception):</span><br><span class="line">    db = getattr(g, &#x27;_database&#x27;, None)</span><br><span class="line">    if db is not None:</span><br><span class="line">        db.close()</span><br><span class="line"></span><br><span class="line">import random</span><br><span class="line">from gmssl import sm3, func </span><br><span class="line"></span><br><span class="line">def sm3_hash(data):</span><br><span class="line">    &quot;&quot;&quot;计算数据的 SM3 哈希值&quot;&quot;&quot;</span><br><span class="line">    if isinstance(data, str):</span><br><span class="line">        data = data.encode(&#x27;utf-8&#x27;)</span><br><span class="line">    hash_bytes = sm3.sm3_hash(func.bytes_to_list(data))</span><br><span class="line">    print(f&quot;计算 &#123;data&#125; 的 SM3 哈希值为: &#123;hash_bytes&#125;&quot;)</span><br><span class="line">    return hash_bytes</span><br><span class="line"></span><br><span class="line">def generate_rsa_pair(message, e):</span><br><span class="line">    &quot;&quot;&quot;生成 RSA 公钥 N 和对应的密文 C&quot;&quot;&quot;</span><br><span class="line">    key = RSA.generate(1024)</span><br><span class="line">    n = key.n</span><br><span class="line">    m_long = bytes_to_long(message)</span><br><span class="line">    c = pow(m_long, e, n)</span><br><span class="line">    return n, c</span><br><span class="line"></span><br><span class="line">def init_db():</span><br><span class="line">    &quot;&quot;&quot;初始化数据库，创建表并填充用户数据&quot;&quot;&quot;</span><br><span class="line">    db_path = os.path.join(&#x27;/app&#x27;, DATABASE) # 在容器内的绝对路径</span><br><span class="line">    db_dir = os.path.dirname(db_path)</span><br><span class="line">    os.makedirs(db_dir, exist_ok=True) # 确保容器内的目录存在</span><br><span class="line"></span><br><span class="line">    # 检查数据库文件是否存在于容器内的预期路径</span><br><span class="line">    if os.path.exists(db_path):</span><br><span class="line">         print(f&quot;数据库文件 &#123;db_path&#125; 已存在，跳过初始化。&quot;)</span><br><span class="line">         # 即使文件存在，也要确保表结构是最新的</span><br><span class="line">         # 可以考虑在这里添加检查表是否存在的逻辑，如果不存在则创建</span><br><span class="line">         # return # 如果确定存在就跳过，否则继续执行建表逻辑</span><br><span class="line"></span><br><span class="line">    print(f&quot;初始化数据库 &#123;db_path&#125;...&quot;)</span><br><span class="line">    with app.app_context():</span><br><span class="line">        db = get_db()</span><br><span class="line">        cursor = db.cursor()</span><br><span class="line">        # 检查 users 表是否存在</span><br><span class="line">        cursor.execute(&quot;SELECT name FROM sqlite_master WHERE type=&#x27;table&#x27; AND name=&#x27;users&#x27;;&quot;)</span><br><span class="line">        table_exists = cursor.fetchone()</span><br><span class="line"></span><br><span class="line">        if not table_exists:</span><br><span class="line">            print(&quot;创建 users 表...&quot;)</span><br><span class="line">            cursor.execute(&#x27;&#x27;&#x27;</span><br><span class="line">                CREATE TABLE users (</span><br><span class="line">                    id INTEGER PRIMARY KEY AUTOINCREMENT,</span><br><span class="line">                    username TEXT UNIQUE NOT NULL,</span><br><span class="line">                    password_hash TEXT NOT NULL,</span><br><span class="line">                    n TEXT NOT NULL -- 存储大整数 N</span><br><span class="line">                )</span><br><span class="line">            &#x27;&#x27;&#x27;)</span><br><span class="line">            db.commit() # 提交建表操作</span><br><span class="line">        else:</span><br><span class="line">            print(&quot;users 表已存在。&quot;)</span><br><span class="line">            # 检查是否需要填充数据</span><br><span class="line">            cursor.execute(&quot;SELECT COUNT(*) FROM users&quot;)</span><br><span class="line">            user_count = cursor.fetchone()[0]</span><br><span class="line">            if user_count &gt;= NUM_USERS:</span><br><span class="line">                print(f&quot;数据库中已有 &#123;user_count&#125; 个用户，跳过填充。&quot;)</span><br><span class="line">                return # 如果用户数量足够，则跳过填充</span><br><span class="line"></span><br><span class="line">        # --- 填充用户数据的逻辑 ---</span><br><span class="line">        print(&quot;开始填充用户数据...&quot;)</span><br><span class="line">        generated_n_set = set()</span><br><span class="line">        # 获取当前数据库中的用户数量</span><br><span class="line">        cursor.execute(&quot;SELECT COUNT(*) FROM users&quot;)</span><br><span class="line">        current_user_count = cursor.fetchone()[0]</span><br><span class="line">        users_added_this_run = 0</span><br><span class="line"></span><br><span class="line">        # 从 current_user_count + 1 开始生成用户，直到达到 NUM_USERS</span><br><span class="line">        for i in range(current_user_count, NUM_USERS):</span><br><span class="line">            username = str(i + 1)</span><br><span class="line">            random.seed(username)</span><br><span class="line"></span><br><span class="line">            characters = string.ascii_letters + string.digits</span><br><span class="line">            password = &quot;&quot;.join(random.choices(characters, k=6))</span><br><span class="line">            password_hash = sm3_hash(password)</span><br><span class="line"></span><br><span class="line">            n, c = None, None</span><br><span class="line">            attempts = 0</span><br><span class="line">            max_attempts = NUM_USERS * 5</span><br><span class="line">            while attempts &lt; max_attempts:</span><br><span class="line">                n_candidate, c_candidate = generate_rsa_pair(FLAG, E)</span><br><span class="line">                if n_candidate not in generated_n_set:</span><br><span class="line">                    # 还需要检查数据库中是否已存在此 N</span><br><span class="line">                    cursor.execute(&quot;SELECT 1 FROM users WHERE n = ?&quot;, (str(n_candidate),))</span><br><span class="line">                    n_exists_in_db = cursor.fetchone()</span><br><span class="line">                    if not n_exists_in_db:</span><br><span class="line">                        n = n_candidate</span><br><span class="line">                        c = c_candidate</span><br><span class="line">                        generated_n_set.add(n)</span><br><span class="line">                        break</span><br><span class="line">                attempts += 1</span><br><span class="line"></span><br><span class="line">            if n is None:</span><br><span class="line">                print(f&quot;警告：无法为用户 &#123;username&#125; 生成唯一的 N，已尝试 &#123;max_attempts&#125; 次。&quot;)</span><br><span class="line">                continue</span><br><span class="line"></span><br><span class="line">            try:</span><br><span class="line">                cursor.execute(&quot;INSERT INTO users (username, password_hash, n) VALUES (?, ?, ?)&quot;,</span><br><span class="line">                               (username, password_hash, str(n)))</span><br><span class="line">                users_added_this_run += 1</span><br><span class="line">                print(f&quot;添加用户 &#123;username&#125; 到数据库。&quot;)</span><br><span class="line">            except sqlite3.IntegrityError:</span><br><span class="line">                print(f&quot;用户名 &#123;username&#125; 已存在或 N 值冲突，跳过。&quot;)</span><br><span class="line">            except Exception as e:</span><br><span class="line">                print(f&quot;添加用户 &#123;username&#125; 时出错: &#123;e&#125;&quot;)</span><br><span class="line"></span><br><span class="line">        db.commit()</span><br><span class="line">        print(f&quot;数据库初始化/填充完成，本次运行添加了 &#123;users_added_this_run&#125; 个用户。&quot;)</span><br><span class="line"></span><br><span class="line">@app.route(&#x27;/&#x27;)</span><br><span class="line">def index():</span><br><span class="line">    if &#x27;username&#x27; in session:</span><br><span class="line">        return redirect(url_for(&#x27;dashboard&#x27;))</span><br><span class="line">    return render_template(&#x27;index.html&#x27;) </span><br><span class="line"></span><br><span class="line">@app.route(&#x27;/login&#x27;, methods=[&#x27;GET&#x27;, &#x27;POST&#x27;])</span><br><span class="line">def login():</span><br><span class="line">    if request.method == &#x27;POST&#x27;:</span><br><span class="line">        username = request.form[&#x27;username&#x27;]</span><br><span class="line">        password_hash_attempt = sm3_hash(request.form[&#x27;password_hash&#x27;])</span><br><span class="line">        db = get_db()</span><br><span class="line">        cursor = db.cursor()</span><br><span class="line">        cursor.execute(&quot;SELECT password_hash FROM users WHERE username = ?&quot;, (username,))</span><br><span class="line">        user = cursor.fetchone()</span><br><span class="line"></span><br><span class="line">        if  user and user[&#x27;password_hash&#x27;] == password_hash_attempt:</span><br><span class="line">            session[&#x27;username&#x27;] = username</span><br><span class="line">            flash(&#x27;登录成功！&#x27;, &#x27;success&#x27;)</span><br><span class="line">            return redirect(url_for(&#x27;dashboard&#x27;))</span><br><span class="line">        else:</span><br><span class="line">            flash(&#x27;无效的用户名或密码。&#x27;, &#x27;error&#x27;)</span><br><span class="line">            return redirect(url_for(&#x27;login&#x27;)) </span><br><span class="line">    </span><br><span class="line"></span><br><span class="line">    if &#x27;username&#x27; in session:</span><br><span class="line">        return redirect(url_for(&#x27;dashboard&#x27;)) </span><br><span class="line">    return render_template(&#x27;index.html&#x27;)</span><br><span class="line"></span><br><span class="line">@app.route(&#x27;/dashboard&#x27;)</span><br><span class="line">def dashboard():</span><br><span class="line">    if &#x27;username&#x27; not in session:</span><br><span class="line">        flash(&#x27;请先登录。&#x27;, &#x27;error&#x27;)</span><br><span class="line">        return redirect(url_for(&#x27;login&#x27;))</span><br><span class="line"></span><br><span class="line">    username = session[&#x27;username&#x27;]</span><br><span class="line">    db = get_db()</span><br><span class="line">    cursor = db.cursor()</span><br><span class="line">    cursor.execute(&quot;SELECT n  FROM users WHERE username = ?&quot;, (username,))</span><br><span class="line">    user_data = cursor.fetchone()</span><br><span class="line"></span><br><span class="line">    if not user_data:</span><br><span class="line">        # 用户在 session 中但数据库中找不到？异常情况</span><br><span class="line">        session.pop(&#x27;username&#x27;, None)</span><br><span class="line">        flash(&#x27;发生错误，请重新登录。&#x27;, &#x27;error&#x27;)</span><br><span class="line">        return redirect(url_for(&#x27;login&#x27;))</span><br><span class="line"></span><br><span class="line">    n = user_data[&#x27;n&#x27;]</span><br><span class="line">#     c = user_data[&#x27;c&#x27;]</span><br><span class="line">    m = bytes_to_long(FLAG)</span><br><span class="line">    c = str(pow(m, E, int(n)))</span><br><span class="line">    return render_template(&#x27;dashboard.html&#x27;, username=username, n=n, c=c, e=E)</span><br><span class="line"></span><br><span class="line">@app.route(&#x27;/logout&#x27;)</span><br><span class="line">def logout():</span><br><span class="line">    session.pop(&#x27;username&#x27;, None)</span><br><span class="line">    flash(&#x27;您已成功登出。&#x27;, &#x27;success&#x27;)</span><br><span class="line">    return redirect(url_for(&#x27;login&#x27;))</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line">@app.route(&#x27;/file/download&#x27;, methods=[&#x27;GET&#x27;])</span><br><span class="line">def download_file():</span><br><span class="line">    path = request.args.get(&#x27;path&#x27;, &#x27;&#x27;)</span><br><span class="line">    </span><br><span class="line">    if not path:</span><br><span class="line">        return &quot;Error: No path parameter provided&quot;, 400</span><br><span class="line">    </span><br><span class="line">    try:</span><br><span class="line"></span><br><span class="line">        if not os.path.isabs(path):</span><br><span class="line">            path = os.path.join(os.path.dirname(__file__), path)</span><br><span class="line">        </span><br><span class="line">        if not os.path.exists(path) or not os.path.isfile(path):</span><br><span class="line">            return f&quot;Error: File not found: &#123;path&#125;&quot;, 404</span><br><span class="line"></span><br><span class="line">        return send_file(</span><br><span class="line">            path,</span><br><span class="line">            as_attachment=True,</span><br><span class="line">            download_name=os.path.basename(path),</span><br><span class="line">            mimetype=&#x27;application/octet-stream&#x27;</span><br><span class="line">        )</span><br><span class="line">    </span><br><span class="line">    except Exception as e:</span><br><span class="line">        return f&quot;Error: &#123;str(e)&#125;&quot;, 500</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">if __name__ == &#x27;__main__&#x27;:</span><br><span class="line">    init_db() # 启动时检查并初始化数据库</span><br><span class="line">    app.run(host=&#x27;0.0.0.0&#x27;, port=8000, debug=True)</span><br></pre></td></tr></table></figure><p>我们观察到有：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">DATABASE = &#x27;data/users.db&#x27;</span><br></pre></td></tr></table></figure><p>和<br><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">username = str(i + 1)</span><br><span class="line">            random.seed(username)</span><br><span class="line"></span><br><span class="line">            characters = string.ascii_letters + string.digits</span><br><span class="line">            password = &quot;&quot;.join(random.choices(characters, k=6))</span><br></pre></td></tr></table></figure><br>这里我们知道了数据库文件的位置可以获取到数据库文件，并且发现密码是由用户名作为种子使用random函数得来的，那么用户名固定密码就固定，这里我们就已知了密码。<br>下一下数据库文件：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">downloadAppFile(&quot;data/users.db&quot;); </span><br></pre></td></tr></table></figure><p>登录一下获取到了e为71，现在要做的就是读取数据库获取所有的n，登录e个用户获取到e个c进行低加密指数广播攻击即可</p><p>exp:</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br></pre></td><td class="code"><pre><span class="line">import random</span><br><span class="line">import string</span><br><span class="line">import requests</span><br><span class="line">import re</span><br><span class="line">import sqlite3</span><br><span class="line">from typing import Dict, List, Tuple</span><br><span class="line">from gmpy2 import iroot, invert</span><br><span class="line">from Crypto.Util.number import long_to_bytes</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">def generate_password(username: str) -&gt; str:</span><br><span class="line">    &quot;&quot;&quot;根据用户名生成密码&quot;&quot;&quot;</span><br><span class="line">    random.seed(username)</span><br><span class="line">    characters = string.ascii_letters + string.digits</span><br><span class="line">    return &#x27;&#x27;.join(random.choices(characters, k=6))</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">def get_all_n_from_db(db_path: str) -&gt; Dict[str, int]:</span><br><span class="line">    &quot;&quot;&quot;从本地数据库获取所有用户的n值&quot;&quot;&quot;</span><br><span class="line">    try:</span><br><span class="line">        with sqlite3.connect(db_path) as conn:</span><br><span class="line">            cursor = conn.cursor()</span><br><span class="line">            cursor.execute(&quot;SELECT username, n FROM users&quot;)</span><br><span class="line">            return &#123;row[0]: int(row[1]) for row in cursor.fetchall()&#125;</span><br><span class="line">    except sqlite3.Error as e:</span><br><span class="line">        print(f&quot;数据库错误: &#123;e&#125;&quot;)</span><br><span class="line">        return &#123;&#125;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">def collect_c_values(users: Dict[str, int], base_url: str) -&gt; Dict[int, int]:</span><br><span class="line">    &quot;&quot;&quot;通过HTTP请求收集c值&quot;&quot;&quot;</span><br><span class="line">    c_data = &#123;&#125;</span><br><span class="line"></span><br><span class="line">    for username, n in users.items():</span><br><span class="line">        password = generate_password(username)</span><br><span class="line">        session = requests.Session()</span><br><span class="line"></span><br><span class="line">        # 登录获取session</span><br><span class="line">        try:</span><br><span class="line">            login_resp = session.post(</span><br><span class="line">                f&quot;&#123;base_url&#125;/login&quot;,</span><br><span class="line">                data=&#123;&quot;username&quot;: username, &quot;password_hash&quot;: password&#125;,</span><br><span class="line">                allow_redirects=False,</span><br><span class="line">                timeout=5</span><br><span class="line">            )</span><br><span class="line"></span><br><span class="line">            if login_resp.status_code != 302 or &#x27;dashboard&#x27; not in login_resp.headers.get(&#x27;Location&#x27;, &#x27;&#x27;):</span><br><span class="line">                print(f&quot;[!] 用户 &#123;username&#125; 登录失败&quot;)</span><br><span class="line">                continue</span><br><span class="line">        except Exception as e:</span><br><span class="line">            print(f&quot;[!] 用户 &#123;username&#125; 登录请求异常: &#123;str(e)&#125;&quot;)</span><br><span class="line">            continue</span><br><span class="line"></span><br><span class="line">        # 获取dashboard页面</span><br><span class="line">        try:</span><br><span class="line">            dashboard_resp = session.get(f&quot;&#123;base_url&#125;/dashboard&quot;, timeout=5)</span><br><span class="line">            if dashboard_resp.status_code != 200:</span><br><span class="line">                print(f&quot;[!] 用户 &#123;username&#125; 访问dashboard失败&quot;)</span><br><span class="line">                continue</span><br><span class="line"></span><br><span class="line">            # 精确匹配c值</span><br><span class="line">            c_match = re.search(r&#x27;&lt;span class=&quot;data-value&quot;&gt;(\d+)&lt;/span&gt;&#x27;, dashboard_resp.text)</span><br><span class="line">            if c_match:</span><br><span class="line">                c_data[n] = int(c_match.group(1))</span><br><span class="line">                print(f&quot;[+] 成功获取用户 &#123;username&#125; 的 c=&#123;c_data[n]&#125;&quot;)</span><br><span class="line">            else:</span><br><span class="line">                print(f&quot;[!] 用户 &#123;username&#125; 的c值解析失败&quot;)</span><br><span class="line">        except Exception as e:</span><br><span class="line">            print(f&quot;[!] 用户 &#123;username&#125; 请求异常: &#123;str(e)&#125;&quot;)</span><br><span class="line"></span><br><span class="line">    return c_data</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">def chinese_remainder_theorem(moduli: List[int], residues: List[int]) -&gt; int:</span><br><span class="line">    &quot;&quot;&quot;实现中国剩余定理&quot;&quot;&quot;</span><br><span class="line">    total = 0</span><br><span class="line">    product = 1</span><br><span class="line"></span><br><span class="line">    for m in moduli:</span><br><span class="line">        product *= m</span><br><span class="line"></span><br><span class="line">    for m, r in zip(moduli, residues):</span><br><span class="line">        p = product // m</span><br><span class="line">        total += r * invert(p, m) * p</span><br><span class="line"></span><br><span class="line">    return total % product</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">if __name__ == &#x27;__main__&#x27;:</span><br><span class="line">    # 从本地数据库获取所有n值</span><br><span class="line">    print(&quot;[+] 正在从本地数据库读取n值...&quot;)</span><br><span class="line">    all_users = get_all_n_from_db(&#x27;users.db&#x27;)</span><br><span class="line">    print(f&quot;[+] 成功读取 &#123;len(all_users)&#125; 个用户的n值&quot;)</span><br><span class="line"></span><br><span class="line">    # 收集c值</span><br><span class="line">    e = 71</span><br><span class="line">    URL = &#x27;http://challenge.qsnctf.com:32237&#x27;  # 修复了URL中的空格</span><br><span class="line">    print(f&quot;[+] 开始收集 &#123;e&#125; 个用户的c值...&quot;)</span><br><span class="line"></span><br><span class="line">    c_data = collect_c_values(all_users, URL)</span><br><span class="line"></span><br><span class="line">    if len(c_data) &lt; e:</span><br><span class="line">        print(f&quot;[!] 警告：只收集到 &#123;len(c_data)&#125; 个c值，需要至少 &#123;e&#125; 个&quot;)</span><br><span class="line"></span><br><span class="line">    n_list = list(c_data.keys())[:e]</span><br><span class="line">    c_list = [c_data[n] for n in n_list]</span><br><span class="line"></span><br><span class="line">    print(&quot;[+] 开始解密流程...&quot;)</span><br><span class="line">    M = chinese_remainder_theorem(n_list, c_list)</span><br><span class="line">    m = iroot(M, e)[0]</span><br><span class="line">    flag = long_to_bytes(m)</span><br><span class="line">    print(flag)</span><br></pre></td></tr></table></figure><h2 id="轮回密码"><a href="#轮回密码" class="headerlink" title="轮回密码"></a>轮回密码</h2><p>题目描述：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">在佛经残卷中发现神秘密文，据传加密者用&quot;六道轮回&quot;之法将真言藏于时空循环中。</span><br></pre></td></tr></table></figure><p>encode.py:</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br></pre></td><td class="code"><pre><span class="line">import base64</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">def samsara_encrypt(text, key_word):</span><br><span class="line">    cycle_step = len(key_word) % 6 + 1</span><br><span class="line"></span><br><span class="line">    phase1 = bytes([(c &gt;&gt; cycle_step) | ((c &lt;&lt; (8 - cycle_step)) &amp; 0xFF) for c in text])</span><br><span class="line"></span><br><span class="line">    phase2 = base64.b85encode(phase1)</span><br><span class="line"></span><br><span class="line">    phase3 = bytes([(c &gt;&gt; cycle_step) | ((c &lt;&lt; (8 - cycle_step)) &amp; 0xFF) for c in phase2])</span><br><span class="line"></span><br><span class="line">    return bytes([phase3[i] ^ key_word[i % len(key_word)] for i in range(len(phase3))])</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">if __name__ == &quot;__main__&quot;:</span><br><span class="line">    flag = b&quot;palu&#123;********&#125;&quot;  # 可替换flag</span><br><span class="line">    key = b&quot;&quot;</span><br><span class="line">    cipher = samsara_encrypt(flag, key)</span><br><span class="line"></span><br><span class="line">    # 修复点：使用latin-1编码处理二进制数据</span><br><span class="line">    print(&quot;轮回密文:&quot;, cipher.decode(&#x27;latin-1&#x27;))  # 输出示例：¨×èÄÅÉØÛÚ</span><br></pre></td></tr></table></figure><p>flag.txt:</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">轮回密文: y¦_6&gt;X¬y!,!n¡mSaÜñüë9¼6</span><br></pre></td></tr></table></figure><p>对着逆向就行了，直接问ai都可以<br>exp:</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br></pre></td><td class="code"><pre><span class="line">import base64</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">def samsara_decrypt(cipher_text, key_word):</span><br><span class="line">    # 步骤1: 与关键词异或</span><br><span class="line">    step1 = bytes([cipher_text[i] ^ key_word[i % len(key_word)] for i in range(len(cipher_text))])</span><br><span class="line"></span><br><span class="line">    # 计算循环位移量</span><br><span class="line">    cycle_step = len(key_word) % 6 + 1</span><br><span class="line"></span><br><span class="line">    # 步骤2: 逆向循环右移（即循环左移cycle_step位）</span><br><span class="line">    step2 = bytes([((c &lt;&lt; cycle_step) | (c &gt;&gt; (8 - cycle_step))) &amp; 0xFF for c in step1])</span><br><span class="line"></span><br><span class="line">    # 步骤3: Base85解码</span><br><span class="line">    step3 = base64.b85decode(step2)</span><br><span class="line"></span><br><span class="line">    # 步骤4: 再次逆向循环右移（即循环左移cycle_step位）</span><br><span class="line">    return bytes([((c &lt;&lt; cycle_step) | (c &gt;&gt; (8 - cycle_step))) &amp; 0xFF for c in step3])</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">if __name__ == &quot;__main__&quot;:</span><br><span class="line">    # 密文和密钥</span><br><span class="line">    cipher_text = &quot;y¦_6&gt;X¬y!,!n¡mSaÜñüë9¼6&quot;.encode(&#x27;latin-1&#x27;)</span><br><span class="line">    key_word = b&quot;Bore&quot;  # 需要填入正确的密钥</span><br><span class="line"></span><br><span class="line">    # 解密</span><br><span class="line">    plain_text = samsara_decrypt(cipher_text, key_word)</span><br><span class="line">    print(&quot;解密结果:&quot;, plain_text.decode(&#x27;utf-8&#x27;, errors=&#x27;replace&#x27;))</span><br><span class="line"></span><br><span class="line"># palu&#123;reincarnation_cipher&#125;</span><br></pre></td></tr></table></figure><h2 id="文件查看器"><a href="#文件查看器" class="headerlink" title="文件查看器*"></a>文件查看器*</h2><p>app.py:</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br><span class="line">145</span><br><span class="line">146</span><br><span class="line">147</span><br><span class="line">148</span><br><span class="line">149</span><br><span class="line">150</span><br><span class="line">151</span><br><span class="line">152</span><br><span class="line">153</span><br><span class="line">154</span><br><span class="line">155</span><br><span class="line">156</span><br><span class="line">157</span><br><span class="line">158</span><br><span class="line">159</span><br><span class="line">160</span><br><span class="line">161</span><br><span class="line">162</span><br><span class="line">163</span><br><span class="line">164</span><br><span class="line">165</span><br><span class="line">166</span><br><span class="line">167</span><br><span class="line">168</span><br><span class="line">169</span><br><span class="line">170</span><br><span class="line">171</span><br><span class="line">172</span><br><span class="line">173</span><br><span class="line">174</span><br><span class="line">175</span><br><span class="line">176</span><br><span class="line">177</span><br><span class="line">178</span><br><span class="line">179</span><br><span class="line">180</span><br><span class="line">181</span><br><span class="line">182</span><br><span class="line">183</span><br><span class="line">184</span><br><span class="line">185</span><br><span class="line">186</span><br><span class="line">187</span><br><span class="line">188</span><br><span class="line">189</span><br><span class="line">190</span><br><span class="line">191</span><br><span class="line">192</span><br><span class="line">193</span><br><span class="line">194</span><br><span class="line">195</span><br><span class="line">196</span><br><span class="line">197</span><br><span class="line">198</span><br><span class="line">199</span><br><span class="line">200</span><br><span class="line">201</span><br><span class="line">202</span><br><span class="line">203</span><br><span class="line">204</span><br><span class="line">205</span><br><span class="line">206</span><br><span class="line">207</span><br><span class="line">208</span><br><span class="line">209</span><br><span class="line">210</span><br><span class="line">211</span><br><span class="line">212</span><br><span class="line">213</span><br><span class="line">214</span><br></pre></td><td class="code"><pre><span class="line">from flask import Flask, render_template, request, redirect, url_for, session, flash, send_from_directory, make_response</span><br><span class="line">import os</span><br><span class="line">from gmssl import sm4</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">def xor(byte1, byte2):</span><br><span class="line">    result = bytes(x ^ y for x, y in zip(byte1, byte2))</span><br><span class="line">    return result</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">key = os.urandom(16)</span><br><span class="line">iv = os.urandom(16)</span><br><span class="line">sm4_encryption = sm4.CryptSM4()</span><br><span class="line"></span><br><span class="line">app = Flask(__name__, template_folder=&#x27;templates&#x27;, static_folder=&#x27;static&#x27;)</span><br><span class="line">app.secret_key = b&#x27;palupalupalupalupalupalupalupalupalu&#x27; </span><br><span class="line"># 保留原始的用户数据访问对象 (DAO)</span><br><span class="line">class UserDAO(object):</span><br><span class="line">    def __init__(self):</span><br><span class="line">        self.users: dict[str, str] = &#123;&#125;</span><br><span class="line"></span><br><span class="line">    def getPassword(self, uid: str) -&gt; str:</span><br><span class="line">        if uid not in self.users:</span><br><span class="line">            raise Exception(&#x27;用户不存在&#x27;)</span><br><span class="line">        return self.users[uid]</span><br><span class="line"></span><br><span class="line">    def create(self, uid: str, password: str):</span><br><span class="line">        if uid in self.users:</span><br><span class="line">            raise Exception(&#x27;用户已注册&#x27;)</span><br><span class="line">        self.users[uid] = password</span><br><span class="line">        return</span><br><span class="line"></span><br><span class="line">DAO = UserDAO()</span><br><span class="line">DAO.create(&#x27;demoUser&#x27;, &#x27;123456&#x27;)</span><br><span class="line"></span><br><span class="line"># --- Flask 路由 --- </span><br><span class="line"></span><br><span class="line">@app.route(&#x27;/&#x27;)</span><br><span class="line">def index():</span><br><span class="line">    if &#x27;uid&#x27; in session:</span><br><span class="line">        return redirect(url_for(&#x27;profile&#x27;))</span><br><span class="line">    return redirect(url_for(&#x27;login&#x27;))</span><br><span class="line"></span><br><span class="line">@app.route(&#x27;/register&#x27;, methods=[&#x27;GET&#x27;, &#x27;POST&#x27;])</span><br><span class="line">def register():</span><br><span class="line">    if request.method == &#x27;POST&#x27;:</span><br><span class="line">        uid = request.form.get(&#x27;uid&#x27;)</span><br><span class="line">        if &#x27;admin&#x27; in uid:</span><br><span class="line">            flash(&#x27;不可以是admin哦&#x27;, &#x27;error&#x27;)</span><br><span class="line">            return redirect(url_for(&#x27;register&#x27;))</span><br><span class="line">        password = request.form.get(&#x27;password&#x27;)</span><br><span class="line">        confirm_password = request.form.get(&#x27;confirm_password&#x27;)</span><br><span class="line"></span><br><span class="line">        if not uid or not password:</span><br><span class="line">            flash(&#x27;用户ID和密码不可为空&#x27;, &#x27;error&#x27;)</span><br><span class="line">            return redirect(url_for(&#x27;register&#x27;))</span><br><span class="line"></span><br><span class="line">        if password != confirm_password:</span><br><span class="line">            flash(&#x27;两次输入的密码不一致&#x27;, &#x27;error&#x27;)</span><br><span class="line">            return redirect(url_for(&#x27;register&#x27;))</span><br><span class="line"></span><br><span class="line">        try:</span><br><span class="line">            DAO.create(uid, password)</span><br><span class="line">            flash(&#x27;注册成功，请登录&#x27;, &#x27;success&#x27;)</span><br><span class="line">            return redirect(url_for(&#x27;login&#x27;))</span><br><span class="line">        except Exception as e:</span><br><span class="line">            flash(str(e.args[0]), &#x27;error&#x27;)</span><br><span class="line">            return redirect(url_for(&#x27;register&#x27;))</span><br><span class="line"></span><br><span class="line">    return render_template(&#x27;register.html&#x27;)</span><br><span class="line"></span><br><span class="line">@app.route(&#x27;/login&#x27;, methods=[&#x27;GET&#x27;, &#x27;POST&#x27;])</span><br><span class="line">def login():</span><br><span class="line">    if request.method == &#x27;POST&#x27;:</span><br><span class="line">        uid = request.form.get(&#x27;uid&#x27;)</span><br><span class="line">        password = request.form.get(&#x27;password&#x27;)</span><br><span class="line"></span><br><span class="line">        if not uid or not password:</span><br><span class="line">            flash(&#x27;用户ID和密码不可为空&#x27;, &#x27;error&#x27;)</span><br><span class="line">            return redirect(url_for(&#x27;login&#x27;))</span><br><span class="line"></span><br><span class="line">        try:</span><br><span class="line">            stored_password = DAO.getPassword(uid)</span><br><span class="line">            if stored_password != password:</span><br><span class="line">                raise Exception(&#x27;用户ID或密码错误&#x27;)</span><br><span class="line"></span><br><span class="line">            user_level = &#x27;admin&#x27; if uid == &#x27;admin&#x27; else &#x27;guest&#x27;</span><br><span class="line">            </span><br><span class="line">            sm4_encryption.set_key(key, sm4.SM4_ENCRYPT)</span><br><span class="line">            token_payload = f&quot;&#123;uid&#125;:&#123;user_level&#125;&quot;.encode(&#x27;utf-8&#x27;)</span><br><span class="line">            token = sm4_encryption.crypt_cbc(iv, token_payload).hex()</span><br><span class="line"></span><br><span class="line">            session[&#x27;uid&#x27;] = uid</span><br><span class="line">            flash(f&#x27;登录成功，您的 token 是: &#123;token&#125;&#x27;, &#x27;success&#x27;)</span><br><span class="line">            # 创建响应对象并设置 cookie</span><br><span class="line">            response = make_response(redirect(url_for(&#x27;profile&#x27;)))</span><br><span class="line">            response.set_cookie(&#x27;auth_token&#x27;, token, httponly=True, samesite=&#x27;Lax&#x27;) # 设置 cookie</span><br><span class="line">            return response</span><br><span class="line"></span><br><span class="line">        except Exception as e:</span><br><span class="line">            flash(str(e.args[0]), &#x27;error&#x27;) # 显示更具体的错误信息</span><br><span class="line">            return redirect(url_for(&#x27;login&#x27;))</span><br><span class="line"></span><br><span class="line">    return render_template(&#x27;login.html&#x27;)</span><br><span class="line"></span><br><span class="line">@app.route(&#x27;/profile&#x27;)</span><br><span class="line">def profile():</span><br><span class="line">    if &#x27;uid&#x27; not in session:</span><br><span class="line">        return redirect(url_for(&#x27;login&#x27;))</span><br><span class="line">    </span><br><span class="line">    # 可以在这里添加解密 token 显示信息的逻辑，但暂时只显示用户名</span><br><span class="line">    username = session.get(&#x27;uid&#x27;)</span><br><span class="line">    return render_template(&#x27;profile.html&#x27;, username=username)</span><br><span class="line"></span><br><span class="line">@app.route(&#x27;/logout&#x27;)</span><br><span class="line">def logout():</span><br><span class="line">    session.pop(&#x27;uid&#x27;, None)</span><br><span class="line">    flash(&#x27;您已成功登出&#x27;, &#x27;info&#x27;)</span><br><span class="line">    return redirect(url_for(&#x27;login&#x27;))</span><br><span class="line"></span><br><span class="line">@app.route(&#x27;/file&#x27;, methods=[&#x27;GET&#x27;, &#x27;POST&#x27;])</span><br><span class="line">def read_file_page():</span><br><span class="line">    if &#x27;uid&#x27; not in session :</span><br><span class="line">        flash(&#x27;请先登录&#x27;, &#x27;warning&#x27;)</span><br><span class="line">        return redirect(url_for(&#x27;login&#x27;))</span><br><span class="line">    print(session)</span><br><span class="line">    </span><br><span class="line">    file_content = None</span><br><span class="line">    error_message = None</span><br><span class="line">    file_path_requested = &#x27;&#x27;</span><br><span class="line"></span><br><span class="line">    if request.method == &#x27;POST&#x27;:</span><br><span class="line">        token = request.cookies.get(&#x27;auth_token&#x27;) # 从 cookie 获取 token</span><br><span class="line">        file_path = request.form.get(&#x27;path&#x27;)</span><br><span class="line">        file_path_requested = file_path # 保留用户输入的路径以便回显</span><br><span class="line">        if not file_path:</span><br><span class="line">            error_message = &#x27;路径不可为空&#x27;</span><br><span class="line">        else:</span><br><span class="line">            try:</span><br><span class="line">                # 保留原始的 SM4 CBC 令牌验证逻辑</span><br><span class="line">                sm4_encryption.set_key(key, sm4.SM4_DECRYPT)</span><br><span class="line">                token_decrypted = sm4_encryption.crypt_cbc(iv, bytes.fromhex(token))</span><br><span class="line">                decrypted_str = token_decrypted.decode(&#x27;utf-8&#x27;, errors=&#x27;ignore&#x27;) </span><br><span class="line">                parts = decrypted_str.split(&#x27;:&#x27;)[-2:]</span><br><span class="line"></span><br><span class="line">                uid_from_token, lv = parts</span><br><span class="line"></span><br><span class="line">                if &#x27;admin&#x27; in lv:</span><br><span class="line">                    print(f&quot;管理员 &#123;uid_from_token&#125; 尝试读取: &#123;file_path&#125;&quot;)</span><br><span class="line">                    try:</span><br><span class="line"></span><br><span class="line">                        with open(file_path, &#x27;r&#x27;, encoding=&#x27;utf-8&#x27;) as f:</span><br><span class="line">                            file_content = f.read()</span><br><span class="line">                    except FileNotFoundError:</span><br><span class="line">                        error_message = &#x27;文件未找到&#x27;</span><br><span class="line">                    except Exception as e:</span><br><span class="line">                        print(f&quot;读取文件错误: &#123;e&#125;&quot;)</span><br><span class="line">                        error_message = &#x27;读取文件失败&#x27;</span><br><span class="line">                else:</span><br><span class="line">                    error_message = &#x27;非管理员，无权限读取服务器文件&#x27;</span><br><span class="line">            except ValueError as e:</span><br><span class="line">                 error_message = f&#x27;token非法: &#123;e&#125;&#x27;</span><br><span class="line">            except Exception as e:</span><br><span class="line">                print(f&quot;Token 解密/验证错误: &#123;e&#125;&quot;)</span><br><span class="line">                error_message = &#x27;token无效或已过期&#x27;</span><br><span class="line"></span><br><span class="line">    if error_message:</span><br><span class="line">        flash(error_message, &#x27;error&#x27;)</span><br><span class="line">        </span><br><span class="line">    return render_template(&#x27;file_viewer.html&#x27;, file_content=file_content, file_path_requested=file_path_requested)</span><br><span class="line"></span><br><span class="line"># 移除 Flask-RESTX 的 404 处理，使用 Flask 默认或自定义模板</span><br><span class="line">@app.errorhandler(404)</span><br><span class="line">def page_not_found(e):</span><br><span class="line">    # 可以创建一个 templates/404.html 页面</span><br><span class="line">    return render_template(&#x27;404.html&#x27;), 404 </span><br><span class="line"></span><br><span class="line">if __name__ == &#x27;__main__&#x27;:</span><br><span class="line">    # 确保 static 文件夹存在</span><br><span class="line">    if not os.path.exists(&#x27;static&#x27;):</span><br><span class="line">        os.makedirs(&#x27;static&#x27;)</span><br><span class="line">    # 确保 templates 文件夹存在</span><br><span class="line">    if not os.path.exists(&#x27;templates&#x27;):</span><br><span class="line">        os.makedirs(&#x27;templates&#x27;)</span><br><span class="line">    # 404 页面</span><br><span class="line">    if not os.path.exists(&#x27;templates/404.html&#x27;):</span><br><span class="line">        with open(&#x27;templates/404.html&#x27;, &#x27;w&#x27;, encoding=&#x27;utf-8&#x27;) as f:</span><br><span class="line">            f.write(&#x27;&lt;!doctype html&gt;&lt;title&gt;404 Not Found&lt;/title&gt;&lt;h1&gt;页面未找到&lt;/h1&gt;&lt;p&gt;您访问的页面不存在。&lt;/p&gt;&lt;a href=&quot;/&quot;&gt;返回首页&lt;/a&gt;&#x27;)</span><br><span class="line"></span><br><span class="line">    if not os.path.exists(&#x27;static/style.css&#x27;):</span><br><span class="line">         with open(&#x27;static/style.css&#x27;, &#x27;w&#x27;, encoding=&#x27;utf-8&#x27;) as f:</span><br><span class="line">            f.write(&#x27;&#x27;&#x27;</span><br><span class="line">body &#123; font-family: sans-serif; margin: 20px; background-color: #f4f4f4; &#125;</span><br><span class="line">.container &#123; max-width: 600px; margin: auto; background: #fff; padding: 20px; border-radius: 8px; box-shadow: 0 0 10px rgba(0,0,0,0.1); &#125;</span><br><span class="line">h1 &#123; color: #333; &#125;</span><br><span class="line">.form-group &#123; margin-bottom: 15px; &#125;</span><br><span class="line">label &#123; display: block; margin-bottom: 5px; &#125;</span><br><span class="line">input[type=&quot;text&quot;], input[type=&quot;password&quot;] &#123; width: calc(100% - 22px); padding: 10px; border: 1px solid #ddd; border-radius: 4px; &#125;</span><br><span class="line">button &#123; background-color: #5cb85c; color: white; padding: 10px 15px; border: none; border-radius: 4px; cursor: pointer; &#125;</span><br><span class="line">button:hover &#123; background-color: #4cae4c; &#125;</span><br><span class="line">a &#123; color: #0275d8; text-decoration: none; &#125;</span><br><span class="line">a:hover &#123; text-decoration: underline; &#125;</span><br><span class="line">.flash-messages &#123; margin-bottom: 15px; &#125;</span><br><span class="line">.alert &#123; padding: 10px; border-radius: 4px; margin-bottom: 10px; &#125;</span><br><span class="line">.alert-error &#123; background-color: #f8d7da; color: #721c24; border: 1px solid #f5c6cb; &#125;</span><br><span class="line">.alert-success &#123; background-color: #d4edda; color: #155724; border: 1px solid #c3e6cb; &#125;</span><br><span class="line">.alert-info &#123; background-color: #d1ecf1; color: #0c5460; border: 1px solid #bee5eb; &#125;</span><br><span class="line">.alert-warning &#123; background-color: #fff3cd; color: #856404; border: 1px solid #ffeeba; &#125;</span><br><span class="line">.file-content &#123; margin-top: 20px; padding: 15px; background-color: #eee; border: 1px solid #ddd; border-radius: 4px; white-space: pre-wrap; word-wrap: break-word; &#125;</span><br><span class="line">nav &#123; margin-bottom: 20px; text-align: right; &#125;</span><br><span class="line">nav span &#123; margin-right: 15px; &#125;</span><br><span class="line">            &#x27;&#x27;&#x27;)</span><br><span class="line"></span><br><span class="line">    app.run(debug=True, host=&#x27;0.0.0.0&#x27;, port=10002)</span><br></pre></td></tr></table></figure><p>在 app.py 中，token 的生成是将用户 ID 和用户级别（如 :guest 或 :admin）拼接后，使用 SM4 的 CBC 模式进行加密得到的，所以我们可以利用CBC 模式的特性来构造一个新的 token，使得解密后的用户级别变为 :admin。然后拿着新的token重新发包过去就可以了。</p><p>exp:</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre><span class="line">BLOCK_SIZE = 16</span><br><span class="line"></span><br><span class="line">def pkcs7_pad(data, block_size):</span><br><span class="line">    padding_len = block_size - (len(data) % block_size)</span><br><span class="line">    padding = bytes([padding_len] * padding_len)</span><br><span class="line">    return data + padding</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">def xor_bytes(b1, b2):</span><br><span class="line">    return bytes(x ^ y for x, y in zip(b1, b2))</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">auth_token = &#x27;c575072409e12c59db9ce9fdf3bcda799808caf067156983cf80b58086d38e09&#x27;</span><br><span class="line">A = auth_token[:32]</span><br><span class="line">C_old = pkcs7_pad(&#x27;:guest&#x27;.encode(), BLOCK_SIZE)</span><br><span class="line">B = xor_bytes(bytes.fromhex(A), C_old)</span><br><span class="line">C_new = pkcs7_pad(&#x27;:admin&#x27;.encode(), BLOCK_SIZE)</span><br><span class="line">new_token = xor_bytes(B, C_new).hex() + auth_token[32:]</span><br><span class="line">print(new_token)</span><br></pre></td></tr></table></figure><p><img src="https://source.yizhixiaojiuli.cn/img/2025-2th-parloo/文件查看器1.png" alt="发包"></p>]]></content>
    
    
      
      
    <summary type="html">&lt;h2 id=&quot;RSA-Quartic-Quandary&quot;&gt;&lt;a href=&quot;#RSA-Quartic-Quandary&quot; class=&quot;headerlink&quot; title=&quot;RSA_Quartic_Quandary&quot;&gt;&lt;/a&gt;RSA_Quartic_Quandary&lt;/h2&gt;&lt;script type=&quot;math/tex; mode=display&quot;&gt;
&#92;begin{align}
s &amp;= p^4 + q^4 &#92;&#92;
&#92;&#92;
p + q &amp;= &#92;sqrt{&#92;sqrt{(p^2 + q^2)^2} + 2 &#92;cdot p &#92;cdot q} &#92;&#92;
&amp;= &#92;sqrt{&#92;sqrt{p^4 + q^4 + 2 &#92;cdot p^2 &#92;cdot q^2} + 2 &#92;cdot p &#92;cdot q} &#92;&#92;
&amp;= &#92;sqrt{&#92;sqrt{s + 2 &#92;cdot n^2} + 2 &#92;cdot n} &#92;&#92;

&#92;&#92;
&#92;phi &amp;= n - (p + q) + 1
&#92;end{align}&lt;/script&gt;&lt;p&gt;exp:&lt;/p&gt;
&lt;figure class=&quot;highlight plaintext&quot;&gt;&lt;table&gt;&lt;t</summary>
      
    
    
    
    <category term="crypto - write_up" scheme="http://www.yizhixiaojiuli.cn/categories/crypto-write-up/"/>
    
    
  </entry>
  
  <entry>
    <title>2024-cryptoctf-wp</title>
    <link href="http://www.yizhixiaojiuli.cn/2025/03/11/2024-cryptoctf-wp/"/>
    <id>http://www.yizhixiaojiuli.cn/2025/03/11/2024-cryptoctf-wp/</id>
    <published>2025-03-11T09:00:00.000Z</published>
    <updated>2025-03-11T09:00:00.000Z</updated>
    
    <content type="html"><![CDATA[<h1 id="Easy"><a href="#Easy" class="headerlink" title="Easy"></a>Easy</h1><h2 id="alibos"><a href="#alibos" class="headerlink" title="alibos"></a>alibos</h2><p>题目描述：<br><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">Alibos, a classic cryptographic algorithm, is designed to safeguard non-sensitive data, providing a reliable solution for routine information protection.</span><br></pre></td></tr></table></figure></p><p>题目：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br></pre></td><td class="code"><pre><span class="line">#!/usr/bin/env python3</span><br><span class="line"></span><br><span class="line">from Crypto.Util.number import *</span><br><span class="line">from gmpy2 import *</span><br><span class="line">from secret import d, flag</span><br><span class="line"></span><br><span class="line">get_context().precision = 1337</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">def pad(m, d):</span><br><span class="line">    if len(str(m)) &lt; d:</span><br><span class="line">        m = str(m) + &#x27;1&#x27; * (d - len(str(m)))</span><br><span class="line">    return int(m)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">def genkey(d):</span><br><span class="line">    skey = getRandomRange(10 ** (d - 1), 10 ** d)</span><br><span class="line">    pkey = int(10 ** d * (sqrt(skey) - floor(sqrt(skey))))</span><br><span class="line">    return pkey, skey</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">def encrypt(m, pkey):</span><br><span class="line">    m = pad(m, len(str(pkey)))</span><br><span class="line">    d = len(str(pkey))</span><br><span class="line">    c = (pkey + d ** 2 * m) % (10 ** d)</span><br><span class="line">    return c</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">pkey, skey = genkey(d)</span><br><span class="line"></span><br><span class="line">m = bytes_to_long(flag)</span><br><span class="line">c = encrypt(m, pkey)</span><br><span class="line"></span><br><span class="line">print(f&#x27;pkey = &#123;pkey&#125;&#x27;)</span><br><span class="line">print(f&#x27;enc  = &#123;c&#125;&#x27;)</span><br></pre></td></tr></table></figure><p>output:<br><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">pkey = 8582435512564229286688465405009040056856016872134514945016805951785759509953023638490767572236748566493023965794194297026085882082781147026501124183913218900918532638964014591302221504335115379744625749001902791287122243760312557423006862735120339132655680911213722073949690947638446354528576541717311700749946777</span><br><span class="line">enc  = 6314597738211377086770535291073179315279171595861180001679392971498929017818237394074266448467963648845725270238638741470530326527225591470945568628357663345362977083408459035746665948779559824189070193446347235731566688204757001867451307179564783577100125355658166518394135392082890798973020986161756145194380336</span><br></pre></td></tr></table></figure></p><p>简单来说的是按照如下方式进行加密：<br>$c = \text{pkey} + d^2 \quad (\text{pad}(m)) \quad \text{mod}(10^d)$<br>这里主要是未知d，但是仔细观察题目会发现$d = len(str(pkey))$ 所以d就已知了，直接解即可</p><p>exp:</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line">from Crypto.Util.number import *</span><br><span class="line">from gmpy2 import *</span><br><span class="line"></span><br><span class="line">pkey = 8582435512564229286688465405009040056856016872134514945016805951785759509953023638490767572236748566493023965794194297026085882082781147026501124183913218900918532638964014591302221504335115379744625749001902791287122243760312557423006862735120339132655680911213722073949690947638446354528576541717311700749946777</span><br><span class="line">c = 6314597738211377086770535291073179315279171595861180001679392971498929017818237394074266448467963648845725270238638741470530326527225591470945568628357663345362977083408459035746665948779559824189070193446347235731566688204757001867451307179564783577100125355658166518394135392082890798973020986161756145194380336</span><br><span class="line">p_d = len(str(pkey))</span><br><span class="line">mod = 10 ** p_d</span><br><span class="line">m = ((c - pkey) % mod * inverse(p_d ** 2, 10 ** p_d)) % mod</span><br><span class="line">print(m)</span><br><span class="line"># 这里是需要去掉pad所以直接复制出来的数字，也可以写个循环判断flag头</span><br><span class="line">flag = long_to_bytes(</span><br><span class="line">    int(617070432649333612824260819310073660177462690396680303631818904538190359368277582922920090537696854326452605))</span><br><span class="line">print(flag)</span><br><span class="line">#CCTF&#123;h0M3_m4De_cRyp70_5ySTeM_1N_CryptoCTF!!!&#125;</span><br></pre></td></tr></table></figure><h2 id="Mashy"><a href="#Mashy" class="headerlink" title="Mashy"></a>Mashy</h2><p>题目描述：<br><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">Mashy may seem like a simple cracking task, but you&#x27;ll need to open your eyes to identify the right things to crack.</span><br></pre></td></tr></table></figure></p><p>题目：<br><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br></pre></td><td class="code"><pre><span class="line">#!/usr/bin/env python3</span><br><span class="line"></span><br><span class="line">import sys</span><br><span class="line">from hashlib import md5</span><br><span class="line">from binascii import *</span><br><span class="line">from secret import salt, flag</span><br><span class="line"></span><br><span class="line">def die(*args):</span><br><span class="line">pr(*args)</span><br><span class="line">quit()</span><br><span class="line"></span><br><span class="line">def pr(*args):</span><br><span class="line">s = &quot; &quot;.join(map(str, args))</span><br><span class="line">sys.stdout.write(s + &quot;\n&quot;)</span><br><span class="line">sys.stdout.flush()</span><br><span class="line"></span><br><span class="line">def sc():</span><br><span class="line">return sys.stdin.buffer.readline()</span><br><span class="line"></span><br><span class="line">def xor(s1, s2):</span><br><span class="line">return bytes([s1[_] ^ s2[_] for _ in range(len(s1))])</span><br><span class="line"></span><br><span class="line">def main():</span><br><span class="line">border = &quot;┃&quot;</span><br><span class="line">pr(        &quot;┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓&quot;)</span><br><span class="line">pr(border, &quot;.: Hi all, she did Mashy, you should do it too! Are you ready? :. &quot;, border)</span><br><span class="line">pr(        &quot;┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛&quot;)</span><br><span class="line"></span><br><span class="line">REC = []</span><br><span class="line">cnt, STEP = 0, 7</span><br><span class="line">sh = md5(salt).digest()</span><br><span class="line"></span><br><span class="line">while True:</span><br><span class="line">pr(border, f&#x27;Please send your first input:  &#x27;)</span><br><span class="line">d1 = sc().strip()</span><br><span class="line">pr(border, f&#x27;Please send your second input: &#x27;)</span><br><span class="line">d2 = sc().strip()</span><br><span class="line">try:</span><br><span class="line">d1 = hexlify(unhexlify(d1))</span><br><span class="line">d2 = hexlify(unhexlify(d2))</span><br><span class="line">h1 = md5(unhexlify(d1)).digest()</span><br><span class="line">h2 = md5(unhexlify(d2)).digest()</span><br><span class="line">except:</span><br><span class="line">die(border, &#x27;Your inputs are not valid! Bye!!!&#x27;)</span><br><span class="line">if d1 != d2 and d1 not in REC and d2 not in REC:</span><br><span class="line">if md5(xor(d1, d2)).hexdigest() != &#x27;ae09d7510659ca40eda3e45ca70e9606&#x27;:</span><br><span class="line">if hexlify(xor(xor(h1, h2), sh)) == b&#x27;a483b30944cbf762d4a3afc154aad825&#x27;:</span><br><span class="line">REC += [d1, d2]</span><br><span class="line">if cnt == STEP:</span><br><span class="line">die(border, f&#x27;Congrats! the flag: &#123;flag&#125;&#x27;)</span><br><span class="line">pr(border, &#x27;Good job, try next level :P&#x27;)</span><br><span class="line">cnt += 1</span><br><span class="line">else:</span><br><span class="line">die(border, &#x27;Your input is not correct! Bye!&#x27;)</span><br><span class="line">else:</span><br><span class="line">die(border, &#x27;No this one! Sorry!!&#x27;)</span><br><span class="line">else:</span><br><span class="line">die(border, &#x27;Kidding me!? Bye!!&#x27;)</span><br><span class="line"></span><br><span class="line">if __name__ == &#x27;__main__&#x27;:</span><br><span class="line">main()</span><br></pre></td></tr></table></figure></p><p>简单来说是要完成七轮挑战，使得输入的两个16进制串d1,d2，使得满足：</p><ul><li>d1 不等于 d2</li><li>d1 xor d2 的md5不为 ae09d7510659ca40eda3e45ca70e9606</li><li>md5(d1) xor md5(d2) xor sh 的值为 a483b30944cbf762d4a3afc154aad825</li></ul><p>这题纯出题人脑子有病，出的莫名其妙的，全靠猜<br>ae09d7510659ca40eda3e45ca70e9606的原像为：b’\x00’ * 256<br>a483b30944cbf762d4a3afc154aad825的原像为：emelinjulca<br>然后我们不知道salt也就是sh，就进行不下去了，其实sh就是emelinjulca，纯就跟出题人脑袋相接才能做<br>（ps； 赛中的时候我人都傻了，然后一看几十解了，就拿emelinjulca试了一下结果真是，真是无了大语了）<br>到这里问题就简单了，整几组前缀进行MD5碰撞就完事了</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br></pre></td><td class="code"><pre><span class="line">from pwn import *</span><br><span class="line"></span><br><span class="line">sh = remote(&quot;01.cr.yp.toc.tf&quot;,13771)</span><br><span class="line"></span><br><span class="line">msg = [(b&quot;31000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fe11ecc10c7ab8b4fe112d7f29ceb2dae1f39ce7a691488bfb817b7685ad087a162b0ce0ea69b140e7274b44c43f183578392f9719b43d4966c321cc0a10e6fbd002869b42f9fad9eb869dc55d5d349835961b1fd36a0bbe76a9bb5f4f5cc54136dec48d74497bf6579a6bf9721b81078637b429cff958886bd816dc4333a338&quot;,b&quot;31000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fe11ecc10c7ab8b4fe112d7f29ceb2dae1f39c67a691488bfb817b7685ad087a162b0ce0ea69b140e7274b44c4bf183578392f9719b43d4966c3214c0a10e6fbd002869b42f9fad9eb869dc55d5d349835961b9fd36a0bbe76a9bb5f4f5cc54136dec48d74497bf6579a6bf9729b80078637b429cff958886bd8165c4333a338&quot;),</span><br><span class="line">       (b&quot;32000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ebcd0390c198c8f33b4a08cce32f47451b5002e68895b7505d12824a0a460d133de3eff34e4de89ceb27ed3bce211b4696fec6736c059058d8b60f6e473f6c701068abf2d6bc645c4589a6f0f5211f5fc903c96e789d91f8abb300d8176088b7d31d825897c9001cf409c45b3a50005e93e33f4f908f9df944a664c927d28d55&quot;,b&quot;32000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ebcd0390c198c8f33b4a08cce32f47451b5002668895b7505d12824a0a460d133de3eff34e4de89ceb27ed3bcea11b4696fec6736c059058d8b60fee473f6c701068abf2d6bc645c4589a6f0f5211f5fc903c9ee789d91f8abb300d8176088b7d31d825897c9001cf409c45b3ad0ff5d93e33f4f908f9df944a6644927d28d55&quot;),</span><br><span class="line">       (b&quot;3300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000068270588dbc19cfe24db79019b0070d1823c4a4d6d816cdb22c2401a32081455e5db01c54c0ccf1b6706f061eec3e58ead12b5173dee55f954f9ac52a1a4bbedc32ab0ee3cae3896f9908a49d38cc5535c6c80661d262e1ec91a8639ecc7e1654086c61bf4cfe7fc6a7378f7809416ef39ae4ccc7fc29570c4c3a51b03fed7b9&quot;,b&quot;3300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000068270588dbc19cfe24db79019b0070d1823c4acd6d816cdb22c2401a32081455e5db01c54c0ccf1b6706f061ee43e68ead12b5173dee55f954f9acd2a1a4bbedc32ab0ee3cae3896f9908a49d38cc5535c6c80e61d262e1ec91a8639ecc7e1654086c61bf4cfe7fc6a7378f7801416ef39ae4ccc7fc29570c4c3a59b03fed7b9&quot;),</span><br><span class="line">       (b&quot;3400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000025a80516e996c87574dc568d274da9d2d281b09bbc72f7ef46767961b4a708e969ebffe06a6e0945cbefe2f2fc41d89cb89c2574afb1fdbac5aca131cdf52d68b9e3c95615888cbc3d187ccd32f60d5b35636e925c1aa3002bb330c81b6088d8cbeb8014afc24f5e374ad05ab2f30d1fac7221195b7f3f1f19f5219ecaf948a2&quot;,b&quot;3400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000025a80516e996c87574dc568d274da9d2d281b01bbc72f7ef46767961b4a708e969ebffe06a6e0945cbefe2f2fcc1d89cb89c2574afb1fdbac5aca1b1cdf52d68b9e3c95615888cbc3d187ccd32f60d5b35636e125c1aa3002bb330c81b6088d8cbeb8014afc24f5e374ad05ab2730d1fac7221195b7f3f1f19f5211ecaf948a2&quot;),</span><br><span class="line">       (b&quot;35000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f56f1da5ad57f483059ae0869962f05204f954e2de9d56c55b168139ec372cefb1b307cbe84ce477cbff5df4d40bc46c08ceef8bb18bfc996b3b9fdaa7b72c17ee1cb3491794d6e2ff7d9914525cdf2d88b9314505ef864d201d2b364a6e25ae4d183e738c3c86e53e5ad1a1910c825cb1bcd59b97d1a3cf979668fbac6a138b&quot;,b&quot;35000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f56f1da5ad57f483059ae0869962f05204f95462de9d56c55b168139ec372cefb1b307cbe84ce477cbff5df4d48bc46c08ceef8bb18bfc996b3b9f5aa7b72c17ee1cb3491794d6e2ff7d9914525cdf2d88b931c505ef864d201d2b364a6e25ae4d183e738c3c86e53e5ad1a1918c815cb1bcd59b97d1a3cf9796687bac6a138b&quot;),</span><br><span class="line">       (b&quot;36000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f2b343c2bb614b7b4acc4e0ade8a5e4b2abb4eefe97ef7991832793e4e301637cf0becd84c43dbafeb43d0da12c8e2883e0d02ada60e678e3470ee866abe2fa713b8a521a986e75d821f74221fee2ea441b3ab462f29b56f862b00d05f60cdc1a9a1c92d04457bd6e693673963ab6e6b6c3552cd1c54efe627b342fecdfd8dea&quot;,b&quot;36000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f2b343c2bb614b7b4acc4e0ade8a5e4b2abb4e6fe97ef7991832793e4e301637cf0becd84c43dbafeb43d0da1248e3883e0d02ada60e678e3470ee066abe2fa713b8a521a986e75d821f74221fee2ea441b3abc62f29b56f862b00d05f60cdc1a9a1c92d04457bd6e6936739632b6e6b6c3552cd1c54efe627b3427ecdfd8dea&quot;),</span><br><span class="line">       (b&quot;370000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001d6afba61c0910b5ca21a9164b65134753b3845080d9afe6460237a1d938a8385204b0e85cce2b686b40d9b9c517e64b08ee01d02fa63470aa3b34c1e550d11356d867ea70e96b0257d9b1b20df1ee22603111180739001ad17bf6c8dd707932b34e97b62e74936197adcc2f93164b46c7c7e4bb7b6c1a55a21958961f7378be&quot;,b&quot;370000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001d6afba61c0910b5ca21a9164b65134753b384d080d9afe6460237a1d938a8385204b0e85cce2b686b40d9b9c597e64b08ee01d02fa63470aa3b3441e550d11356d867ea70e96b0257d9b1b20df1ee22603111980739001ad17bf6c8dd707932b34e97b62e74936197adcc2f93964a46c7c7e4bb7b6c1a55a21958161f7378be&quot;),</span><br><span class="line">       (b&quot;38000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c6eb639aedf271805029b40d4dc783ab8d769d35cb9032f9184641b94c881615f5f902cb5e8ba3176f2660d4f821828fdbed111365cc4dfbbf001ca884fcb74df4f681c17ed38f53b8346319fee0c2eaecf2ea2597f0ca2c04ed6c064e9e3ddd7d37ff3e54908e889a58455a8fd411bc0f75e93cadc453f6f89d16e8cd8e7c2a&quot;,b&quot;38000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c6eb639aedf271805029b40d4dc783ab8d769db5cb9032f9184641b94c881615f5f902cb5e8ba3176f2660d4f8a1828fdbed111365cc4dfbbf001c2884fcb74df4f681c17ed38f53b8346319fee0c2eaecf2eaa597f0ca2c04ed6c064e9e3ddd7d37ff3e54908e889a58455a8f5411bc0f75e93cadc453f6f89d1668cd8e7c2a&quot;)]</span><br><span class="line"></span><br><span class="line">for i in range(8):</span><br><span class="line">    sh.sendline(msg[i][0])</span><br><span class="line">    sh.sendline(msg[i][1])</span><br><span class="line"></span><br><span class="line">sh.recvuntil(b&quot;Congrats! the flag: &quot;)</span><br><span class="line"></span><br><span class="line">print(sh.recvline())</span><br><span class="line"></span><br><span class="line">#CCTF&#123;mD5_h4Sh_cOlL!Si0N_CrYp7o_ch41lEnGe!!!&#125;</span><br></pre></td></tr></table></figure><h2 id="Beheaded"><a href="#Beheaded" class="headerlink" title="Beheaded$"></a>Beheaded$</h2><p>题目描述：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">The beheaded flags have had their headers removed, making them encrypted. Can a living entity truly survive without a head?</span><br></pre></td></tr></table></figure><p>题目：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line"></span><br><span class="line">source secrets.sh</span><br><span class="line"></span><br><span class="line">FLAGS=&quot;all_flags.txt&quot;</span><br><span class="line">rm -f &quot;all_flags.enc&quot;</span><br><span class="line"></span><br><span class="line">while read flag; do</span><br><span class="line">magick -background white -fill blue -pointsize 72 -size &quot;$X&quot;x&quot;$Y&quot; -gravity North caption:&quot;$flag&quot; flag.ppm</span><br><span class="line">tail -n +4 flag.ppm &gt; tail</span><br><span class="line">openssl enc -aes-256-ecb -pbkdf2 -nosalt -pass pass:&quot;$KEY&quot; -in tail &gt;&gt; &quot;all_flags.enc&quot;</span><br><span class="line">done &lt; &quot;$FLAGS&quot;</span><br></pre></td></tr></table></figure><p>题目将flag串写在图片上，然后对这张图片进行ECB加密，最后得到密文文件。<br>这个不太会，看春哥说是用工具，以后再说吧。</p><h1 id="Medium"><a href="#Medium" class="headerlink" title="Medium"></a>Medium</h1><h2 id="Alilbols"><a href="#Alilbols" class="headerlink" title="Alilbols"></a>Alilbols</h2><p>题目:</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br></pre></td><td class="code"><pre><span class="line">#!/usr/bin/env python3</span><br><span class="line"></span><br><span class="line">from Crypto.Util.number import *</span><br><span class="line">from gmpy2 import *</span><br><span class="line">from secret import d, flag</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">def genkey(d):</span><br><span class="line">    while True:</span><br><span class="line">        f = getRandomRange(1, int(sqrt(2) * 10 ** d))</span><br><span class="line">        g = getRandomRange(10 ** d, int(sqrt(2) * 10 ** d))</span><br><span class="line">        if gcd(f, 10 * g) == 1:</span><br><span class="line">            q = 4 * 100 ** d</span><br><span class="line">            h = inverse(f, q) * g % q</span><br><span class="line">            if gcd(h, 10 * d) == 1:</span><br><span class="line">                break</span><br><span class="line">    pkey, skey = (d, h), (f, g)</span><br><span class="line">    return pkey, skey</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">def encrypt(m, pkey):</span><br><span class="line">    d, h = pkey</span><br><span class="line">    q = 4 * 100 ** d</span><br><span class="line">    assert m &lt; 10 ** d</span><br><span class="line">    r = getRandomRange(1, 10 ** d // 2)</span><br><span class="line">    c = (r * h + m + r) % q</span><br><span class="line">    return c</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">pkey, _ = genkey(d)</span><br><span class="line">m = bytes_to_long(flag)</span><br><span class="line">c = encrypt(m, pkey)</span><br><span class="line"></span><br><span class="line">print(f&#x27;h = &#123;pkey[1]&#125;&#x27;)</span><br><span class="line">print(f&#x27;c = &#123;c&#125;&#x27;)</span><br></pre></td></tr></table></figure><p>output:</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">h = 1051643987107349427988807326909852110640860009433515828832892541964729933410444984350917250524103015414239941369074041041830326426044333499878031164851095096864048639115431370526747014210332286314344073411522846701723463410585601251886732229726828022089809603850477551571014006202841406236367999378786782206165205893353928598469661871284779486855440579818275314024966224282757807716013799903830828885606714972634243850947534165272668985513949964901606268939300116019465522042467054120201087606016018354238401711720121586874288767235317479748890350702705575809130664969776549574720593740409234863974057904204809404816059921579771581800937241591669455683460570640868196509926763901079838233646036933530095891316054589051458146768287967886035091641162494322987627448810201550901588438560433001422233269632915351406169253963308421081459981594969405377353502889363324282815864766827664453823780238352371809048289845094882346227809082005375092441877966603138648719670349093616548820955566204871333952902983753935678447080673827214244142614295192263451840766771122229866931492260663320087497820892824540996643905125018452302747847009</span><br><span class="line">c = 11913143174789215053772744981113562063689725867199301496294410323568897757042952642806438602327917861884988292757318755590132189620231444302311290566584065812614959093870787195145654508262419270742989923415342357807325941686508030706603920412262004324188375072184983301522882728578077572816154054220606088703932092256905881975876112779175003897105313776239681492514925430817300633974666123599685062340158348009344351002327049272743679109535286730751345284084148118733529966364414749672437370878526710641430471595906340522772252875146681541656231708112317601000655090279925720590940060372738708208419449824043905057860829031242339842131799965043031307394209699264362321397162645220002253271689678364848888381499587038475895945238726252440250183268252483198408039250213490525880829604473555612305513974817850974135874728084839426045420913060975464553734293001460752648937744531874552694145500413222582269910431269597066268600572899619407093373565994271589940926018891922169454906132284552523035481664164354874071831210264979733079749696197917769435226866441989054017071332158916586376454753209296136133271926449919437888563234409</span><br></pre></td></tr></table></figure><p>密钥生成有：</p><ul><li>$ 1 \leq f &lt; \sqrt{2} \cdot 10 ^ d$</li><li>$ 10 ^ d \leq g &lt; \sqrt{2} \cdot 10 ^ d$</li><li>$ q = 4 \cdot 10 ^ 2d$</li><li>$ h = f ^ {-1} g \ (mod \ q)$</li></ul><p>加密有:</p><ul><li>取一个随机数r, 满足 $ 1 &lt; r &lt; \frac{10^d}{2}$</li><li>计算密文 $ c = rh + m + r \ (mod \ q) $</li></ul><p>给出了h,c, 需要还原m</p><p>很明显是NTRU，直接造格：<br>$\begin{bmatrix} r &amp; -1 &amp; k \end{bmatrix}$ <script type="math/tex">\begin{bmatrix} 1 & 0 & h+1 \\ 0 & 1 & c \\ 0 & 0 & q  \end{bmatrix}</script> = $\begin{bmatrix} r &amp; -1 &amp; -m \end{bmatrix}$</p><p>但是我们不知道d,q, 所以需要枚举一下d的大小</p><p>exp:</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line">from Crypto.Util.number import *</span><br><span class="line">h = </span><br><span class="line">c = </span><br><span class="line"></span><br><span class="line">for d in range(500,800):</span><br><span class="line">    q = 4 * 10 ** (2 *d)</span><br><span class="line">    M = matrix(ZZ, [[2, 0, h+1],</span><br><span class="line">                [0, 10^d,c],</span><br><span class="line">                [0, 0,   q]])</span><br><span class="line">    v = M.LLL()[0] </span><br><span class="line">    m = int(abs(v[-1]))</span><br><span class="line">    if b&#x27;CCTF&#x27; in long_to_bytes(m):</span><br><span class="line">        print(d)</span><br><span class="line">        print(long_to_bytes(m))</span><br></pre></td></tr></table></figure><h2 id="Ally"><a href="#Ally" class="headerlink" title="Ally*"></a>Ally*</h2><p>题目描述： </p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">Ally enjoys the challenge of solving Diophantine equations, so help them tackle this latest complex equation as well.</span><br></pre></td></tr></table></figure><p>题目：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br></pre></td><td class="code"><pre><span class="line">import sys</span><br><span class="line">from Crypto.Util.number import *</span><br><span class="line">from flag import flag</span><br><span class="line"></span><br><span class="line">def die(*args):</span><br><span class="line">pr(*args)</span><br><span class="line">quit()</span><br><span class="line"></span><br><span class="line">def pr(*args):</span><br><span class="line">s = &quot; &quot;.join(map(str, args))</span><br><span class="line">sys.stdout.write(s + &quot;\n&quot;)</span><br><span class="line">sys.stdout.flush()</span><br><span class="line"></span><br><span class="line">def sc():</span><br><span class="line">return sys.stdin.buffer.readline()</span><br><span class="line"></span><br><span class="line">def main():</span><br><span class="line">border = &quot;┃&quot;</span><br><span class="line">pr(        &quot;┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓&quot;)</span><br><span class="line">pr(border, &quot;.::  Ally is my best friend, help him to solve his tough task  ::.&quot;, border)</span><br><span class="line">pr(        &quot;┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛&quot;)</span><br><span class="line"></span><br><span class="line">nbit = 14</span><br><span class="line">level, step = 0, 19</span><br><span class="line">while True:</span><br><span class="line">pr(border, f&#x27;Please send your &#123;nbit&#125;-bit prime:  &#x27;)</span><br><span class="line">p = sc().strip()</span><br><span class="line">try:</span><br><span class="line">p = int(p)</span><br><span class="line">except:</span><br><span class="line">die(border, &#x27;Your input is not valid! Bye!!!&#x27;)</span><br><span class="line">if isPrime(p) and p.bit_length() == nbit:</span><br><span class="line">pr(border, &#x27;Send the solution of the following Diophantine equation in positive integers x, y&#x27;)</span><br><span class="line">pr(border, f&#x27;&#123;p&#125; * (x - y)**3 = (x**2 + y) * (x + y**2)&#x27;)</span><br><span class="line">xy = sc().strip().decode()</span><br><span class="line">try:</span><br><span class="line">x, y = [int(_) for _ in xy.split(&#x27;,&#x27;)]</span><br><span class="line">except:</span><br><span class="line">die(border, &#x27;Your answer is not valid! Bye!!!&#x27;)</span><br><span class="line">if p * (x - y)**3 == (x**2 + y) * (x + y**2) and x &gt; 0 and y &gt; 0:</span><br><span class="line">if level == step:</span><br><span class="line">die(border, f&#x27;Congratz! You got the flag: &#123;flag&#125;&#x27;)</span><br><span class="line">else:</span><br><span class="line">pr(border, f&#x27;Good job, try the next step &#123;level + 2&#125;&#x27;)</span><br><span class="line">level += 1</span><br><span class="line">nbit = int(1.2*nbit) + getRandomRange(0, 6)</span><br><span class="line">else:</span><br><span class="line">die(border, &#x27;Your answer is not correct! Bye!!&#x27;)</span><br><span class="line">else:</span><br><span class="line">die(border, &#x27;Kidding me!? Bye!!&#x27;)</span><br><span class="line"></span><br><span class="line">if __name__ == &#x27;__main__&#x27;:</span><br><span class="line">main()</span><br></pre></td></tr></table></figure><ul><li>就是给出19对如下的丢番图方程的正整数解：<script type="math/tex; mode=display">p(x-y)^3 = (x^2 + y)(x+y^2)</script></li></ul><p>赛中没做出来，赛后发现其实:</p><script type="math/tex; mode=display">p = 4y+1x = 2y+1</script><p>就可以了</p><p>exp:</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br></pre></td><td class="code"><pre><span class="line">from pwn import *</span><br><span class="line">from Crypto.Util.number import *</span><br><span class="line"></span><br><span class="line">def get_valid_prime(bits):</span><br><span class="line">    while True:</span><br><span class="line">        p = getPrime(bits)</span><br><span class="line">        if p % 4 == 1:</span><br><span class="line">            return p</span><br><span class="line"></span><br><span class="line">try:</span><br><span class="line">    sh = remote(&#x27;01.cr.yp.toc.tf&#x27;, 13777)</span><br><span class="line">    for i in range(20):</span><br><span class="line">        sh.recvuntil(b&#x27;Please send your &#x27;)</span><br><span class="line">        bit_length = sh.recvuntil(b&#x27;-&#x27;)[:-1]</span><br><span class="line">        bit_length = int(bit_length)</span><br><span class="line">        sh.recvline()</span><br><span class="line"></span><br><span class="line">        p = get_valid_prime(bit_length)</span><br><span class="line">        y = (p - 1) // 4</span><br><span class="line">        x = 2 * y + 1</span><br><span class="line"></span><br><span class="line">        sh.sendline(str(p).encode())</span><br><span class="line">        sh.recvline()</span><br><span class="line">        sh.sendline(f&#x27;&#123;x&#125;,&#123;y&#125;&#x27;.encode())</span><br><span class="line">        sh.recv()</span><br><span class="line"></span><br><span class="line">    print(sh.recvline())</span><br><span class="line">except Exception as e:</span><br><span class="line">    print(f&quot;发生错误: &#123;e&#125;&quot;)</span><br></pre></td></tr></table></figure><h2 id="Bada"><a href="#Bada" class="headerlink" title="Bada*"></a>Bada*</h2><p>题目描述:</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">The Bada equation contains an undetermined function. By closely examining how this equation behaves, you may be able to discover the concealed flag.</span><br></pre></td></tr></table></figure><p>题目:</p><p>存在一个函数方程f: N×N → Z:</p><ul><li>$ f(a+1,b) = f(a,b) + a $</li><li>$ f(a,b+1) = f(a,b) - b $</li></ul><p>给定了f($x_0$,$y_0$)的函数值，以及f（x,y）的值，求（x,y）使满足f(x,y)=z</p><p>很明显这两个函数方程可以看作两个等差数列，也就是有:</p><script type="math/tex; mode=display">f(x,y) =  f(1,1) + (1+2+...+(x-1)) - (1+2+...+(y-1))</script><p>即是：</p><script type="math/tex; mode=display">f(x,y) = f(1,1) + \frac{(x-1)(x)}{2} - \frac{(y-1)(y)}{2}</script><p>记f(1,1)为c<br>也就是有：</p><script type="math/tex; mode=display">f(x,y) = \frac{(x-1)(x)}{2} - \frac{(y-1)(y)}{2} + c</script><p>这里就把问题变成了解关于x和y的不定方程的问题:</p><script type="math/tex; mode=display">\begin{align*}2(z-c) &= x(x-1)- y(y-1) \\       &= (x-y)(x+y-1) \quad \text{} \\\end{align*}</script><p>exp:</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br></pre></td><td class="code"><pre><span class="line">from Pwn4Sage.pwn import *</span><br><span class="line">import re</span><br><span class="line"></span><br><span class="line">context.log_level = &#x27;debug&#x27;</span><br><span class="line"></span><br><span class="line">class EquationSolver:</span><br><span class="line">    def __init__(self):</span><br><span class="line">        self.pattern = r&#x27;f\((\d+), (\d+)\) = (-?\d+) and f\(x, y\) = (-?\d+)\n&#x27;</span><br><span class="line">        self.conn = remote(&#x27;node4.anna.nssctf.cn&#x27;, 28634)</span><br><span class="line"></span><br><span class="line">    def solve(self, prev_x, prev_y, base_z, target_z):</span><br><span class="line">        adjusted_z = base_z - (prev_x * (prev_x - 1) // 2) + (prev_y * (prev_y - 1) // 2)</span><br><span class="line">        left_hand = 8 * (target_z - adjusted_z)</span><br><span class="line">        for factor1 in divisors(left_hand):</span><br><span class="line">            factor2 = left_hand // factor1</span><br><span class="line">            if factor1 % 2 != 0 or factor2 % 2 != 0:</span><br><span class="line">                continue</span><br><span class="line">            half_factor1 = factor1 // 2</span><br><span class="line">            half_factor2 = (factor2 + 2) // 2</span><br><span class="line">            if (half_factor1 + half_factor2) % 2 != 0:</span><br><span class="line">                continue</span><br><span class="line">            x = (half_factor1 + half_factor2) // 2</span><br><span class="line">            y = (half_factor2 - half_factor1) // 2</span><br><span class="line">            return x, y</span><br><span class="line">        raise Exception(&quot;No solution found&quot;)</span><br><span class="line"></span><br><span class="line">    def process_step(self):</span><br><span class="line">        self.conn.recvuntil(b&#x27;We know: &#x27;)</span><br><span class="line">        line = self.conn.recvline().decode()</span><br><span class="line">        match = re.match(self.pattern, line)</span><br><span class="line">        if not match:</span><br><span class="line">            raise Exception(&quot;Format error in received data&quot;)</span><br><span class="line">        prev_x, prev_y, base_z, target_z = map(int, match.groups())</span><br><span class="line">        x, y = self.solve(prev_x, prev_y, base_z, target_z)</span><br><span class="line">        self.conn.sendline(f&quot;&#123;x&#125;,&#123;y&#125;&quot;.encode())</span><br><span class="line"></span><br><span class="line">    def run(self):</span><br><span class="line">        for _ in range(20):</span><br><span class="line">            self.process_step()</span><br><span class="line">        self.conn.interactive()</span><br><span class="line"></span><br><span class="line">if __name__ == &#x27;__main__&#x27;:</span><br><span class="line">    solver = EquationSolver()</span><br><span class="line">    solver.run()    </span><br></pre></td></tr></table></figure><h2 id="Duzly"><a href="#Duzly" class="headerlink" title="Duzly$"></a>Duzly$</h2><p>题目描述：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">Duzly is a straightforward hash function design based on congruence relationships over a prime number modulus.</span><br></pre></td></tr></table></figure><p>题目：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br></pre></td><td class="code"><pre><span class="line">from Crypto.Util.number import *</span><br><span class="line">from os import urandom</span><br><span class="line">from flag import flag</span><br><span class="line"></span><br><span class="line">def pad(m):</span><br><span class="line">m += b&#x27;\x8f&#x27; * (8 - len(m) % 8)</span><br><span class="line">return m</span><br><span class="line"></span><br><span class="line">def duzly(m, C):</span><br><span class="line">ow, E = 0, [2**24 + 17, 2**24 + 3, 3, 2, 1, 0]</span><br><span class="line">for _ in range(6):</span><br><span class="line">ow += C[_] * pow(m, E[_], p)</span><br><span class="line">return ow % p</span><br><span class="line"></span><br><span class="line">def pashan(msg):</span><br><span class="line">msg = pad(msg)</span><br><span class="line">pash, msg = b&#x27;&#x27;, [msg[8*i:8*(i+1)] for i in range(len(msg) // 8)]</span><br><span class="line">for m in msg:</span><br><span class="line">_h = duzly(bytes_to_long(m), C).to_bytes(8, &#x27;big&#x27;)</span><br><span class="line">pash += _h</span><br><span class="line">return pash</span><br><span class="line"></span><br><span class="line">p = 2**64 - 59</span><br><span class="line">C = [1] + [randint(0, p) for _ in range(5)]</span><br><span class="line">flag = urandom(getRandomRange(0, 110)) + flag + urandom(getRandomRange(0, 110))</span><br><span class="line">_pash = pashan(flag)</span><br><span class="line"></span><br><span class="line">f = open(&#x27;_pash_updated&#x27;, &#x27;wb&#x27;)</span><br><span class="line">f.write(str(C).encode() + b&#x27;\n&#x27;)</span><br><span class="line">f.write(_pash)</span><br><span class="line">f.close()</span><br></pre></td></tr></table></figure><p>赛中看0解（自知之明一手）就没看，赛后一看果然没看懂<br>这里贴一下大佬的做法<a href="https://www.github.com/Sarkoxed/ctf-writeups/tree/master/cryptoctf2024/duzly_updated">这里</a></p><h2 id="Forghan"><a href="#Forghan" class="headerlink" title="Forghan*"></a>Forghan*</h2><p>题目描述：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">The Forghan, the combination of RSA and DLP cryptography, may in certain instances prove more accessible than employing either method individually.</span><br></pre></td></tr></table></figure><p>题目：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br></pre></td><td class="code"><pre><span class="line">import sys</span><br><span class="line">from Crypto.Util.number import *</span><br><span class="line">from hashlib import sha256</span><br><span class="line">from flag import flag</span><br><span class="line"></span><br><span class="line">def die(*args):</span><br><span class="line">pr(*args)</span><br><span class="line">quit()</span><br><span class="line"></span><br><span class="line">def pr(*args):</span><br><span class="line">s = &quot; &quot;.join(map(str, args))</span><br><span class="line">sys.stdout.write(s + &quot;\n&quot;)</span><br><span class="line">sys.stdout.flush()</span><br><span class="line"></span><br><span class="line">def sc():</span><br><span class="line">return sys.stdin.buffer.readline()</span><br><span class="line"></span><br><span class="line">def find_gen(p):</span><br><span class="line">while True:</span><br><span class="line">g = getRandomRange(2, p - 1)</span><br><span class="line">if pow(g, (p-1)//2 , p) != 1:</span><br><span class="line">return g</span><br><span class="line"></span><br><span class="line">def main():</span><br><span class="line">border = &quot;┃&quot;</span><br><span class="line">pr(        &quot;┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓&quot;)</span><br><span class="line">pr(border, &quot;Hi all, now it&#x27;s time to solve a strange and unusual RSA and DLP    &quot;, border)</span><br><span class="line">pr(border, &quot;challenge about encryption! Follow the questions and find the secret&quot;, border)</span><br><span class="line">pr(border, &quot;flag! :)                                                            &quot;, border)</span><br><span class="line">pr(        &quot;┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛&quot;)</span><br><span class="line">nbit, b = 256, False</span><br><span class="line">while True:</span><br><span class="line">pr(f&quot;| Options: \n|\t[G]et encrypted flag \n|\t[P]ublic parameters \n|\t[S]ubmit &#123;nbit&#125; primes \n|\t[Q]uit&quot;)</span><br><span class="line">ans = sc().decode().lower().strip()</span><br><span class="line">if ans == &#x27;g&#x27;:</span><br><span class="line">if b == True:</span><br><span class="line">l, n = len(flag), (p**2 - 1) * (q**2 - 1)</span><br><span class="line">gp, gq = find_gen(p), find_gen(q)</span><br><span class="line">sp, sq = getRandomRange(1, p), getRandomRange(1, q)</span><br><span class="line">flagp, flagq = flag[:l // 2], flag[l // 2:]</span><br><span class="line">yp, yq = pow(gp, sp, p), pow(gq, sq, q)</span><br><span class="line">cp, cq = pow(bytes_to_long(flagp), yp, n), pow(bytes_to_long(flagq), yq, n)</span><br><span class="line">pr(border, f&#x27;cp = &#123;cp&#125;&#x27;)</span><br><span class="line">pr(border, f&#x27;cq = &#123;cq&#125;&#x27;)</span><br><span class="line">else: pr(border, &#x27;Please first send your primes! :P&#x27;)</span><br><span class="line">elif ans == &#x27;s&#x27;:</span><br><span class="line">pr(border, &#x27;Send your desired prime numbers separated by comma: &#x27;)</span><br><span class="line">P = sc()</span><br><span class="line">try:</span><br><span class="line">p, q = P.split(b&#x27;,&#x27;)</span><br><span class="line">p, q = int(p), int(q)</span><br><span class="line">except: die(border, &#x27;Your input are not integer! Bye!!&#x27;)</span><br><span class="line">if p != q and isPrime(p) and isPrime(q) and p.bit_length() == q.bit_length() == nbit:</span><br><span class="line">b = True</span><br><span class="line">pr(border, &#x27;Now you can get the encrypted flag in main menu!&#x27;)</span><br><span class="line">else: die(border, &#x27;Sorry, your integers are not valid :/&#x27;)</span><br><span class="line">elif ans == &#x27;p&#x27;:</span><br><span class="line">if b == True:</span><br><span class="line">pr(border, f&#x27; gp = &#123;gp&#125;&#x27;)</span><br><span class="line">pr(border, f&#x27; gq = &#123;gq&#125;&#x27;)</span><br><span class="line">pr(border, f&#x27; yp = &#123;yp&#125;&#x27;)</span><br><span class="line">pr(border, f&#x27; yq = &#123;yq&#125;&#x27;)</span><br><span class="line">else: pr(border, &#x27;Please first send your primes! :P&#x27;)</span><br><span class="line">elif ans == &#x27;q&#x27;:</span><br><span class="line">die(border, &#x27;Quitting...&#x27;)</span><br><span class="line">else:</span><br><span class="line">die(border, &#x27;You should select valid choice!&#x27;)</span><br><span class="line"></span><br><span class="line">if __name__ == &#x27;__main__&#x27;:</span><br><span class="line">main()</span><br></pre></td></tr></table></figure><p>题目有三个选项，但是显然是有顺序的，具体来说应该按照下面来：</p><ul><li>选择”S”，输入256bit的素数p、q</li><li>选择”G”，靶机对flag进行加密，加密流程如下：<ul><li>生成n，n = (p^2 - 1) * (q^2 - 1)</li><li>分别生成p、q下的一个随机二次非剩余gp、gq</li><li>生成p、q下的随机数sp、sq</li><li>将flag分为两段，记为flagp、flagq，对应数字记为mp、mq</li><li>计算yp、yq，    $y_p = g_p^{s_p} \pmod{p}$，$y_q = g_q^{s_q} \pmod{q}$</li><li>计算密文cp、cq，$c_p = m_p^{y_p} \pmod{n}$ ,$c_q = m_q^{y_q} \pmod{n}$</li></ul></li></ul><p>选择”P”，获取gp、gq、yp、yq的值</p><p>由于有 $y_p$、$y_q$，所以这里就变成了解一个RSA的问题，由于flag是静态的，所以可以放在一个子群里去求解，放在模p-1下有：</p><script type="math/tex; mode=display">c_p = m_p^{y_p} \pmod{p-1}</script><script type="math/tex; mode=display">c_q = m_q^{y_q} \pmod{q-1}</script><p>由于p和q都是自己构造的，很容就能得到p-1的分解，就可以解RSA解出mp、mq在p-1下的值，又因为flag是静态的，所以完全可以多次交互求crt</p><p>exp:</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br></pre></td><td class="code"><pre><span class="line">from Crypto.Util.number import *</span><br><span class="line">from sympy.ntheory.modular import crt</span><br><span class="line">from pwn import *</span><br><span class="line"></span><br><span class="line">sh = remote(&quot;node4.anna.nssctf.cn&quot;, 28932)</span><br><span class="line"></span><br><span class="line">def gen_prime():</span><br><span class="line">    while True:</span><br><span class="line">        p = getPrime(255)</span><br><span class="line">        if isPrime(2*p+1):</span><br><span class="line">            return 2*p+1</span><br><span class="line"></span><br><span class="line">nums = 10</span><br><span class="line">P = [gen_prime() for i in range(nums)]</span><br><span class="line">mp = []</span><br><span class="line">mq = []</span><br><span class="line">for i in range(nums):</span><br><span class="line">    sh.sendline(b&quot;s&quot;)</span><br><span class="line">    sh.recvuntil(b&#x27;Send your desired prime numbers separated by comma: &#x27;)</span><br><span class="line">    q = getPrime(256)</span><br><span class="line">    sh.sendline((str(P[i]) + &#x27;,&#x27; + str(q)).encode())</span><br><span class="line"></span><br><span class="line">    sh.sendline(b&quot;g&quot;)</span><br><span class="line">    sh.recvuntil(b&quot;cp = &quot;)</span><br><span class="line">    cp = int(sh.recvline().strip().decode())</span><br><span class="line">    sh.recvuntil(b&quot;cq = &quot;)</span><br><span class="line">    cq = int(sh.recvline().strip().decode())</span><br><span class="line"></span><br><span class="line">    sh.sendline(b&quot;p&quot;)</span><br><span class="line">    sh.recvuntil(b&quot;gp = &quot;)</span><br><span class="line">    gp = int(sh.recvline().strip().decode())</span><br><span class="line">    sh.recvuntil(b&quot;gq = &quot;)</span><br><span class="line">    gq = int(sh.recvline().strip().decode())</span><br><span class="line">    sh.recvuntil(b&quot;yp = &quot;)</span><br><span class="line">    yp = int(sh.recvline().strip().decode())</span><br><span class="line">    sh.recvuntil(b&quot;yq = &quot;)</span><br><span class="line">    yq = int(sh.recvline().strip().decode())</span><br><span class="line"></span><br><span class="line">    k = (P[i] - 1) // 2</span><br><span class="line">    mp.append(pow(cp, inverse(yp, k - 1), P[i]))</span><br><span class="line">    mq.append(pow(cq, inverse(yq, k - 1), P[i]))</span><br><span class="line"></span><br><span class="line">Mp = crt(P, mp)[0]</span><br><span class="line">Mq = crt(P, mq)[0]</span><br><span class="line"></span><br><span class="line">print(long_to_bytes(Mp))</span><br><span class="line">print(long_to_bytes(Mq))</span><br></pre></td></tr></table></figure><h2 id="Honey"><a href="#Honey" class="headerlink" title="Honey"></a>Honey</h2><p>题目描述：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">Honey is a concealed cryptographic algorithm designed to provide secure encryption for sensitive messages.</span><br></pre></td></tr></table></figure><p>题目：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br></pre></td><td class="code"><pre><span class="line">from Crypto.Util.number import *</span><br><span class="line">from math import sqrt</span><br><span class="line">from flag import flag</span><br><span class="line"></span><br><span class="line">def gen_params(nbit):</span><br><span class="line">p, Q, R, S = getPrime(nbit), [], [], []</span><br><span class="line">d = int(sqrt(nbit &lt;&lt; 1))</span><br><span class="line">for _ in range(d):</span><br><span class="line">Q.append(getRandomRange(1, p - 1))</span><br><span class="line">R.append(getRandomRange(0, p - 1))</span><br><span class="line">S.append(getRandomRange(0, p - 1))</span><br><span class="line">return p, Q, R, S</span><br><span class="line"></span><br><span class="line">def encrypt(m, params):</span><br><span class="line">p, Q, R, S = params</span><br><span class="line">assert m &lt; p</span><br><span class="line">d = int(sqrt(p.bit_length() &lt;&lt; 1))</span><br><span class="line">C = []</span><br><span class="line">for _ in range(d):</span><br><span class="line">r, s = [getRandomNBitInteger(d) for _ in &#x27;01&#x27;]</span><br><span class="line">c = Q[_] * m + r * R[_] + s * S[_]</span><br><span class="line">C.append(c % p)</span><br><span class="line">return C</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">nbit = 512</span><br><span class="line">params = gen_params(512)</span><br><span class="line">m = bytes_to_long(flag)</span><br><span class="line">C = encrypt(m, params)</span><br><span class="line">f = open(&#x27;params_enc.txt&#x27;, &#x27;w&#x27;)</span><br><span class="line">f.write(f&#x27;p = &#123;params[0]&#125;\n&#x27;)</span><br><span class="line">f.write(f&#x27;Q = &#123;params[1]&#125;\n&#x27;)</span><br><span class="line">f.write(f&#x27;R = &#123;params[2]&#125;\n&#x27;)</span><br><span class="line">f.write(f&#x27;S = &#123;params[3]&#125;\n&#x27;)</span><br><span class="line">f.write(f&#x27;C = &#123;C&#125;&#x27;)</span><br><span class="line">f.close()</span><br></pre></td></tr></table></figure><p>params_enc.txt：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">p = 10580731215444436219213907263947534038012197972307836319229421193761088798378768844649759133142120180834573817149711299466707823017636232456526471274387917</span><br><span class="line">Q = [6718668664591596190749745980002066645380242844394957953766947533978323053938214647829798301606252456858132121628517723050462291300790766055200866765561610, 8738840830394886495658505803088103824478963010774845789433253508554356383249611502157307334585157729703873877797759121271071421201959116272886732798936523, 4388762712805764363921857352899834586382140923234814556069490536704913653848525595836491615636446563386705915348021173847271741862809075809151508973332816, 3663706247989213864330218414789109172658418861584264092087052781618522795676355371739296186667918464732397854703792563460353675590182379535358561615166754, 10397730940373180549512945920847346184926672474430866208628825035104473525758952069910968144296138220861205803231072660136999110567752870928953292888013817, 7950983396364741732874562189206547723862955251595526752956177377987683115942827501152009639962778147887569469649852864894630521759276627026901168996371682, 4533165373271154956275563812280832107592547920299130443910706773435844651231402604986107252454770256826684895729900344877444002682896222483157835711226276, 234527648838985018479849393379369972316648524004050156622962478277970628212208049885578895953447529009579881605066831810617219492342569126524704457098602, 870946394610707169333783318085559836426827503011955242395779894700298192587685130680102208909573921059078858816359885827349281892186755920839352494224983, 5025393101560564396356619431938053414422489109406396725377683594254768077793838379117179092536396259414266971990125716674162127500490058572594571364978294, 5914192169617888877888201158713062853387719050723973971874176184801960297380845845091259990664210178355882621876155306106794686897854891414999449337977781, 2315609284318723939818174971181608382568372323836754133265010413836452399043354382657889810068171230196496294710150903020084150025606782486579490225752163, 7278167622527482910919537896950398911672667355929695202886784227621290914468002099686668156909569183497765732237075799745632960354306268680765408194219074, 3334584846711780119716613440720851482199838919351927489954344426327712973616885459737471991960238971274273643566666607141850753561424427088261862873317161, 10418397794302836806813296591826255845845380563102199636140458670781241436466478273414138749593148481207713557016996462238845705251702717702279222414513227, 8928267741189301140931758366885435860144549752680480164627323600501278650103818630920534258909582593266779000356145650416276415560226176904904552964196921, 3371514716248416335324237152123624115597170761078576760713238311485522010416246207731778456501311675041827750001670698984335573888627309609534659722697174, 3802217515688979225517388823688564230191961273039428065604146662684362686419670392762755984078261072614619934671572327384351597903233780846163893180876244, 2363399549320749312563257796730356164186914867645487733176402567625567991193120859507532138374793392237469893062402307645814490930874653088116729203724851, 10221767730316631512882371487958453352895713655492241322139865275323706929127996334620105099751973217983332705204535216804829987329684674632121801754529472, 2309440702968799222696132507585555901684240893289264193546892279919675495689944211715270510347394465285317239758024734161176699837687742722383530547735726, 5768185970426887633783322939933762164095055854707759575404348181421158843802654199133776622565384843677610666356549368021172121302926969754865633752131083, 3229518654067354667224244723968136366109210341994628338992752927462431316675552817799465987425719486448276862390918033544772400219803600904202906882850710, 9261930571620802581580992489567043178258044978932724785185749415955521702331959591680386023118398455066896674799447994060060156036800986190467008880726445, 2202162000802916921896507108984564185119471354726317829850206292755815439071735424116041491064894922930900262540589602333676063925873357256494020426758849, 1449198886322850923273373987785167865779477069790726992542423846556138762913056524689998313112599261515223680429584445016474216381861998363527368722991846, 8372052560034461177472546395510480308837387803551378399004608402463282066003862653368875671946863748209051044725913651881213858335224750549176875818647614, 1554572177534183877889322947083536921680809086638640689433294150868422460719624621258231995856944045776876555664816113444481761122803489100212103150005950, 10304720995101153898600333216365877709018991122985401884049110267116778080162237155472336396606109372189653686733770775660895990549286854727042270667997449, 9702831715765050072649082617719386580543641764650576307262259428035281535816750758018451681417440458250169771442858047124693499821240155899358663466925522, 4983986466837077050816175727911146971276599399191126236666755181304580074902883995859030897874305902445659355326021836801836996577665092276845357389900055, 983210432268706135181772492997088637756153310076409721616450343187239073604891492532080986521255675448499887782529162112441952861587689660048849369850769]</span><br><span class="line">R = [8922553268219903948421811612403588317187402276064169063400419617931637566221670948925221403527928336656976084021780421068421112325215152715630319708159148, 1960697234007608888633325436691320507012497445090151112947144246088597317322303593936974554881161091213718329061011703885436579261559669838148253146762736, 5876944865176517279136475269375710514719489457672467542904948332791352244229042691977616905122711469012731652511966060550749288338599104284986451669586397, 10560136356360422684127995001096871178761635291417665630629868184624616925939841693017240341233504589896610287855672892399213367967385666891688408976236926, 477096251733995832965266836067676961413182629438628989729801411920869543083075545758386996801847267554704996660190900105380190625423846876906822024677634, 7001514955678391252130680521301315254365131738168087539892724691183104608345983375763663321467662055864103520121513349630333839818372656472731157470876337, 3894488356665934776074291789545516608573077899099880057920210752197885106521699021123658077208789295954145485399473386424677782787720074605813565437678385, 6084641463140385894120457093933350076091808742065950836200598466936433741373700151235571333073965513559605688011967994215074945374832957951384088589789549, 6429023674027239778212676334778900557043774851747196071499704016422574667955121145943674677254291410204037372996870181094090300709994594837656541352954321, 974464046378184190666336249935678253753198649184272269465353741281529523364289314148552833155935080422698020734516538377662137879089845095565536185765703, 5275384626572520577089146723078373110279682903874445477027602487061203157331398955233780208890725281673434536867800450553737656852356536771518379108118530, 7195767683001605593626199889963767438584070902169912442665828755648712278523740276132000225353756257232761885567134364203207306842108602537457408438487869, 1960155276835684836483043402384876176138942980630724993481564836712252228823186653467973806509964860286129730847244573674203959835565358735171611743573721, 6414607819273473402861616605113355396690170400984793217629732347141796693554056264547151212348354332930126795040213921009711560216969452391748438893237750, 3344964019305423035551401397282638905496921053458747459062023331678484337724980196690184898986671355848101101352105363764794975082772539709853216580762130, 5599385562588302350377616767130563945375472947459594912838322011021483641484084692396462025157944023828872267520122213089523093591160284337483108416804096, 9490045098551912983475126253859124028793327975874647810947095579199208473971726763051464010595903748080632329362605820021188148160826282120484098519748832, 980400922804123638777377509067942595214234592161404114303498013065244168965487370334832921426484278913774963761155003569793282819717667783351454812080994, 2772369382727364487748752144766350276094463435156818133766210304998890765120785013435379746537938377688617479112518505844159436213691418873590807740501183, 2338271137215119073302625621754099128003710500967811947590498668688826448575898279561111743087002717955161536157254689000474464404087443266193145449601031, 11773104862539842923315548180471993854469651503131148446111338098437913152663007837927793233931818835121946274135336436554801339749906320765919816150768, 7022131435585860015767289025786078578929344550873832550705723505006303288639135070849692494020122369694090619694760175970759059981608871097298624956669246, 9062158671807923729547552523768819638817707994079942965412925347441853183471973898478745711676153003756450481351777543455041815438536630317647408008349357, 641428039466528875429106458292463262780539744201857515833377175893334510962304373010401729801987725599439620073783868719664061882399367340158128062151780, 9636846145225909579086917154824161374486916920345217833190333031690359415616710658317308376119096253360425924297858397657697468296746934075225665559206030, 480796179229094678008918831581475398488769027287954488301969143979307355466114726392701279092691566949082439457297527772794149828193400419285116237063338, 7726757640854263742178678415761753342099387727318458723726925176786999799204056696883433346568600944559959849253863013300907357120126559055735593380638961, 551534415366550033034654093228329954588738781407008585088422737955391043381667720876717529438845777841508116853874405455280903517864352822604194884203656, 2135598634800053933515509095633720732412542790075717247869348997292949946344227105219967710854885153055617943193159899627517699960920415492992774438014041, 1680242449902645450228202409049382139482100876672724104665964994414865664877710770701122475977142858601068246748276652246938681740022531970523695731126206, 436320498659370791836085607479390848415464961245449366885835640616716752879866126057724425537944356751844317980881005608075886211154052092270888058429787, 4102523817041969170017113001399252035243358293719837916039521471412151711746047572340376418109842112515873700164747338421862615679590520014959369523777063]</span><br><span class="line">S = [4389820170235953517860364281419052587762385444517203945856665517072263529411621622474249480804818285716662154444854074939122170918939074730520091008754679, 10274488321950407401790238304858775303749809597573328350457719402010568443492374388509295355784873292280254116167747959663379913408799485392015111636115272, 7413556897779783875511997253964328306011661062497568739340607424890313315434489440969977560260194970241163209968988660276109536299848001455072705137702052, 10385679419514177727801069016719283683697529805734389950368725106396939072509839502286093730172215158898251533786500497578747904349856564856054102927847131, 6386209810414906928429352824399745808560059492214757951425372272591372428785367326567204502131184260857447725722068674542931096991341451850846209503213310, 699060860182347708294712482476262878008951502586470987307146194685783850677219935862211847525612405824474382122868643521962157410369483858428437433802395, 3482063900392942412450041046839813864192488604261419419162091087116878838189062406913587662602295096636481252242577251563441565388543873530900962308450590, 5752782775722534186844731777766684686828626762801341093006843547008915880093927377014105260314050196609699164926717998841388194942556402699285523644651583, 4477944786670422304592908174461368396168580171651041832449759231077050962444090886920563302603784981035116689839335069690875797644553684152368376089740517, 5663531682848751034979876476955107364567717396957230368140915480695954150088052156264521615690161327525898382714131905580517915060427960250740110846321921, 5343294510843224726960051115907810365241970373986845465490090821566645536683695042467985025063439338770116316455211944030125820601506874250685838077414765, 8432688027895892738831218358369397874948328355540048945541749304849571948638169902486647265119397307193449002927427840453857643697175667051504836511635801, 8974418251288081645329898313903422373193272601106837017923535786950979222125740970411725976034947989767143786286397290996756916960291029965672692318584390, 3367471493907450997862234076499110882206518716388236141312548251406626961838619595519805436447472248133422979102036617759221276869918910189482246041609756, 9787518698663334219763616437865759554315749369906898604904977007297368987715422535407542350049111845605011307829034744443271718643291528381794716569586150, 7423298611637442306439453382713995476685370148677494272333567929180589186347708172471032286209947149761644993151042408431548488945145292037694546868884030, 5591656321514817104832226351286824953278894430528912246855770091334337189386156994498331013600732669813560603667226878637404391237947398475280409452591013, 6425108527382412819259579180312607504985609322110590326058191420486308943785080395001318724782575187718535133704219706236946232717333616646838328259100174, 1986072520726417425427679478185786673218113837249425820170849864471171328875606626923270664642579676457285438864056080352157246995774517812392120146048999, 5085759490547346080963649291763871068034757573012867868532204864022791365366745839456310985148663327808561601274994541505734129506831803550600738607170703, 6883330982174382523423400136207766091739299571009207949454774998664997037115272990237878573502506026799645646664956134682833693219974019271740996314084220, 3008412285222633004812698063455902388460013611944185187747762649311442328686187279186972723448077521425052318221865300502697494418867793831761784796146329, 9547325670583212399117684599284936334790443591395268814958834705867928621240882386996085347052830889322724160452729359284992294890584292625829913315628265, 1387461799657365419593288084566026147529011675413652640829187706708872066267641962620159408303872024421411747751690792902149761832079721583778430712988299, 2093635222672050417361673475374966389314266702410603863643637918543784930893405832179904330416148995313591588929177333026382745340633946128791737631559286, 8413424329301946557805781268429552577339778139904799140486659388945506980343653897206690153402822892272378378085908749995513711021119914769801970795906117, 6743445162380434316634371637355512041805280159276931422012464596435558338432827675791139455542184532473287436049595748235961499758716697674776760822162391, 1706184129470213725753097073154985919221181897433450716898208607625832464228411992900434982560203334218404626447424408012817411257665032706434306723906871, 1188503046129710474378492502021666062040985983530761819828342979325166292485440608536173516789179154601587903599847267180858095017007891547798890802090080, 6398862094282462456834873185064362330936738060688527379705123125559724680574585721467123968313071365176318010618981170019917278363707049487278610027058585, 1827205671808118170959457466922915851906256049105694256301380823860317738339383848734269783842511423911532135506082729000044271560428423457063013176002958, 4296939764995860347968082436772567300063081379392577066061720737920992283479200350022263164173968370055486217109628430523063986426005741344085155171587948]</span><br><span class="line">C = [2312453804397990204892582347458673184184584053391181580849656202381982276483135032773767708029907426388840618138608941250788745829088238589339462137662516, 10523194306636352419831471584744199603299973937259007033119401866043123235256118686290774285411893111835433604432082195914308420845569896693674208644701928, 8625321422409900297730698589684636810222608572364004227411854906715574297306124060030713845833976664653817196364988412308992879167741430256046508164902265, 2203036357494864574281685606458518951592160562338358743010726696365683441724958156704554110208947394458113054047499157258753175446414976136008162642109757, 7440676439428237992864596387460092947449968530635365999432104198675297081825315672568959667296286389774687367936168132053293001589687795737604457160906082, 2264157050840270501520646271743213633490605461967539030408028006097728678459599299655371587125945029431528702214373899493252891890106222569122603386717360, 6089828885562252420652081197249651438359320954630388805129416420415135298321118452771481678140904854945253504361325478946359729157231808943846058944117026, 10539688120079451218718476929576210805778407047878263373562960368159158621424931104363627052374700437454925765616146962059684388174993415278124860987310938, 6303692164422236243124789748609418445914012315334563733630138248326249660310698584154622748275297380026916444293448955157206727703202478794453250926439643, 881942845076614931271891025655927553295291244201690295230440723375006916146507322259936249039275621554840488955637696630030022348109669072833863866985225, 10106348190249831893088197931090851286229747534150777530156601113972916238286905365616240501204440809598108220364456446320022747806334510176621958436096123, 8324531392881516178541244041903222514911964835924579628962940318936570586739198442236357026438613345385230182029810965182157993322744038688573053225547374, 5078708553426349749719952343873018594648548601008242439539543130067536764970709366523519348572603124221309659983256536103306454063139670063244331611755453, 8542547993117228744822361667182819410791296436924016725757178153507707272004493213120780743910507865839367749205817741703451968423781285521621014600059589, 3073352723766074586873446203285051955281142348730058300259816322651361605792426446390729367386148254808552616968786890277451301146248756651016086606742804, 5269945451683706496607356863109615383647000556701922770404180133092195426319754674753614204346587769298246334991876508268642550219392732660290378353338400, 6262348731181694593163187372863680743743096474259867989757989072530511417286900866334036812204673457159090130621478933266270029789176903023636735673595513, 3297899863181037954379261853482229450757449782777910450819629975965660022355584717412057615899333569245281976118829898854119850433763380827003244277020101, 7487260566995972228255217362172107520309457024141075543923988636564806307827017535285595701845830793533604534902349660541692391232785351590333159515799384, 10324279404125558600858330541468243667961239247663241031255287540601841176203292036413076990028875224629890818418992943759206077129550049357885152924273782, 8044925106089251438446731137002808317322635126054485149617494154471416674741758172633019611642437845768869330746423337854351186668227486117398013073824286, 4234270952814400783009242730655483882561531800274439758860142245952005010632014464198770218689605527760730047723966950012227395838571254801244673898812828, 638896609043108497262778277770178050665854883307447937008504779907661322405672174519391657570064336725509768185637608044022219246206471015980252602095129, 5180216795602211214280366461349507739255238657924206736673167715462995927060334503420979145327254053283011116720223275075476559911219732336496503542596869, 4889582376915206124736222022750168286228699065224704085027955184917144323557844593386817223260498520607466742269645929630472738644444652704289510157100913, 5012604326308554636339480431591200785633930724891396744558818436357664982175033998281443810436271724799610836412819040278374041390604150781759163613994682, 3219038638665180576932584279254771209098300305384572525709292133614238552451580810601286362213655499134538083785424726484119059950676285763438331520089227, 6419694420004223063062285264931096360778228156157853232796125041025067958687740255716444718822744614217377927689465894996156144384079594697465808095114901, 9910546009146267464166501179537825349776178695164070160517872596078275117785713000045215455672195660329319962408970209137481672915542900445933477806115760, 1420603945244588398788478464408905133932325733716125030735921688979482121297328679317495694245547716568441401137633433150951713462958551532394178628021900, 6208847506587273852328049116772424002595270959861992270025537759079430511161476024600259347318966551584005222005704567718008394909230998308545154993159673, 10385926333158107236552504228168776101396372491461292301486697050842973861408756486936932908479675556344542947425765714101814836237112561730341100901890350]</span><br></pre></td></tr></table></figure><p>题目给了d组如下等式：</p><script type="math/tex; mode=display">c_i = Q_im + r_iR_i + s_iS_i\quad (\text{mod } p)</script><p>c、Q、R、S均已知，要求还原m。同时，每次的$r_i$、$s_i$都是d bit的数，p是512bit。</p><p>由列表长度可以知道d就是32，所以r、s都是很小的量，因此自然想到消去m做一个HNP。取第0组和第1组的等式统一$m$$的系数然后做差即可:</p><script type="math/tex; mode=display">c_0 = Q_0m + r_0R_0 + s_0S_0\quad (\text{mod } p)</script><script type="math/tex; mode=display">c_i = Q_im + r_iR_i + s_iS_i\quad (\text{mod } p)</script><script type="math/tex; mode=display">Q_ic_0 = Q_iQ_0m + r_0Q_iR_0 + s_0Q_iS_0\quad (\text{mod } p)</script><script type="math/tex; mode=display">Q_0c_i = Q_0Q_im + r_iQ_0R_i + s_iQ_0S_i\quad (\text{mod } p)</script><p>到这就消去了m，造个格子求一下u和v即可, 这里由于u和v太小了所以一组就能求出来，正常需要多组才会准确。</p><p>exp:</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br></pre></td><td class="code"><pre><span class="line">#sage</span><br><span class="line"></span><br><span class="line">from Crypto.Util.number import *</span><br><span class="line">from math import sqrt</span><br><span class="line"></span><br><span class="line">d = int(sqrt(512 &lt;&lt; 1))</span><br><span class="line">p = 10580731215444436219213907263947534038012197972307836319229421193761088798378768844649759133142120180834573817149711299466707823017636232456526471274387917</span><br><span class="line">Q = [6718668664591596190749745980002066645380242844394957953766947533978323053938214647829798301606252456858132121628517723050462291300790766055200866765561610, 8738840830394886495658505803088103824478963010774845789433253508554356383249611502157307334585157729703873877797759121271071421201959116272886732798936523, 4388762712805764363921857352899834586382140923234814556069490536704913653848525595836491615636446563386705915348021173847271741862809075809151508973332816, 3663706247989213864330218414789109172658418861584264092087052781618522795676355371739296186667918464732397854703792563460353675590182379535358561615166754, 10397730940373180549512945920847346184926672474430866208628825035104473525758952069910968144296138220861205803231072660136999110567752870928953292888013817, 7950983396364741732874562189206547723862955251595526752956177377987683115942827501152009639962778147887569469649852864894630521759276627026901168996371682, 4533165373271154956275563812280832107592547920299130443910706773435844651231402604986107252454770256826684895729900344877444002682896222483157835711226276, 234527648838985018479849393379369972316648524004050156622962478277970628212208049885578895953447529009579881605066831810617219492342569126524704457098602, 870946394610707169333783318085559836426827503011955242395779894700298192587685130680102208909573921059078858816359885827349281892186755920839352494224983, 5025393101560564396356619431938053414422489109406396725377683594254768077793838379117179092536396259414266971990125716674162127500490058572594571364978294, 5914192169617888877888201158713062853387719050723973971874176184801960297380845845091259990664210178355882621876155306106794686897854891414999449337977781, 2315609284318723939818174971181608382568372323836754133265010413836452399043354382657889810068171230196496294710150903020084150025606782486579490225752163, 7278167622527482910919537896950398911672667355929695202886784227621290914468002099686668156909569183497765732237075799745632960354306268680765408194219074, 3334584846711780119716613440720851482199838919351927489954344426327712973616885459737471991960238971274273643566666607141850753561424427088261862873317161, 10418397794302836806813296591826255845845380563102199636140458670781241436466478273414138749593148481207713557016996462238845705251702717702279222414513227, 8928267741189301140931758366885435860144549752680480164627323600501278650103818630920534258909582593266779000356145650416276415560226176904904552964196921, 3371514716248416335324237152123624115597170761078576760713238311485522010416246207731778456501311675041827750001670698984335573888627309609534659722697174, 3802217515688979225517388823688564230191961273039428065604146662684362686419670392762755984078261072614619934671572327384351597903233780846163893180876244, 2363399549320749312563257796730356164186914867645487733176402567625567991193120859507532138374793392237469893062402307645814490930874653088116729203724851, 10221767730316631512882371487958453352895713655492241322139865275323706929127996334620105099751973217983332705204535216804829987329684674632121801754529472, 2309440702968799222696132507585555901684240893289264193546892279919675495689944211715270510347394465285317239758024734161176699837687742722383530547735726, 5768185970426887633783322939933762164095055854707759575404348181421158843802654199133776622565384843677610666356549368021172121302926969754865633752131083, 3229518654067354667224244723968136366109210341994628338992752927462431316675552817799465987425719486448276862390918033544772400219803600904202906882850710, 9261930571620802581580992489567043178258044978932724785185749415955521702331959591680386023118398455066896674799447994060060156036800986190467008880726445, 2202162000802916921896507108984564185119471354726317829850206292755815439071735424116041491064894922930900262540589602333676063925873357256494020426758849, 1449198886322850923273373987785167865779477069790726992542423846556138762913056524689998313112599261515223680429584445016474216381861998363527368722991846, 8372052560034461177472546395510480308837387803551378399004608402463282066003862653368875671946863748209051044725913651881213858335224750549176875818647614, 1554572177534183877889322947083536921680809086638640689433294150868422460719624621258231995856944045776876555664816113444481761122803489100212103150005950, 10304720995101153898600333216365877709018991122985401884049110267116778080162237155472336396606109372189653686733770775660895990549286854727042270667997449, 9702831715765050072649082617719386580543641764650576307262259428035281535816750758018451681417440458250169771442858047124693499821240155899358663466925522, 4983986466837077050816175727911146971276599399191126236666755181304580074902883995859030897874305902445659355326021836801836996577665092276845357389900055, 983210432268706135181772492997088637756153310076409721616450343187239073604891492532080986521255675448499887782529162112441952861587689660048849369850769]</span><br><span class="line">R = [8922553268219903948421811612403588317187402276064169063400419617931637566221670948925221403527928336656976084021780421068421112325215152715630319708159148, 1960697234007608888633325436691320507012497445090151112947144246088597317322303593936974554881161091213718329061011703885436579261559669838148253146762736, 5876944865176517279136475269375710514719489457672467542904948332791352244229042691977616905122711469012731652511966060550749288338599104284986451669586397, 10560136356360422684127995001096871178761635291417665630629868184624616925939841693017240341233504589896610287855672892399213367967385666891688408976236926, 477096251733995832965266836067676961413182629438628989729801411920869543083075545758386996801847267554704996660190900105380190625423846876906822024677634, 7001514955678391252130680521301315254365131738168087539892724691183104608345983375763663321467662055864103520121513349630333839818372656472731157470876337, 3894488356665934776074291789545516608573077899099880057920210752197885106521699021123658077208789295954145485399473386424677782787720074605813565437678385, 6084641463140385894120457093933350076091808742065950836200598466936433741373700151235571333073965513559605688011967994215074945374832957951384088589789549, 6429023674027239778212676334778900557043774851747196071499704016422574667955121145943674677254291410204037372996870181094090300709994594837656541352954321, 974464046378184190666336249935678253753198649184272269465353741281529523364289314148552833155935080422698020734516538377662137879089845095565536185765703, 5275384626572520577089146723078373110279682903874445477027602487061203157331398955233780208890725281673434536867800450553737656852356536771518379108118530, 7195767683001605593626199889963767438584070902169912442665828755648712278523740276132000225353756257232761885567134364203207306842108602537457408438487869, 1960155276835684836483043402384876176138942980630724993481564836712252228823186653467973806509964860286129730847244573674203959835565358735171611743573721, 6414607819273473402861616605113355396690170400984793217629732347141796693554056264547151212348354332930126795040213921009711560216969452391748438893237750, 3344964019305423035551401397282638905496921053458747459062023331678484337724980196690184898986671355848101101352105363764794975082772539709853216580762130, 5599385562588302350377616767130563945375472947459594912838322011021483641484084692396462025157944023828872267520122213089523093591160284337483108416804096, 9490045098551912983475126253859124028793327975874647810947095579199208473971726763051464010595903748080632329362605820021188148160826282120484098519748832, 980400922804123638777377509067942595214234592161404114303498013065244168965487370334832921426484278913774963761155003569793282819717667783351454812080994, 2772369382727364487748752144766350276094463435156818133766210304998890765120785013435379746537938377688617479112518505844159436213691418873590807740501183, 2338271137215119073302625621754099128003710500967811947590498668688826448575898279561111743087002717955161536157254689000474464404087443266193145449601031, 11773104862539842923315548180471993854469651503131148446111338098437913152663007837927793233931818835121946274135336436554801339749906320765919816150768, 7022131435585860015767289025786078578929344550873832550705723505006303288639135070849692494020122369694090619694760175970759059981608871097298624956669246, 9062158671807923729547552523768819638817707994079942965412925347441853183471973898478745711676153003756450481351777543455041815438536630317647408008349357, 641428039466528875429106458292463262780539744201857515833377175893334510962304373010401729801987725599439620073783868719664061882399367340158128062151780, 9636846145225909579086917154824161374486916920345217833190333031690359415616710658317308376119096253360425924297858397657697468296746934075225665559206030, 480796179229094678008918831581475398488769027287954488301969143979307355466114726392701279092691566949082439457297527772794149828193400419285116237063338, 7726757640854263742178678415761753342099387727318458723726925176786999799204056696883433346568600944559959849253863013300907357120126559055735593380638961, 551534415366550033034654093228329954588738781407008585088422737955391043381667720876717529438845777841508116853874405455280903517864352822604194884203656, 2135598634800053933515509095633720732412542790075717247869348997292949946344227105219967710854885153055617943193159899627517699960920415492992774438014041, 1680242449902645450228202409049382139482100876672724104665964994414865664877710770701122475977142858601068246748276652246938681740022531970523695731126206, 436320498659370791836085607479390848415464961245449366885835640616716752879866126057724425537944356751844317980881005608075886211154052092270888058429787, 4102523817041969170017113001399252035243358293719837916039521471412151711746047572340376418109842112515873700164747338421862615679590520014959369523777063]</span><br><span class="line">S = [4389820170235953517860364281419052587762385444517203945856665517072263529411621622474249480804818285716662154444854074939122170918939074730520091008754679, 10274488321950407401790238304858775303749809597573328350457719402010568443492374388509295355784873292280254116167747959663379913408799485392015111636115272, 7413556897779783875511997253964328306011661062497568739340607424890313315434489440969977560260194970241163209968988660276109536299848001455072705137702052, 10385679419514177727801069016719283683697529805734389950368725106396939072509839502286093730172215158898251533786500497578747904349856564856054102927847131, 6386209810414906928429352824399745808560059492214757951425372272591372428785367326567204502131184260857447725722068674542931096991341451850846209503213310, 699060860182347708294712482476262878008951502586470987307146194685783850677219935862211847525612405824474382122868643521962157410369483858428437433802395, 3482063900392942412450041046839813864192488604261419419162091087116878838189062406913587662602295096636481252242577251563441565388543873530900962308450590, 5752782775722534186844731777766684686828626762801341093006843547008915880093927377014105260314050196609699164926717998841388194942556402699285523644651583, 4477944786670422304592908174461368396168580171651041832449759231077050962444090886920563302603784981035116689839335069690875797644553684152368376089740517, 5663531682848751034979876476955107364567717396957230368140915480695954150088052156264521615690161327525898382714131905580517915060427960250740110846321921, 5343294510843224726960051115907810365241970373986845465490090821566645536683695042467985025063439338770116316455211944030125820601506874250685838077414765, 8432688027895892738831218358369397874948328355540048945541749304849571948638169902486647265119397307193449002927427840453857643697175667051504836511635801, 8974418251288081645329898313903422373193272601106837017923535786950979222125740970411725976034947989767143786286397290996756916960291029965672692318584390, 3367471493907450997862234076499110882206518716388236141312548251406626961838619595519805436447472248133422979102036617759221276869918910189482246041609756, 9787518698663334219763616437865759554315749369906898604904977007297368987715422535407542350049111845605011307829034744443271718643291528381794716569586150, 7423298611637442306439453382713995476685370148677494272333567929180589186347708172471032286209947149761644993151042408431548488945145292037694546868884030, 5591656321514817104832226351286824953278894430528912246855770091334337189386156994498331013600732669813560603667226878637404391237947398475280409452591013, 6425108527382412819259579180312607504985609322110590326058191420486308943785080395001318724782575187718535133704219706236946232717333616646838328259100174, 1986072520726417425427679478185786673218113837249425820170849864471171328875606626923270664642579676457285438864056080352157246995774517812392120146048999, 5085759490547346080963649291763871068034757573012867868532204864022791365366745839456310985148663327808561601274994541505734129506831803550600738607170703, 6883330982174382523423400136207766091739299571009207949454774998664997037115272990237878573502506026799645646664956134682833693219974019271740996314084220, 3008412285222633004812698063455902388460013611944185187747762649311442328686187279186972723448077521425052318221865300502697494418867793831761784796146329, 9547325670583212399117684599284936334790443591395268814958834705867928621240882386996085347052830889322724160452729359284992294890584292625829913315628265, 1387461799657365419593288084566026147529011675413652640829187706708872066267641962620159408303872024421411747751690792902149761832079721583778430712988299, 2093635222672050417361673475374966389314266702410603863643637918543784930893405832179904330416148995313591588929177333026382745340633946128791737631559286, 8413424329301946557805781268429552577339778139904799140486659388945506980343653897206690153402822892272378378085908749995513711021119914769801970795906117, 6743445162380434316634371637355512041805280159276931422012464596435558338432827675791139455542184532473287436049595748235961499758716697674776760822162391, 1706184129470213725753097073154985919221181897433450716898208607625832464228411992900434982560203334218404626447424408012817411257665032706434306723906871, 1188503046129710474378492502021666062040985983530761819828342979325166292485440608536173516789179154601587903599847267180858095017007891547798890802090080, 6398862094282462456834873185064362330936738060688527379705123125559724680574585721467123968313071365176318010618981170019917278363707049487278610027058585, 1827205671808118170959457466922915851906256049105694256301380823860317738339383848734269783842511423911532135506082729000044271560428423457063013176002958, 4296939764995860347968082436772567300063081379392577066061720737920992283479200350022263164173968370055486217109628430523063986426005741344085155171587948]</span><br><span class="line">C = [2312453804397990204892582347458673184184584053391181580849656202381982276483135032773767708029907426388840618138608941250788745829088238589339462137662516, 10523194306636352419831471584744199603299973937259007033119401866043123235256118686290774285411893111835433604432082195914308420845569896693674208644701928, 8625321422409900297730698589684636810222608572364004227411854906715574297306124060030713845833976664653817196364988412308992879167741430256046508164902265, 2203036357494864574281685606458518951592160562338358743010726696365683441724958156704554110208947394458113054047499157258753175446414976136008162642109757, 7440676439428237992864596387460092947449968530635365999432104198675297081825315672568959667296286389774687367936168132053293001589687795737604457160906082, 2264157050840270501520646271743213633490605461967539030408028006097728678459599299655371587125945029431528702214373899493252891890106222569122603386717360, 6089828885562252420652081197249651438359320954630388805129416420415135298321118452771481678140904854945253504361325478946359729157231808943846058944117026, 10539688120079451218718476929576210805778407047878263373562960368159158621424931104363627052374700437454925765616146962059684388174993415278124860987310938, 6303692164422236243124789748609418445914012315334563733630138248326249660310698584154622748275297380026916444293448955157206727703202478794453250926439643, 881942845076614931271891025655927553295291244201690295230440723375006916146507322259936249039275621554840488955637696630030022348109669072833863866985225, 10106348190249831893088197931090851286229747534150777530156601113972916238286905365616240501204440809598108220364456446320022747806334510176621958436096123, 8324531392881516178541244041903222514911964835924579628962940318936570586739198442236357026438613345385230182029810965182157993322744038688573053225547374, 5078708553426349749719952343873018594648548601008242439539543130067536764970709366523519348572603124221309659983256536103306454063139670063244331611755453, 8542547993117228744822361667182819410791296436924016725757178153507707272004493213120780743910507865839367749205817741703451968423781285521621014600059589, 3073352723766074586873446203285051955281142348730058300259816322651361605792426446390729367386148254808552616968786890277451301146248756651016086606742804, 5269945451683706496607356863109615383647000556701922770404180133092195426319754674753614204346587769298246334991876508268642550219392732660290378353338400, 6262348731181694593163187372863680743743096474259867989757989072530511417286900866334036812204673457159090130621478933266270029789176903023636735673595513, 3297899863181037954379261853482229450757449782777910450819629975965660022355584717412057615899333569245281976118829898854119850433763380827003244277020101, 7487260566995972228255217362172107520309457024141075543923988636564806307827017535285595701845830793533604534902349660541692391232785351590333159515799384, 10324279404125558600858330541468243667961239247663241031255287540601841176203292036413076990028875224629890818418992943759206077129550049357885152924273782, 8044925106089251438446731137002808317322635126054485149617494154471416674741758172633019611642437845768869330746423337854351186668227486117398013073824286, 4234270952814400783009242730655483882561531800274439758860142245952005010632014464198770218689605527760730047723966950012227395838571254801244673898812828, 638896609043108497262778277770178050665854883307447937008504779907661322405672174519391657570064336725509768185637608044022219246206471015980252602095129, 5180216795602211214280366461349507739255238657924206736673167715462995927060334503420979145327254053283011116720223275075476559911219732336496503542596869, 4889582376915206124736222022750168286228699065224704085027955184917144323557844593386817223260498520607466742269645929630472738644444652704289510157100913, 5012604326308554636339480431591200785633930724891396744558818436357664982175033998281443810436271724799610836412819040278374041390604150781759163613994682, 3219038638665180576932584279254771209098300305384572525709292133614238552451580810601286362213655499134538083785424726484119059950676285763438331520089227, 6419694420004223063062285264931096360778228156157853232796125041025067958687740255716444718822744614217377927689465894996156144384079594697465808095114901, 9910546009146267464166501179537825349776178695164070160517872596078275117785713000045215455672195660329319962408970209137481672915542900445933477806115760, 1420603945244588398788478464408905133932325733716125030735921688979482121297328679317495694245547716568441401137633433150951713462958551532394178628021900, 6208847506587273852328049116772424002595270959861992270025537759079430511161476024600259347318966551584005222005704567718008394909230998308545154993159673, 10385926333158107236552504228168776101396372491461292301486697050842973861408756486936932908479675556344542947425765714101814836237112561730341100901890350]</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">i = 0</span><br><span class="line">j = 1</span><br><span class="line">M = matrix(ZZ, [[1, 0, 0, 0, 0,                 R[i] * Q[j] % p],</span><br><span class="line">                [0, 1, 0, 0, 0,                 S[i] * Q[j] % p],</span><br><span class="line">                [0, 0, 1, 0, 0,                -R[j] * Q[i] % p],</span><br><span class="line">                [0, 0, 0, 1, 0,                -S[j] * Q[i] % p],</span><br><span class="line">                [0, 0, 0, 0, 1, (C[i] * Q[j] - C[j] * Q[i]) % p],</span><br><span class="line">                [0, 0, 0, 0, 0,                               p]])</span><br><span class="line"></span><br><span class="line">L = M * diagonal_matrix([1, 1, 1, 1, 2^32, 2^32])</span><br><span class="line"></span><br><span class="line">v = L.LLL()[0]</span><br><span class="line">ui, vi = map(abs, (v[0], v[1]))</span><br><span class="line">m = (C[i] - R[i] * ui - S[i] * vi) * inverse_mod(Q[i], p) % p</span><br><span class="line">print(long_to_bytes(int(m)))</span><br></pre></td></tr></table></figure><h2 id="Joe-19"><a href="#Joe-19" class="headerlink" title="Joe-19"></a>Joe-19</h2><p>题目描述：<br><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">Joe-19 is a cryptographic system that leverages a top-secret version of GPT AI technology to develop advanced and robust cryptographic tools.</span><br></pre></td></tr></table></figure><br>题目：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line">#!/usr/bin/env sage</span><br><span class="line"></span><br><span class="line">from GPT import GPT6 # deep fake </span><br><span class="line">from Crypto.Util.number import *</span><br><span class="line">from flag import flag</span><br><span class="line"></span><br><span class="line">P = [GPT6(&#x27;A 512-bit prime appears in consecutive digits of e&#x27;) for _ in range(4)]</span><br><span class="line">n, m = prod(P), bytes_to_long(flag)</span><br><span class="line">c = pow(m, 0x10001, n)</span><br><span class="line">print(f&#x27;n = &#123;n&#125;&#x27;)</span><br><span class="line">print(f&#x27;c = &#123;c&#125;&#x27;)</span><br></pre></td></tr></table></figure><p>output.txt：<br><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">n = 8098851734937207931222242323719278262039311278408396153102939840336549151541408692581651429325092535316359074019383926520363453725271849258924996783681725111665666420297112252565291898169877088446887149672943461236879128453847442584868198963005276340812322871768679441501282681171263391133217373094824601748838255306528243603493400515452224778867670063040337191204276832576625227337670689681430055765023322478267339944312535862682499007423158988134472889946113994555274385595499503495488202251032898470224056637967019786473820952632846823442509236976892995505554046850101313269847925347047514591030406052185186963433</span><br><span class="line">c = 7109666883988892105091816608945789114105575520302872143453259352879355990908149124303310269223886289484842913063773914475282456079383409262649058768777227206800315566373109284537693635270488429501591721126853086090237488579840160957328710017268493911400151764046320861154478494943928510792105098343926542515526432005970840321142196894715037239909959538873866099850417570975505565638622448664580282210383639403173773002795595142150433695880167315674091756597784809792396452578104130341085213443116999368555639128246707794076354522200892568943534878523445909591352323861659891882091917178199085781803940677425823784662</span><br></pre></td></tr></table></figure></p><p>预期应该是通过枚举自然对数e的连续bit去找到对应素数，但是</p><p><img src="https://source.yizhixiaojiuli.cn/img/2024-cryptoctf/Joe-19-1.png" alt="factordb分解"></p><p><a href="https://factordb.com/">https://factordb.com/</a> 直接分解了那就没啥可说得了直接解RSA即可</p><p>exp:<br><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line">from Crypto.Util.number import *</span><br><span class="line"></span><br><span class="line">n = 8098851734937207931222242323719278262039311278408396153102939840336549151541408692581651429325092535316359074019383926520363453725271849258924996783681725111665666420297112252565291898169877088446887149672943461236879128453847442584868198963005276340812322871768679441501282681171263391133217373094824601748838255306528243603493400515452224778867670063040337191204276832576625227337670689681430055765023322478267339944312535862682499007423158988134472889946113994555274385595499503495488202251032898470224056637967019786473820952632846823442509236976892995505554046850101313269847925347047514591030406052185186963433</span><br><span class="line">c = 7109666883988892105091816608945789114105575520302872143453259352879355990908149124303310269223886289484842913063773914475282456079383409262649058768777227206800315566373109284537693635270488429501591721126853086090237488579840160957328710017268493911400151764046320861154478494943928510792105098343926542515526432005970840321142196894715037239909959538873866099850417570975505565638622448664580282210383639403173773002795595142150433695880167315674091756597784809792396452578104130341085213443116999368555639128246707794076354522200892568943534878523445909591352323861659891882091917178199085781803940677425823784662</span><br><span class="line"></span><br><span class="line">p = 7728751393377105569802455757436190501772466214587592374418657530064998056688376964229825501195065837843125232135309371235243969149662310110328243570065781</span><br><span class="line">q = 9688632098638681429535439991332657144752666147923336383829750592576742104399942931057096761773496510622226977570278994077236841491368959008277469453600569</span><br><span class="line">r = 10019005372961705640183251650710051163228093250949727357306333102512304273058618645339800283588040423877666492199352609508401454089083503146788384653241593</span><br><span class="line">s = 10795109107229646654467923653403055635071360620150038008453082390943756377071343139771120080956310498862485323957447467376538994662280143050510681877597429</span><br><span class="line"></span><br><span class="line">m = pow(c, inverse(65537,(p-1)*(q-1)*(r-1)*(s-1)), n)</span><br><span class="line">print(long_to_bytes(m))</span><br></pre></td></tr></table></figure></p><h2 id="Melek"><a href="#Melek" class="headerlink" title="Melek"></a>Melek</h2><p>题目描述:</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">Melek is a secret sharing scheme that may be relatively straightforward to break - what are your thoughts on the best way to approach it?</span><br></pre></td></tr></table></figure><p>题目：</p><p>melek.sage:<br><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br></pre></td><td class="code"><pre><span class="line">#!/usr/bin/env sage</span><br><span class="line"></span><br><span class="line">from Crypto.Util.number import *</span><br><span class="line">from flag import flag</span><br><span class="line"></span><br><span class="line">def encrypt(msg, nbit):</span><br><span class="line">m, p = bytes_to_long(msg), getPrime(nbit)</span><br><span class="line">assert m &lt; p</span><br><span class="line">e, t = randint(1, p - 1), randint(1, nbit - 1)</span><br><span class="line">C = [randint(0, p - 1) for _ in range(t - 1)] + [pow(m, e, p)]</span><br><span class="line">R.&lt;x&gt; = GF(p)[]</span><br><span class="line">f = R(0)</span><br><span class="line">for i in range(t): f += x**(t - i - 1) * C[i]</span><br><span class="line">P = [list(range(nbit))]</span><br><span class="line">shuffle(P)</span><br><span class="line">P = P[:t]</span><br><span class="line">PT = [(a, f(a)) for a in [randint(1, p - 1) for _ in range(t)]]</span><br><span class="line">return e, p, PT</span><br><span class="line"></span><br><span class="line">nbit = 512</span><br><span class="line">enc = encrypt(flag, nbit)</span><br><span class="line">print(f&#x27;enc = &#123;enc&#125;&#x27;)</span><br></pre></td></tr></table></figure><br>output太长了这里就不放了,想要的去nss上下载就好</p><p>题目比较直白，建立了一个模p下的多项式f，其中加密后的flag为常数项，然后给出了t个点对,那我们只需要拉格朗日插值即可</p><p>exp:<br><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line">from Crypto.Util.number import *</span><br><span class="line">from gmpy2 import *</span><br><span class="line"></span><br><span class="line">e,p,PT = eval(open(&quot;output.txt&quot;,&quot;rb&quot;).read()[5:])</span><br><span class="line">P.&lt;x&gt; = PolynomialRing(Zmod(p))</span><br><span class="line">f = P.lagrange_polynomial(PT)</span><br><span class="line">c = f(0)</span><br><span class="line"></span><br><span class="line">m2 = pow(c,inverse(e//2,p-1),p)</span><br><span class="line">ff = x^2 - m2</span><br><span class="line">res = ff.roots()</span><br><span class="line">print(long_to_bytes(int(res[1][0])))</span><br></pre></td></tr></table></figure></p><h2 id="Nabat"><a href="#Nabat" class="headerlink" title="Nabat"></a>Nabat</h2><p>题目描述:<br><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">Nabat is a cryptographic challenge that explores the representation of polynomials within a specific polynomial ring structure.</span><br></pre></td></tr></table></figure></p><p>题目:<br><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br></pre></td><td class="code"><pre><span class="line">#!/usr/bin/env sage</span><br><span class="line"></span><br><span class="line">import sys</span><br><span class="line">from flag import flag</span><br><span class="line"></span><br><span class="line">def die(*args):</span><br><span class="line">pr(*args)</span><br><span class="line">quit()</span><br><span class="line"></span><br><span class="line">def pr(*args):</span><br><span class="line">s = &quot; &quot;.join(map(str, args))</span><br><span class="line">sys.stdout.write(s + &quot;\n&quot;)</span><br><span class="line">sys.stdout.flush()</span><br><span class="line"></span><br><span class="line">def sc(): </span><br><span class="line">return sys.stdin.buffer.readline()</span><br><span class="line"></span><br><span class="line">def randstr(l):</span><br><span class="line">return &#x27;&#x27;.join([printable[randint(0, 90)] for _ in range(l)])</span><br><span class="line"></span><br><span class="line">def check(f, l):</span><br><span class="line">R = PolynomialRing(ZZ, &#x27;x&#x27;)</span><br><span class="line">f, g = R(f), R(x^2 + x + 2)</span><br><span class="line">coefs = f.list()</span><br><span class="line">_b1 = all(abs(_) &lt;= 1 for _ in coefs)</span><br><span class="line">_b2 = f.degree() + 1 - 2 * n(log(l)) &gt;= 0</span><br><span class="line">_b3 = coefs.count(0) &gt;= 2 * f.degree() // 3 - 3</span><br><span class="line">_b4 = (f - l) % g == 0</span><br><span class="line">if _b1 and _b2 and _b3 and _b4:</span><br><span class="line">return True</span><br><span class="line">return False</span><br><span class="line"></span><br><span class="line">def main():</span><br><span class="line">border = &quot;┃&quot;</span><br><span class="line">pr(        &quot;┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓&quot;)</span><br><span class="line">pr(border, &quot;Welcome to the NABAT challenge, your mission is to validate the main&quot;, border)</span><br><span class="line">pr(border, &quot;check function in the provided system, Try your best to find flag :)&quot;, border)</span><br><span class="line">pr(        &quot;┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛&quot;)</span><br><span class="line">step = 12</span><br><span class="line">R = PolynomialRing(ZZ, &#x27;x&#x27;)</span><br><span class="line">pr(border, f&quot;Send a polynomial that satisfies the check function for each given `n&#x27;.&quot;)</span><br><span class="line">for i in range(1, step):</span><br><span class="line">n = randint(2**i, 2**(i + 1))</span><br><span class="line">pr(border, f&quot;Your are in step &#123;i&#125; and n = &#123;n&#125;, please send the polynomial f:&quot;)</span><br><span class="line">_f = sc().decode()</span><br><span class="line">try:</span><br><span class="line">_f = R(_f)</span><br><span class="line">except:</span><br><span class="line">die(border, f&quot;The polynomial you provided is is not valid!&quot;)</span><br><span class="line">_b = check(_f, n)</span><br><span class="line">if _b:</span><br><span class="line">if i == step - 1:</span><br><span class="line">die(border, f&#x27;Congrats, you got the flag: &#123;flag&#125;&#x27;)</span><br><span class="line">else:</span><br><span class="line">pr(border, f&#x27;You have successfully passed step &#123;i&#125;. Please proceed to the next step :)&#x27;)</span><br><span class="line">else:</span><br><span class="line">die(border, f&quot;Your input does not meet the requirements!!!&quot;)</span><br><span class="line"></span><br><span class="line">if __name__ == &#x27;__main__&#x27;:</span><br><span class="line">main()</span><br></pre></td></tr></table></figure></p><p>一共有12轮挑战，每轮生成一个n(随轮数增大而增大),我们需要提交一个多项式并且满足:</p><ul><li>所有的系数的绝对值都≤1</li><li>多项式的度$d$要≥$2longn - 1$</li><li>系数为0的数量要≥$[ \frac {3}{2d} ] - 3$</li><li>$f-n$ 能被$g$整除</li></ul><p>其中$g=x^2+x+2$</p>]]></content>
    
    
      
      
    <summary type="html">&lt;h1 id=&quot;Easy&quot;&gt;&lt;a href=&quot;#Easy&quot; class=&quot;headerlink&quot; title=&quot;Easy&quot;&gt;&lt;/a&gt;Easy&lt;/h1&gt;&lt;h2 id=&quot;alibos&quot;&gt;&lt;a href=&quot;#alibos&quot; class=&quot;headerlink&quot; title=&quot;alibos&quot;&gt;&lt;/a&gt;alibos&lt;/h2&gt;&lt;p&gt;题目描述：&lt;br&gt;&lt;figure class=&quot;highlight plaintext&quot;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&quot;gutter&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;1&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;Alibos, a classic cryptographic algorithm, is designed to safeguard non-sensitive data, providing a reliable solution for routine information protection.&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;</summary>
      
    
    
    
    <category term="crypto - write_up" scheme="http://www.yizhixiaojiuli.cn/categories/crypto-write-up/"/>
    
    
  </entry>
  
  <entry>
    <title>说明</title>
    <link href="http://www.yizhixiaojiuli.cn/2024/12/03/2024-crypto-wp-%E8%AF%B4%E6%98%8E/"/>
    <id>http://www.yizhixiaojiuli.cn/2024/12/03/2024-crypto-wp-%E8%AF%B4%E6%98%8E/</id>
    <published>2024-12-03T07:06:00.000Z</published>
    <updated>2024-12-08T13:53:00.000Z</updated>
    
    <content type="html"><![CDATA[<!-- ---title: 文章标题date: 创建日期updated: 更新日期cover: 文章封面description: 文章描述swiper_index: 1 #置顶轮播图顺序，非负整数，数字越大越靠前--- --><h1 id="说明"><a href="#说明" class="headerlink" title="说明"></a>说明</h1><p>这算是真正的第一篇文章，此分类主要致力于记录我参与或复现各类比赛的题目，同时也会记下我在过程中遭遇的问题以及突发的奇思妙想。倘若存在错误或者有其他更佳的思路,热烈欢迎各位师傅予以指正。</p><p>我也学习一下鸡块师傅的做法：</p><ul><li>赛中做出的题目,名字无变化。</li><li>赛中未做出赛后复现的标 *。</li><li>赛中未做出，赛后也没有思路的标 $。 </li></ul>]]></content>
    
    
      
      
    <summary type="html">&lt;!-- ---
title: 文章标题
date: 创建日期
updated: 更新日期
cover: 文章封面
description: 文章描述
swiper_index: 1 #置顶轮播图顺序，非负整数，数字越大越靠前
--- --&gt;
&lt;h1 id=&quot;说明&quot;&gt;&lt;a href=&quot;#说明&quot; class=&quot;headerlink&quot; title=&quot;说明&quot;&gt;&lt;/a&gt;说明&lt;/h1&gt;&lt;p&gt;这算是真正的第一篇文章，此分类主要致力于记录我参与或复现各类比赛的题目，同时也会记下我在过程中遭遇的问题以及突发的奇思妙想。倘若存在错误或者有其他更佳的思路,热烈欢迎各位师傅予以指正。&lt;/p&gt;
&lt;p&gt;我也学习一下鸡块师傅的做法：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;赛中做出的题目,名字无变化。&lt;/li&gt;
&lt;li&gt;赛中未做出赛后复现的标 *。&lt;/li&gt;
&lt;li&gt;赛中未做出，赛后也没有思路的标 $。 &lt;/li&gt;
&lt;/ul&gt;
</summary>
      
    
    
    
    <category term="crypto - write_up" scheme="http://www.yizhixiaojiuli.cn/categories/crypto-write-up/"/>
    
    
  </entry>
  
  <entry>
    <title>从0开始的ctf-crypto之旅</title>
    <link href="http://www.yizhixiaojiuli.cn/2024/12/03/%E4%BB%8E0%E5%BC%80%E5%A7%8B%E7%9A%84ctf-crypto%E4%B9%8B%E6%97%85/"/>
    <id>http://www.yizhixiaojiuli.cn/2024/12/03/%E4%BB%8E0%E5%BC%80%E5%A7%8B%E7%9A%84ctf-crypto%E4%B9%8B%E6%97%85/</id>
    <published>2024-12-03T07:06:00.000Z</published>
    <updated>2024-12-08T13:53:00.000Z</updated>
    
    <content type="html"><![CDATA[<!-- ---title: 文章标题date: 创建日期updated: 更新日期cover: 文章封面description: 文章描述swiper_index: 1 #置顶轮播图顺序，非负整数，数字越大越靠前--- --><h1 id="开始"><a href="#开始" class="headerlink" title="开始"></a>开始</h1><h2 id="安装python环境"><a href="#安装python环境" class="headerlink" title="安装python环境"></a>安装python环境</h2><p>在ctf比赛中，crypto方向python语言是最常用也是最好用的语言，所以上来的第一步就是安装python环境。</p><h3 id="一-获取电脑的处理器型号"><a href="#一-获取电脑的处理器型号" class="headerlink" title="(一)获取电脑的处理器型号"></a>(一)获取电脑的处理器型号</h3><p>按下Win+R键，输入cmd或直接在开始菜单搜索命令提示符，进入命令提示符界面，输入以下指令获取处理器型号：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">echo %PROCESSOR_ARCHITECTURE%</span><br></pre></td></tr></table></figure><p><img src="https://source.yizhixiaojiuli.cn/img/%E4%BB%8E0%E5%BC%80%E5%A7%8B%E7%9A%84ctf-crypto%E4%B9%8B%E6%97%85/1.webp" alt="获取处理器型号"></p><p>如图显示此电脑是AMD64处理器。</p><h3 id="二-安装python"><a href="#二-安装python" class="headerlink" title="(二)安装python"></a>(二)安装python</h3><h4 id="1-下载"><a href="#1-下载" class="headerlink" title="1.下载"></a>1.下载</h4><p>python官网网址: <a href="https://www.python.org/">Welcome to Python.org</a><br>选择下载windows版python。<br><img src="https://source.yizhixiaojiuli.cn/img/%E4%BB%8E0%E5%BC%80%E5%A7%8B%E7%9A%84ctf-crypto%E4%B9%8B%E6%97%85/2.webp" alt="下载python"></p><p>由于此电脑是AMD64处理器，因此在确认要下载的python版本后选择 Windows installer(64-bit) 或 Windows x86-64 executable installer ，如下图所示：<br><img src="https://source.yizhixiaojiuli.cn/img/%E4%BB%8E0%E5%BC%80%E5%A7%8B%E7%9A%84ctf-crypto%E4%B9%8B%E6%97%85/3.webp" alt="选择下载版本"></p><h4 id="2-安装"><a href="#2-安装" class="headerlink" title="2.安装"></a>2.安装</h4><p>可执行程序，老版本的python会有一个Install launcher for all users选项，请务必勾选，同时选择项会有一个add <strong>**</strong> to PATH也请务必勾选，新版本会默认安装。<br><img src="https://source.yizhixiaojiuli.cn/img/%E4%BB%8E0%E5%BC%80%E5%A7%8B%E7%9A%84ctf-crypto%E4%B9%8B%E6%97%85/4.webp" alt="安装选项"></p><p>安装完成后按下Win+R键，运行cmd或直接在开始菜单搜索命令提示符后进入命令提示符界面，输入以下指令：<br><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">python --version</span><br></pre></td></tr></table></figure><br>下图为安装成功的示例：</p><p><img src="https://source.yizhixiaojiuli.cn/img/%E4%BB%8E0%E5%BC%80%E5%A7%8B%E7%9A%84ctf-crypto%E4%B9%8B%E6%97%85/5.webp" alt="安装成功"></p><h3 id="三-安装编辑器"><a href="#三-安装编辑器" class="headerlink" title="(三)安装编辑器"></a>(三)安装编辑器</h3><blockquote>  <p>不对任何编辑器进行推荐，我最开始使用的是pycharm所以用pycharm进行演示</p> </blockquote><h4 id="1-下载-1"><a href="#1-下载-1" class="headerlink" title="1.下载"></a>1.下载</h4><p>pycharm网址:<br><a href="https://www.jetbrains.com/pycharm/download/?section=windows">Download PyCharm: The Python IDE for data science and web development by JetBrains</a><br>任选一个download，并选择去下载其他版本，根据处理器型号选择下载版本。<br><img src="https://source.yizhixiaojiuli.cn/img/%E4%BB%8E0%E5%BC%80%E5%A7%8B%E7%9A%84ctf-crypto%E4%B9%8B%E6%97%85/6.webp" alt="下载pycharm"></p><h4 id="2-安装-1"><a href="#2-安装-1" class="headerlink" title="2.安装"></a>2.安装</h4><p>运行可执行程序，推荐同意全部选项，一直点下一步即可，安装会很慢。<br>安装成功后，重启电脑。</p><h4 id="3-配置"><a href="#3-配置" class="headerlink" title="3.配置"></a>3.配置</h4><h5 id="安装中文语言包插件"><a href="#安装中文语言包插件" class="headerlink" title="安装中文语言包插件"></a>安装中文语言包插件</h5><ul><li>打开 PyCharm，进入顶部菜单 File &gt; Settings（Windows/Linux）或 PyCharm &gt; Preferences（macOS）</li><li>在左侧面板中选择 Plugins</li><li>点击顶部的 Marketplace 选项卡</li><li>在搜索框中输入 Chinese (Simplified) Language Pack</li><li>找到插件后点击 Install 按钮</li><li>安装完成后点击 Restart IDE 重启 PyCharm</li></ul><h3 id="四-python库管理"><a href="#四-python库管理" class="headerlink" title="(四)python库管理"></a>(四)python库管理</h3><p><blockquote>  <p>分标准库存储路径为<br /> C:\Users\用户\AppData\Local\Programs\Python\Python版本\Lib<br /> 第三方库默认安装路径<br /> C:\Users\用户\AppData\Local\Programs\Python\Python版本\Lib\site-packages\</p> </blockquote><br>虽然python安装时会自带一些标准库，但在日常编程还需要安装很多第三方库，虽然使用conda很方便，但使用pip安装也是一个好选择，按下Win+R键，运行cmd或直接在开始菜单搜索命令提示符后进入命令提示符界面进行操作。</p><h4 id="1-安装指定版本的库"><a href="#1-安装指定版本的库" class="headerlink" title="1.安装指定版本的库"></a>1.安装指定版本的库</h4><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">pip install 库名==版本号</span><br></pre></td></tr></table></figure><h4 id="2-使用国内镜像安装库"><a href="#2-使用国内镜像安装库" class="headerlink" title="2.使用国内镜像安装库"></a>2.使用国内镜像安装库</h4><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">pip install 库名 -i URL_ADDRESS</span><br><span class="line">pip install 库名 -i https://pypi.tuna.tsinghua.edu.cn/simple/</span><br></pre></td></tr></table></figure><p>其中<a href="https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple为清华镜像源。">https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple为清华镜像源。</a></p><h4 id="3-升级某个库到最新的方法"><a href="#3-升级某个库到最新的方法" class="headerlink" title="3.升级某个库到最新的方法"></a>3.升级某个库到最新的方法</h4><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">pip install --upgrade 库名</span><br></pre></td></tr></table></figure><h4 id="4-卸载某个库"><a href="#4-卸载某个库" class="headerlink" title="4.卸载某个库"></a>4.卸载某个库</h4><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">pip uninstall 库名</span><br></pre></td></tr></table></figure><h4 id="5-查看已安装的库"><a href="#5-查看已安装的库" class="headerlink" title="5.查看已安装的库"></a>5.查看已安装的库</h4><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">pip list</span><br></pre></td></tr></table></figure>]]></content>
    
    
      
      
    <summary type="html">&lt;!-- ---
title: 文章标题
date: 创建日期
updated: 更新日期
cover: 文章封面
description: 文章描述
swiper_index: 1 #置顶轮播图顺序，非负整数，数字越大越靠前
--- --&gt;
&lt;h1 id=&quot;开始&quot;&gt;&lt;a href=&quot;#开始&quot; class=&quot;headerlink&quot; title=&quot;开始&quot;&gt;&lt;/a&gt;开始&lt;/h1&gt;&lt;h2 id=&quot;安装python环境&quot;&gt;&lt;a href=&quot;#安装python环境&quot; class=&quot;headerlink&quot; title=&quot;安装python环境&quot;&gt;&lt;/a&gt;安装python环境&lt;/h2&gt;&lt;p&gt;在ctf比赛中，crypto方向python语言是最常用也是最好用的语言，所以上来的第一步就是安装python环境。&lt;/p&gt;
&lt;h3 id=&quot;一-获取电脑的处理器型号&quot;&gt;&lt;a href=&quot;#一-获取电脑的处理器型号&quot; class=&quot;headerlink&quot; title=&quot;(一)获取电脑的处理器型号&quot;&gt;&lt;/a&gt;(一)获取电脑的处理器型号&lt;/h3&gt;&lt;p&gt;按下Win+R键，输入cmd或直接在开始菜单搜索命令提示符，进入命令</summary>
      
    
    
    
    <category term="crypto - study" scheme="http://www.yizhixiaojiuli.cn/categories/crypto-study/"/>
    
    
  </entry>
  
</feed>
