<?xml version="1.0" encoding="utf-8" standalone="yes"?><?xml-stylesheet href="/feed_style.xsl" type="text/xsl"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:media="https://www.rssboard.org/media-rss">
  <channel>
    <title>FCSC2026 on GMO Goat</title>
    <link>https://gmogoat.fr/tags/fcsc2026/</link>
    <description>Recent content in FCSC2026 on GMO Goat</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>en</language>
    <lastBuildDate>Sun, 12 Apr 2026 12:37:52 +0200</lastBuildDate><atom:link href="https://gmogoat.fr/tags/fcsc2026/index.xml" rel="self" type="application/rss+xml" /><icon>https://gmogoat.fr/icons/pp_goat_round.png</icon>
    
    
    <item>
      <title>Macroplata</title>
      <link>https://gmogoat.fr/posts/macroplata/</link>
      <pubDate>Sun, 12 Apr 2026 12:37:52 +0200</pubDate>
      
      <guid>https://gmogoat.fr/posts/macroplata/</guid>
      <description><![CDATA[<h1 id="writeup-macroplata---gmo_goat---fcsc2026">Writeup macroplata - GMO_Goat - FCSC2026</h1>
<h2 id="introduction">Introduction</h2>
<p><strong>Macroplata</strong> : Just WHY man ? was my first reaction to this challenge&hellip; I usually don&rsquo;t really like challenges with a lot of code <code>:-)</code>
Soooo, basically there are 3 KEMS and some sort of TAG/authentification thing, my first instinct was : I&rsquo;m NOT looking into the details of the KEMs before I have something on the actual thing that we&rsquo;re supposed to to which is: <strong>forging a tag</strong>.</p>
<p>All that we need to do is an existencial forgery from a tag with known plaintext&hellip;</p>
<figure><img src="/images/lattice.jpeg">
</figure>

<h2 id="the-tagging">The tagging</h2>
<p>The tagging mecanism is basically a recursive AES enc with a few twists depending on the &hellip; block padding ?
I hope ANSSI didn&rsquo;t mean to change KEM depending on the padding when they recommened hybrid solutions <code>:-)</code></p>
<p>Well let&rsquo;s consider a seqences of 16 bytes blocks (meaning all of them are 16 bytes so don&rsquo;t need padding), $b_1, \cdots, b_n$, then the tag is of the form:</p>
$$T(b_1, \cdots, b_n) = E_{K_0}\left(E_{K_0}\left(\cdots E_{K_0}\left(E_{K_0}\left(b_1\right) \oplus b_2\right) \cdots\right) \oplus b_n \oplus K_1\right)$$<p>And particular the known tag is exactly $32$-bytes so is of the form:</p>
<p>$T_0 = T(k_1, k_2 ) = E_{K_0} \left( E_{K_0} \left( k_1\right) \oplus k_2 \oplus K_1\right)$</p>
<p>Where $E_{K_0}$ is AES-ECB with key $K_0$ and $K_1$ is the key to the lattice KEM. Note that to win we can forge a tag of ANY length&hellip;</p>
<h2 id="the-kems">The KEMs</h2>
<p>Well since the key to the AES seem to be the most important let&rsquo;s look at the EC-KEM that derives it&hellip; Well its called <code>ECElGamalKEM</code> but it looks more like <code>ECDH</code> and &hellip; seems pretty secure. No luck here&hellip;</p>
<p>I didn&rsquo;t really want to look at the lattice KEM too fast as it&rsquo;s a LOT of code (Maybe I should have in retrospective hum hum&hellip;), so I thought that maybe I should look at the RSA KEM. The RSA KEM was SO simples that I was also convinced it had no real vulnerability.</p>
<p>BUT I SILL didn&rsquo;t want to look at the lattice KEM until I actually find a forgery that requires only $K_1$ so I did that.</p>
<h2 id="the-forgery">The forgery</h2>
<p>We don&rsquo;t know a lot&hellip; we know $k_1, k_2, T_0$ and possibly $K_1$ soooo what can we do.
Well if we don&rsquo;t want to involve $K_2$ we need full size blocks. So here I proceeded iterativly:</p>
<ul>
<li>Can I forge a TAG for one block ?</li>
</ul>
<p>$T(b_1) = E_{K_0}(b_1 \oplus K_1)$, since I only know one encryption with $K_0$ then necessarly I need that $b_1 \oplus K_1 = E_{K_0} \left( k_1\right) \oplus b_2 \oplus K_1$ which is equivalent to $b_1 \oplus b_2 = E_{K_0} \left( k_1\right)$, unfortunatly, there is NO WAY I get my hands on $E_{K_0} \left( k_1\right)$&hellip;</p>
<ul>
<li>Can I forge a TAG for two blocks ?</li>
</ul>
<p>Well I didn&rsquo;t really try, since I assumed it would basically be the same as the given tag, maybe I&rsquo;m wrong ?</p>
<ul>
<li>Can I forge a TAG for three blocks ?</li>
</ul>
<p>Same process : $T(b_1, b_2, b_3) = E_{K_0} \left( E_{K_0} \left( E_{K_0} \left( b_1\right) \oplus b_2\right)  \oplus b_3 \oplus K_1\right)$ &hellip; I didn&rsquo;t succeed but I felt like with a little more degree of freedom I could do it&hellip;</p>
<ul>
<li>Can I forge a TAG for four blocks ?</li>
</ul>
<p>$T(b_1, b_2, b_3, b_4) = E_{K_0}( E_{K_0}( E_{K_0}( E_{K_0}( b_1) \oplus b_2) \oplus b_3)  \oplus b_4 \oplus K_1)$</p>
<p>As before, I&rsquo;m forced to take $b_4 = k_2$ and $E_{K_0}( E_{K_0}( b_1) \oplus b_2) \oplus b_3 = b_1$ since it&rsquo;s the only way that I can match the given tag, I get:</p>
$$T_0 = T(E_{K_0}( E_{K_0}( b_1) \oplus b_2) \oplus b_3, b_2, b_3, k_2)$$<p>and applying the same logic, I&rsquo;m forced to take: $b_1 \oplus b_3 = T_0$ and $b_2 = k_2 \oplus K_1$ which gives:</p>
$$T_0 = T(E_{K_0}( E_{K_0}( b_1) \oplus k_2 \oplus K_1) \oplus b_1 \oplus T_0 , k_2 \oplus K_1, b_1 \oplus T_0, k_2)$$<p>and clearly, now we want $b_1 = k_1$ which simplifies evrything to:</p>
$$T_0 = T(k_1, k_2 \oplus K_1, b_1 \oplus T_0, k_2)$$<h2 id="just-find-k_1">Just find $K_1$</h2>
<p>Well, let&rsquo;s just say I just printed $v$ from the lattice KEM, was met with:</p>
<pre tabindex="0"><code>[27967643, 27967643, 27967643, 27967643, 11189146, 11189146, 27967643, 11189146, 27967643, 11189146, 27967643, 27967643, 11189146, 11189146, 11189146, 11189146, 11189146, 27967643, ...]Z
</code></pre><p>Note that for this part I was SOOO lazy in my solve that i randomly pick one of the values to be $0$ and the other to be $1$ so the final solve works half the time.</p>
<figure><img src="/images/no-sully.gif">
</figure>

<p>Sooo yeah, it&rsquo;s pretty obvious this is beyond broken&hellip;</p>
<h2 id="putting-it-all-together">Putting it all together</h2>
<p>Here is the final solve:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-python" data-lang="python"><span style="display:flex;"><span><span style="color:#f92672">from</span> pwn <span style="color:#f92672">import</span> remote, process
</span></span><span style="display:flex;"><span><span style="color:#f92672">from</span> Crypto.Util.number <span style="color:#f92672">import</span> <span style="color:#f92672">*</span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">import</span> pickle
</span></span><span style="display:flex;"><span><span style="color:#f92672">from</span> Crypto.Hash <span style="color:#f92672">import</span> SHAKE256, SHA256
</span></span><span style="display:flex;"><span><span style="color:#f92672">import</span> base64
</span></span><span style="display:flex;"><span><span style="color:#f92672">import</span> numpy <span style="color:#66d9ef">as</span> np
</span></span><span style="display:flex;"><span><span style="color:#f92672">from</span> Crypto.Protocol.KDF <span style="color:#f92672">import</span> HKDF
</span></span><span style="display:flex;"><span><span style="color:#75715e">#io = process([&#34;python&#34;, &#34;macroplata.py&#34;])</span>
</span></span><span style="display:flex;"><span>io <span style="color:#f92672">=</span> remote(<span style="color:#e6db74">&#34;challenges.fcsc.fr&#34;</span>, <span style="color:#ae81ff">2158</span>)
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>pk <span style="color:#f92672">=</span> pickle<span style="color:#f92672">.</span>loads(base64<span style="color:#f92672">.</span>b64decode(io<span style="color:#f92672">.</span>recvline()<span style="color:#f92672">.</span>strip()<span style="color:#f92672">.</span>decode()))
</span></span><span style="display:flex;"><span>ct <span style="color:#f92672">=</span> base64<span style="color:#f92672">.</span>b64decode(io<span style="color:#f92672">.</span>recvline()<span style="color:#f92672">.</span>strip()<span style="color:#f92672">.</span>decode())
</span></span><span style="display:flex;"><span>truth <span style="color:#f92672">=</span> io<span style="color:#f92672">.</span>recvline()<span style="color:#f92672">.</span>strip()
</span></span><span style="display:flex;"><span>tag <span style="color:#f92672">=</span> base64<span style="color:#f92672">.</span>b64decode(io<span style="color:#f92672">.</span>recvline()<span style="color:#f92672">.</span>strip()<span style="color:#f92672">.</span>decode())
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>l1 <span style="color:#f92672">=</span> int<span style="color:#f92672">.</span>from_bytes(ct[:<span style="color:#ae81ff">4</span>])
</span></span><span style="display:flex;"><span>ct_ec <span style="color:#f92672">=</span> ct[<span style="color:#ae81ff">4</span>:<span style="color:#ae81ff">4</span><span style="color:#f92672">+</span>l1]
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>l2 <span style="color:#f92672">=</span> int<span style="color:#f92672">.</span>from_bytes(ct[<span style="color:#ae81ff">4</span><span style="color:#f92672">+</span>l1:<span style="color:#ae81ff">8</span><span style="color:#f92672">+</span>l1])
</span></span><span style="display:flex;"><span>ct_lat <span style="color:#f92672">=</span> ct[<span style="color:#ae81ff">8</span><span style="color:#f92672">+</span>l1:<span style="color:#ae81ff">8</span><span style="color:#f92672">+</span>l1<span style="color:#f92672">+</span>l2]
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>l3 <span style="color:#f92672">=</span> int<span style="color:#f92672">.</span>from_bytes(ct[<span style="color:#ae81ff">8</span><span style="color:#f92672">+</span>l1<span style="color:#f92672">+</span>l2:<span style="color:#ae81ff">12</span><span style="color:#f92672">+</span>l1<span style="color:#f92672">+</span>l2])
</span></span><span style="display:flex;"><span>ct_rsa <span style="color:#f92672">=</span> ct[<span style="color:#ae81ff">12</span><span style="color:#f92672">+</span>l1<span style="color:#f92672">+</span>l2:<span style="color:#ae81ff">12</span><span style="color:#f92672">+</span>l1<span style="color:#f92672">+</span>l2<span style="color:#f92672">+</span>l3]
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>n <span style="color:#f92672">=</span> <span style="color:#ae81ff">512</span>
</span></span><span style="display:flex;"><span>q <span style="color:#f92672">=</span> <span style="color:#ae81ff">33556993</span>
</span></span><span style="display:flex;"><span>B <span style="color:#f92672">=</span> <span style="color:#ae81ff">2</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>seed, t <span style="color:#f92672">=</span> pk[<span style="color:#ae81ff">1</span>]
</span></span><span style="display:flex;"><span>A <span style="color:#f92672">=</span> np<span style="color:#f92672">.</span>array([
</span></span><span style="display:flex;"><span>            [int<span style="color:#f92672">.</span>from_bytes(SHAKE256<span style="color:#f92672">.</span>new(data<span style="color:#f92672">=</span>seed<span style="color:#f92672">+</span>i<span style="color:#f92672">.</span>to_bytes(<span style="color:#ae81ff">2</span>,<span style="color:#e6db74">&#39;big&#39;</span>)<span style="color:#f92672">+</span>j<span style="color:#f92672">.</span>to_bytes(<span style="color:#ae81ff">2</span>,<span style="color:#e6db74">&#39;big&#39;</span>))<span style="color:#f92672">.</span>read(<span style="color:#ae81ff">2</span>), <span style="color:#e6db74">&#39;big&#39;</span>) <span style="color:#f92672">%</span> q <span style="color:#66d9ef">for</span> j <span style="color:#f92672">in</span> range(n)]
</span></span><span style="display:flex;"><span>            <span style="color:#66d9ef">for</span> i <span style="color:#f92672">in</span> range(n)
</span></span><span style="display:flex;"><span>        ])
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>u, v <span style="color:#f92672">=</span> pickle<span style="color:#f92672">.</span>loads(ct_lat)
</span></span><span style="display:flex;"><span>v <span style="color:#f92672">=</span> list(v)
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>m <span style="color:#f92672">=</span> [el <span style="color:#f92672">==</span> v[<span style="color:#ae81ff">0</span>] <span style="color:#66d9ef">for</span> el <span style="color:#f92672">in</span> v]
</span></span><span style="display:flex;"><span>z <span style="color:#f92672">=</span> <span style="color:#e6db74">b</span><span style="color:#e6db74">&#34;&#34;</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">for</span> i <span style="color:#f92672">in</span> range(<span style="color:#ae81ff">0</span>, len(m), <span style="color:#ae81ff">8</span>):
</span></span><span style="display:flex;"><span>    v <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>
</span></span><span style="display:flex;"><span>    ii <span style="color:#f92672">=</span> i
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">for</span> j <span style="color:#f92672">in</span> range(<span style="color:#ae81ff">7</span>, <span style="color:#f92672">-</span><span style="color:#ae81ff">1</span>, <span style="color:#f92672">-</span><span style="color:#ae81ff">1</span>):
</span></span><span style="display:flex;"><span>        v <span style="color:#f92672">|=</span> <span style="color:#ae81ff">2</span><span style="color:#f92672">**</span>j <span style="color:#f92672">*</span> m[ii]
</span></span><span style="display:flex;"><span>        ii <span style="color:#f92672">+=</span> <span style="color:#ae81ff">1</span>
</span></span><span style="display:flex;"><span>    z <span style="color:#f92672">+=</span> bytes([v])
</span></span><span style="display:flex;"><span>K1 <span style="color:#f92672">=</span> HKDF(z, <span style="color:#ae81ff">16</span>, <span style="color:#e6db74">b</span><span style="color:#e6db74">&#34;&#34;</span>, SHA256)
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>b1, b2 <span style="color:#f92672">=</span> truth[:<span style="color:#ae81ff">16</span>], truth[<span style="color:#ae81ff">16</span>:]
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">def</span> <span style="color:#a6e22e">xor</span>(a, b):
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">return</span> bytes(x <span style="color:#f92672">^</span> y <span style="color:#66d9ef">for</span> x, y <span style="color:#f92672">in</span> zip(a, b))
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>forged <span style="color:#f92672">=</span> b1 <span style="color:#f92672">+</span> xor(b2, K1) <span style="color:#f92672">+</span> xor(tag, b1) <span style="color:#f92672">+</span> b2
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>print(io<span style="color:#f92672">.</span>recvuntil(<span style="color:#e6db74">b</span><span style="color:#e6db74">&#34;:&#34;</span>))
</span></span><span style="display:flex;"><span>io<span style="color:#f92672">.</span>sendline(base64<span style="color:#f92672">.</span>b64encode(forged))
</span></span><span style="display:flex;"><span>io<span style="color:#f92672">.</span>sendline(base64<span style="color:#f92672">.</span>b64encode(tag))
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>print(io<span style="color:#f92672">.</span>recvline())
</span></span></code></pre></div>]]></description>
      
    </item>
    
    
    
    <item>
      <title>Splhash</title>
      <link>https://gmogoat.fr/posts/splhash/</link>
      <pubDate>Sun, 12 Apr 2026 12:37:47 +0200</pubDate>
      
      <guid>https://gmogoat.fr/posts/splhash/</guid>
      <description><![CDATA[<h1 id="writeup-splhash---gmo_goat---fcsc2026">Writeup splhash - GMO_Goat - FCSC2026</h1>
<h2 id="introduction">Introduction</h2>
<p><strong>Splhash</strong> is a hash function presented as $H(x) = B \times S(A \times x)$ where $A$ is a $2n \times 5n$ matrix and $B$ is a $5n \times n$ matrix.
The non-linear $S$-layer is comprised of $\cfrac{5n}{4}$ SBoxes each acting on $4$-bits nibbles. We recognize the SBox from the Present cipher.
This challenge reminded me of <strong>One round crypto</strong> at ECSC2024 but this time with a hash function instead of a cipher.</p>
<figure><img src="/images/meme_alg.jpeg">
</figure>

<h2 id="first-attempts">First attempt(s)</h2>
<h3 id="bouncy">Bouncy</h3>
<p>Since this hash function is comprised of one non-linear and 2 linear layer I thought about using a rebound attack :
We want $x \ne y \in \mathbb F_2^{2n}$ s.t $H(x) = H(y)$. To but it in algebraic terms we have:</p>
$$B S(A x) - B S(A y) = 0$$<p>
</p>
$$B (S(A x) - S(A y)) = 0$$<p>or since $B$ is $5n \times n$ (will have big kernel)</p>
$$S(A x) - S(A y) \in \ker B$$<p>For the rebound we want some differential property of $S$, since its the present SBox we do have some differential at 25%, in particular if we consider the differential space in and out:</p>
$$\forall d_y \in \Delta^S_y, \forall d_z \in \Delta^S_z, \exist y\in \mathbb F_2^4 \text{ s.t } S(y \oplus d_y) = S(y) \oplus d_z$$<p>Then the inbound differential chains looks like:</p>
$$\Delta_x \xrightarrow A \Delta_y \xrightarrow S \Delta_z \xrightarrow B 0$$<p>This requires that $d_z \in \ker B$ and $d_y \in \text{Im } A$</p>
<p>Sooooo we need&hellip;  $d_z \in \ker B \cap \Delta^S_z$ and $d_y \in \text{Im } A \cap \Delta^S_y$ which turns out&hellip; is pretty hard to find, for up to $n=32$ the SAT solver actually found it but it didn&rsquo;t scale and I just couldn&rsquo;t find my inbound otherwise&hellip;</p>
<h3 id="fun-with-the-anf">Fun with the ANF</h3>
<p>Since the challenge looks mostly algebraic, let&rsquo;s look at the ANF of the Sbox:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-python" data-lang="python"><span style="display:flex;"><span><span style="color:#f92672">from</span> sage.all <span style="color:#f92672">import</span> <span style="color:#f92672">*</span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">from</span> sage.crypto.sbox <span style="color:#f92672">import</span> SBox
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">def</span> <span style="color:#a6e22e">anf</span>(s): <span style="color:#75715e"># taken from the INRIA symmetric crypto tutorial</span>
</span></span><span style="display:flex;"><span>    result <span style="color:#f92672">=</span> []
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">for</span> i <span style="color:#f92672">in</span> range(<span style="color:#ae81ff">4</span>):
</span></span><span style="display:flex;"><span>        result<span style="color:#f92672">.</span>append(P(s<span style="color:#f92672">.</span>component_function(<span style="color:#ae81ff">1</span> <span style="color:#f92672">&lt;&lt;</span> i)<span style="color:#f92672">.</span>algebraic_normal_form()))
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">return</span> result
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>S <span style="color:#f92672">=</span> [<span style="color:#ae81ff">12</span>, <span style="color:#ae81ff">5</span>, <span style="color:#ae81ff">6</span>, <span style="color:#ae81ff">11</span>, <span style="color:#ae81ff">9</span>, <span style="color:#ae81ff">0</span>, <span style="color:#ae81ff">10</span>, <span style="color:#ae81ff">13</span>, <span style="color:#ae81ff">3</span>, <span style="color:#ae81ff">14</span>, <span style="color:#ae81ff">15</span>, <span style="color:#ae81ff">8</span>, <span style="color:#ae81ff">4</span>, <span style="color:#ae81ff">7</span>, <span style="color:#ae81ff">1</span>, <span style="color:#ae81ff">2</span>]
</span></span><span style="display:flex;"><span>pols <span style="color:#f92672">=</span> anf(SBox(S))
</span></span><span style="display:flex;"><span>print(pols)
</span></span></code></pre></div><p>and we get:</p>
<pre tabindex="0"><code>[x1*x2 + x0 + x2 + x3, x0*x1*x2 + x0*x1*x3 + x0*x2*x3 + x1*x3 + x2*x3 + x1 + x3, x0*x1*x3 + x0*x2*x3 + x0*x1 + x0*x3 + x1*x3 + x2 + x3 + 1, x0*x1*x2 + x0*x1*x3 + x0*x2*x3 + x1*x2 + x0 + x1 + x3 + 1]
</code></pre><p>Here, a few things stand out, first there aren&rsquo;t many terms of degree $3$ but also and thats what I realised at the time, if you substitute $x_1 = x_3 = 0$ then you get:</p>
<pre tabindex="0"><code>[x0 + x2, 0, x2 + 1, x0 + 1]
</code></pre><p>A perfectly linear SBox ! So in my collision I just have to fix the first two bits in the entrance of each SBox to 0 right ?</p>
<p>Except we have $\cfrac{5n}{4}$ SBoxes and with $2$ bits per SBox =, thats $\cfrac{5n}{2}$ constraints while the input is only $2n$ bits, urgh&hellip; Though if you replace the $5$ by a $2$ this solution does work in the end !</p>
<p>I got stuck there for a very long time afterwards&hellip;</p>
<h2 id="introducing-the-differential-but-like-not-the-one-you-think-about">Introducing the differential but like not the one you think about&hellip;</h2>
<p>I discovered the next property a bit by accident, by fiddling with algebraic representation and realised that even though the algebraic degree of the SBox is $3$, for a fixed $\delta \in \mathbb F_2^{2n}$, $H(x + \delta) + H(x)$ is of degree&hellip; 2 ??
While both $H(x + \delta)$ and $H(x)$ are degree $3$ ??</p>
<p>Well it actually makes sense, you can see it as differentiating a polynomial thus reducing it&rsquo;s degree by one, rigorously what&rsquo;s happening is that since in $\mathbb F_2$ , $x^2 = x$ the monomials have independent degree $1$ so the differential always cancels at least a variable from each monom.</p>
<p>Well, we now have a MQ system, which&hellip; is not meant to be solved directly and is pretty much unusable (I tried linearising it: <em>bad idea</em>).</p>
<h2 id="what-to-do-next-">What to do next ?</h2>
<p>Remember the ANF from earlier.. take a good look at it:</p>
<pre tabindex="0"><code>[x1*x2 + x0 + x2 + x3, x0*x1*x2 + x0*x1*x3 + x0*x2*x3 + x1*x3 + x2*x3 + x1 + x3, x0*x1*x3 + x0*x2*x3 + x0*x1 + x0*x3 + x1*x3 + x2 + x3 + 1, x0*x1*x2 + x0*x1*x3 + x0*x2*x3 + x1*x2 + x0 + x1 + x3 + 1]
</code></pre><p>Well <em>yeah</em>, evry monomial of degree $3$ has a $x_0$ innit ?!
That means that by only fixing one bit per SBox the SBox become degree $2$ thus the differential degree $1$ and we can just solve a linear system !!</p>
<p>Well, again, STILL not enough but &hellip;</p>
<figure><img src="/images/end.jpg">
</figure>

<p>Trust me <code>:-)</code></p>
<p>In fact just like before we&rsquo;ll need $\cfrac{5n}{4}$ constraints for the $1$-bit fix plus $n$ for the solving at the end and unfortunatly $\cfrac{5n}{4} + n \gt 2n$&hellip;</p>
<p>But, in a desperate attempt we can try to do the $1$ bit constrain on as many Sbox as we can and look at the resulting polynomial degrees:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-python" data-lang="python"><span style="display:flex;"><span><span style="color:#f92672">from</span> sage.all <span style="color:#f92672">import</span> <span style="color:#f92672">*</span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">import</span> random
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>F2 <span style="color:#f92672">=</span> GF(<span style="color:#ae81ff">2</span>)
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>n <span style="color:#f92672">=</span> <span style="color:#ae81ff">64</span>
</span></span><span style="display:flex;"><span>K <span style="color:#f92672">=</span> <span style="color:#ae81ff">5</span>
</span></span><span style="display:flex;"><span>random<span style="color:#f92672">.</span>seed(<span style="color:#ae81ff">0</span>)
</span></span><span style="display:flex;"><span>A <span style="color:#f92672">=</span> [ random<span style="color:#f92672">.</span>choices([<span style="color:#ae81ff">0</span>, <span style="color:#ae81ff">1</span>], k <span style="color:#f92672">=</span> <span style="color:#ae81ff">2</span> <span style="color:#f92672">*</span> n) <span style="color:#66d9ef">for</span> _ <span style="color:#f92672">in</span> range(K <span style="color:#f92672">*</span> n) ]
</span></span><span style="display:flex;"><span>B <span style="color:#f92672">=</span> [ random<span style="color:#f92672">.</span>choices([<span style="color:#ae81ff">0</span>, <span style="color:#ae81ff">1</span>], k <span style="color:#f92672">=</span> K <span style="color:#f92672">*</span> n) <span style="color:#66d9ef">for</span> _ <span style="color:#f92672">in</span> range(n) ]
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>S <span style="color:#f92672">=</span> [<span style="color:#ae81ff">12</span>, <span style="color:#ae81ff">5</span>, <span style="color:#ae81ff">6</span>, <span style="color:#ae81ff">11</span>, <span style="color:#ae81ff">9</span>, <span style="color:#ae81ff">0</span>, <span style="color:#ae81ff">10</span>, <span style="color:#ae81ff">13</span>, <span style="color:#ae81ff">3</span>, <span style="color:#ae81ff">14</span>, <span style="color:#ae81ff">15</span>, <span style="color:#ae81ff">8</span>, <span style="color:#ae81ff">4</span>, <span style="color:#ae81ff">7</span>, <span style="color:#ae81ff">1</span>, <span style="color:#ae81ff">2</span>]
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>P <span style="color:#f92672">=</span> BooleanPolynomialRing(<span style="color:#ae81ff">2</span><span style="color:#f92672">*</span>n,<span style="color:#e6db74">&#39;x&#39;</span>)
</span></span><span style="display:flex;"><span>xs <span style="color:#f92672">=</span> vector(P<span style="color:#f92672">.</span>gens()), vector(F2, [random<span style="color:#f92672">.</span>randint(<span style="color:#ae81ff">0</span>, <span style="color:#ae81ff">1</span>) <span style="color:#66d9ef">for</span> _ <span style="color:#f92672">in</span> range(<span style="color:#ae81ff">2</span><span style="color:#f92672">*</span>n)])
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>pols <span style="color:#f92672">=</span> [<span style="color:#66d9ef">lambda</span> x0, x1, x2, x3: x1<span style="color:#f92672">*</span>x2 <span style="color:#f92672">+</span> x0 <span style="color:#f92672">+</span> x2 <span style="color:#f92672">+</span> x3, 
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">lambda</span> x0, x1, x2, x3: x0<span style="color:#f92672">*</span>x1<span style="color:#f92672">*</span>x2 <span style="color:#f92672">+</span> x0<span style="color:#f92672">*</span>x1<span style="color:#f92672">*</span>x3 <span style="color:#f92672">+</span> x0<span style="color:#f92672">*</span>x2<span style="color:#f92672">*</span>x3 <span style="color:#f92672">+</span> x1<span style="color:#f92672">*</span>x3 <span style="color:#f92672">+</span> x2<span style="color:#f92672">*</span>x3 <span style="color:#f92672">+</span> x1 <span style="color:#f92672">+</span> x3, 
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">lambda</span> x0, x1, x2, x3: x0<span style="color:#f92672">*</span>x1<span style="color:#f92672">*</span>x3 <span style="color:#f92672">+</span> x0<span style="color:#f92672">*</span>x2<span style="color:#f92672">*</span>x3 <span style="color:#f92672">+</span> x0<span style="color:#f92672">*</span>x1 <span style="color:#f92672">+</span> x0<span style="color:#f92672">*</span>x3 <span style="color:#f92672">+</span> x1<span style="color:#f92672">*</span>x3 <span style="color:#f92672">+</span> x2 <span style="color:#f92672">+</span> x3 <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>, 
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">lambda</span> x0, x1, x2, x3: x0<span style="color:#f92672">*</span>x1<span style="color:#f92672">*</span>x2 <span style="color:#f92672">+</span> x0<span style="color:#f92672">*</span>x1<span style="color:#f92672">*</span>x3 <span style="color:#f92672">+</span> x0<span style="color:#f92672">*</span>x2<span style="color:#f92672">*</span>x3 <span style="color:#f92672">+</span> x1<span style="color:#f92672">*</span>x2 <span style="color:#f92672">+</span> x0 <span style="color:#f92672">+</span> x1 <span style="color:#f92672">+</span> x3 <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>]
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>Af <span style="color:#f92672">=</span> matrix(F2, [A[i] <span style="color:#66d9ef">for</span> i <span style="color:#f92672">in</span> range(K <span style="color:#f92672">*</span> n) <span style="color:#66d9ef">if</span> i <span style="color:#f92672">%</span> <span style="color:#ae81ff">4</span> <span style="color:#f92672">==</span> <span style="color:#ae81ff">0</span>][:n])
</span></span><span style="display:flex;"><span>Ar <span style="color:#f92672">=</span> Af<span style="color:#f92672">.</span>right_kernel_matrix()
</span></span><span style="display:flex;"><span>nbv <span style="color:#f92672">=</span> Ar<span style="color:#f92672">.</span>dimensions()[<span style="color:#ae81ff">0</span>]
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>P <span style="color:#f92672">=</span> BooleanPolynomialRing(nbv, <span style="color:#e6db74">&#39;x&#39;</span>)
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>Af2 <span style="color:#f92672">=</span> matrix(F2, [A[i] <span style="color:#66d9ef">for</span> i <span style="color:#f92672">in</span> range(K <span style="color:#f92672">*</span> n) <span style="color:#66d9ef">if</span> i <span style="color:#f92672">%</span> <span style="color:#ae81ff">4</span> <span style="color:#f92672">==</span> <span style="color:#ae81ff">0</span>][:n]) <span style="color:#75715e"># can onkly have n here instead of 5n/4</span>
</span></span><span style="display:flex;"><span>Ar2 <span style="color:#f92672">=</span> Af2<span style="color:#f92672">.</span>right_kernel_matrix()
</span></span><span style="display:flex;"><span>dxs <span style="color:#f92672">=</span> Ar2[<span style="color:#ae81ff">0</span>]
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">def</span> <span style="color:#a6e22e">H_pol</span>(state):
</span></span><span style="display:flex;"><span>    state <span style="color:#f92672">=</span> matrix(F2, A) <span style="color:#f92672">*</span> vector(state)
</span></span><span style="display:flex;"><span>    ns <span style="color:#f92672">=</span> [<span style="color:#ae81ff">0</span>] <span style="color:#f92672">*</span> len(state)
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">for</span> i <span style="color:#f92672">in</span> range(<span style="color:#ae81ff">0</span>, len(state), <span style="color:#ae81ff">4</span>):
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">for</span> j <span style="color:#f92672">in</span> range(<span style="color:#ae81ff">4</span>):
</span></span><span style="display:flex;"><span>            ns[i <span style="color:#f92672">+</span> j] <span style="color:#f92672">=</span> pols[j](state[i], state[i <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>], state[i <span style="color:#f92672">+</span> <span style="color:#ae81ff">2</span>], state[i <span style="color:#f92672">+</span> <span style="color:#ae81ff">3</span>])
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">return</span> vector(ns)
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>xs <span style="color:#f92672">=</span> sum(v <span style="color:#f92672">*</span> ak <span style="color:#66d9ef">for</span> v, ak <span style="color:#f92672">in</span> zip(P<span style="color:#f92672">.</span>gens(), Ar))
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>diff_state <span style="color:#f92672">=</span> list(matrix(F2, B) <span style="color:#f92672">*</span>(H_pol(xs) <span style="color:#f92672">+</span> H_pol( xs <span style="color:#f92672">+</span> dxs)))
</span></span><span style="display:flex;"><span>print([p<span style="color:#f92672">.</span>degree() <span style="color:#66d9ef">for</span> p <span style="color:#f92672">in</span> diff_state])
</span></span></code></pre></div><p>we get :</p>
<pre tabindex="0"><code>[2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2]
</code></pre><p>Well &hellip; all of them are affected, but if you try to solve this using Gröbner-basis, you&hellip;.. atually <strong>succeed</strong> WTF ? up to like n=128 ???? But fail at n=256 (probably still doable for a big machine).</p>
<p>Solving such a big system (even for n=64) in matter of seconds means there is hidden linearity and&hellip; Well I was quite dumb not to see it but its the matrix $B$ mixing the degree $2$&hellip; If I remove the matrix mul in the final differential state this becomes clear :</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-python" data-lang="python"><span style="display:flex;"><span>diff_state <span style="color:#f92672">=</span> list((H_pol(xs) <span style="color:#f92672">+</span> H_pol( xs <span style="color:#f92672">+</span> dxs)))
</span></span></code></pre></div><p>gives :</p>
<pre tabindex="0"><code>[1, 1, 1, 1, -1, -1, -1, -1, 1, 1, 1, 1, -1, -1, -1, -1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, -1, -1, -1, -1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 0, -1, -1, -1, -1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1, -1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, 1, 1, 1, 1, -1, -1, -1, -1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, -1, -1, -1, -1, -1, -1, -1, -1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 2, 2, 2, 1, 2, 2, 2, 1, 2, 2, 2, 1, 2, 1, 2, 1, 2, 2, 2, 1, 2, 2, 2, 1, 2, 2, 2, 1, 1, 2, 1, 1, 2, 2, 2, 1, 1, 2, 1, 1, 2, 2, 2, 1, 1, 2, 1, 1, 2, 2, 2, 1, 1, 2, 1, 1, 2, 2, 2, 1, 2, 2, 2]
</code></pre><p>And now&hellip;&hellip;.</p>
<figure><img src="/images/stuck.jpeg">
</figure>

<p>&hellip; Yes I did&hellip;</p>
<p>But after a few hours I realized that I was still chosing my differential randomly and that this was probably pretty dumb, so looking back at it&hellip; If you dont activate the SBoxes well you dont really care about the degree, having that in mind the code for choosing the differential not only should have the first bit of the degree-reduced SBoxes to $0$ but ALSO, ALL the bits of the non degree-reduced SBoxes to $0$.</p>
<p>Thats clearer when looking at the code, the previous choice was:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-python" data-lang="python"><span style="display:flex;"><span>Af2 <span style="color:#f92672">=</span> matrix(F2, [A[i] <span style="color:#66d9ef">for</span> i <span style="color:#f92672">in</span> range(K <span style="color:#f92672">*</span> n) <span style="color:#66d9ef">if</span> i <span style="color:#f92672">%</span> <span style="color:#ae81ff">4</span> <span style="color:#f92672">==</span> <span style="color:#ae81ff">0</span>][:n]) <span style="color:#75715e"># can onkly have n here instead of 5n/4</span>
</span></span><span style="display:flex;"><span>dxs <span style="color:#f92672">=</span> Af2<span style="color:#f92672">.</span>right_kernel_matrix()[<span style="color:#ae81ff">0</span>]
</span></span></code></pre></div><p>and now:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-python" data-lang="python"><span style="display:flex;"><span>Af2 <span style="color:#f92672">=</span> matrix(F2, [A[i] <span style="color:#66d9ef">for</span> i <span style="color:#f92672">in</span> range(K <span style="color:#f92672">*</span> n) <span style="color:#66d9ef">if</span> i <span style="color:#f92672">%</span> <span style="color:#ae81ff">4</span> <span style="color:#f92672">==</span> <span style="color:#ae81ff">0</span>][:n] <span style="color:#f92672">+</span> [A[i] <span style="color:#66d9ef">for</span> i <span style="color:#f92672">in</span> range(K <span style="color:#f92672">*</span> n)][<span style="color:#f92672">-</span>n:])
</span></span><span style="display:flex;"><span>dxs <span style="color:#f92672">=</span> Af2<span style="color:#f92672">.</span>right_kernel_matrix()[<span style="color:#ae81ff">0</span>]
</span></span></code></pre></div><h2 id="putting-it-all-together">Putting it all together</h2>
<p>Putting it all together and you get the flag : <code>b7691eedfcb698bf84bcf00e9fae9156f924bc95ecb73b6e0915a87b532549dff0ffbe4095d6cc5511ebbd4fcc293bbd67875657ae37075e13dd706c449a578a</code></p>
<p>Here is my <del>quite dirty</del> solve:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-python" data-lang="python"><span style="display:flex;"><span><span style="color:#f92672">from</span> Crypto.Util.number <span style="color:#f92672">import</span> <span style="color:#f92672">*</span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">from</span> sage.all <span style="color:#f92672">import</span> <span style="color:#f92672">*</span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">from</span> gmo.all <span style="color:#f92672">import</span> <span style="color:#f92672">*</span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">import</span> random
</span></span><span style="display:flex;"><span><span style="color:#f92672">from</span> splhash <span style="color:#f92672">import</span> Splhash
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">def</span> <span style="color:#a6e22e">pack</span>(bits, width):
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">return</span> [
</span></span><span style="display:flex;"><span>        sum((bits[i <span style="color:#f92672">+</span> j]) <span style="color:#f92672">&lt;&lt;</span> j <span style="color:#66d9ef">for</span> j <span style="color:#f92672">in</span> range(width))
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">for</span> i <span style="color:#f92672">in</span> range(<span style="color:#ae81ff">0</span>, len(bits), width)
</span></span><span style="display:flex;"><span>    ]
</span></span><span style="display:flex;"><span>F2 <span style="color:#f92672">=</span> GF(<span style="color:#ae81ff">2</span>)
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>n <span style="color:#f92672">=</span> <span style="color:#ae81ff">256</span>
</span></span><span style="display:flex;"><span>K <span style="color:#f92672">=</span> <span style="color:#ae81ff">5</span> <span style="color:#75715e"># 5 in chall</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>random<span style="color:#f92672">.</span>seed(<span style="color:#ae81ff">0</span>)
</span></span><span style="display:flex;"><span>A <span style="color:#f92672">=</span> [ random<span style="color:#f92672">.</span>choices([<span style="color:#ae81ff">0</span>, <span style="color:#ae81ff">1</span>], k <span style="color:#f92672">=</span> <span style="color:#ae81ff">2</span> <span style="color:#f92672">*</span> n) <span style="color:#66d9ef">for</span> _ <span style="color:#f92672">in</span> range(K <span style="color:#f92672">*</span> n) ]
</span></span><span style="display:flex;"><span>B <span style="color:#f92672">=</span> [ random<span style="color:#f92672">.</span>choices([<span style="color:#ae81ff">0</span>, <span style="color:#ae81ff">1</span>], k <span style="color:#f92672">=</span> K <span style="color:#f92672">*</span> n) <span style="color:#66d9ef">for</span> _ <span style="color:#f92672">in</span> range(n) ]
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>H <span style="color:#f92672">=</span> Splhash(<span style="color:#ae81ff">0</span>, n, K)
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>S <span style="color:#f92672">=</span> [<span style="color:#ae81ff">12</span>, <span style="color:#ae81ff">5</span>, <span style="color:#ae81ff">6</span>, <span style="color:#ae81ff">11</span>, <span style="color:#ae81ff">9</span>, <span style="color:#ae81ff">0</span>, <span style="color:#ae81ff">10</span>, <span style="color:#ae81ff">13</span>, <span style="color:#ae81ff">3</span>, <span style="color:#ae81ff">14</span>, <span style="color:#ae81ff">15</span>, <span style="color:#ae81ff">8</span>, <span style="color:#ae81ff">4</span>, <span style="color:#ae81ff">7</span>, <span style="color:#ae81ff">1</span>, <span style="color:#ae81ff">2</span>]
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>P <span style="color:#f92672">=</span> BooleanPolynomialRing(<span style="color:#ae81ff">2</span><span style="color:#f92672">*</span>n,<span style="color:#e6db74">&#39;x&#39;</span>)
</span></span><span style="display:flex;"><span>xs <span style="color:#f92672">=</span> vector(P<span style="color:#f92672">.</span>gens()), vector(F2, [random<span style="color:#f92672">.</span>randint(<span style="color:#ae81ff">0</span>, <span style="color:#ae81ff">1</span>) <span style="color:#66d9ef">for</span> _ <span style="color:#f92672">in</span> range(<span style="color:#ae81ff">2</span><span style="color:#f92672">*</span>n)])
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>pols <span style="color:#f92672">=</span> [<span style="color:#66d9ef">lambda</span> x0, x1, x2, x3: x1<span style="color:#f92672">*</span>x2 <span style="color:#f92672">+</span> x0 <span style="color:#f92672">+</span> x2 <span style="color:#f92672">+</span> x3, 
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">lambda</span> x0, x1, x2, x3: x0<span style="color:#f92672">*</span>x1<span style="color:#f92672">*</span>x2 <span style="color:#f92672">+</span> x0<span style="color:#f92672">*</span>x1<span style="color:#f92672">*</span>x3 <span style="color:#f92672">+</span> x0<span style="color:#f92672">*</span>x2<span style="color:#f92672">*</span>x3 <span style="color:#f92672">+</span> x1<span style="color:#f92672">*</span>x3 <span style="color:#f92672">+</span> x2<span style="color:#f92672">*</span>x3 <span style="color:#f92672">+</span> x1 <span style="color:#f92672">+</span> x3, 
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">lambda</span> x0, x1, x2, x3: x0<span style="color:#f92672">*</span>x1<span style="color:#f92672">*</span>x3 <span style="color:#f92672">+</span> x0<span style="color:#f92672">*</span>x2<span style="color:#f92672">*</span>x3 <span style="color:#f92672">+</span> x0<span style="color:#f92672">*</span>x1 <span style="color:#f92672">+</span> x0<span style="color:#f92672">*</span>x3 <span style="color:#f92672">+</span> x1<span style="color:#f92672">*</span>x3 <span style="color:#f92672">+</span> x2 <span style="color:#f92672">+</span> x3 <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>, 
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">lambda</span> x0, x1, x2, x3: x0<span style="color:#f92672">*</span>x1<span style="color:#f92672">*</span>x2 <span style="color:#f92672">+</span> x0<span style="color:#f92672">*</span>x1<span style="color:#f92672">*</span>x3 <span style="color:#f92672">+</span> x0<span style="color:#f92672">*</span>x2<span style="color:#f92672">*</span>x3 <span style="color:#f92672">+</span> x1<span style="color:#f92672">*</span>x2 <span style="color:#f92672">+</span> x0 <span style="color:#f92672">+</span> x1 <span style="color:#f92672">+</span> x3 <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>]
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>Af <span style="color:#f92672">=</span> matrix(F2, [A[i] <span style="color:#66d9ef">for</span> i <span style="color:#f92672">in</span> range(K <span style="color:#f92672">*</span> n) <span style="color:#66d9ef">if</span> i <span style="color:#f92672">%</span> <span style="color:#ae81ff">4</span> <span style="color:#f92672">==</span> <span style="color:#ae81ff">0</span>][:n])
</span></span><span style="display:flex;"><span>Ar <span style="color:#f92672">=</span> Af<span style="color:#f92672">.</span>right_kernel_matrix()
</span></span><span style="display:flex;"><span>nbv <span style="color:#f92672">=</span> Ar<span style="color:#f92672">.</span>dimensions()[<span style="color:#ae81ff">0</span>]
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>P <span style="color:#f92672">=</span> BooleanPolynomialRing(nbv, <span style="color:#e6db74">&#39;x&#39;</span>)
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>Af2 <span style="color:#f92672">=</span> matrix(F2, [A[i] <span style="color:#66d9ef">for</span> i <span style="color:#f92672">in</span> range(K <span style="color:#f92672">*</span> n) <span style="color:#66d9ef">if</span> i <span style="color:#f92672">%</span> <span style="color:#ae81ff">4</span> <span style="color:#f92672">==</span> <span style="color:#ae81ff">0</span>][:n] <span style="color:#f92672">+</span> [A[i] <span style="color:#66d9ef">for</span> i <span style="color:#f92672">in</span> range(K <span style="color:#f92672">*</span> n)][<span style="color:#f92672">-</span>n:])
</span></span><span style="display:flex;"><span>dxs <span style="color:#f92672">=</span> Af2<span style="color:#f92672">.</span>right_kernel_matrix()[<span style="color:#ae81ff">0</span>]
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">def</span> <span style="color:#a6e22e">H_pol</span>(state):
</span></span><span style="display:flex;"><span>    state <span style="color:#f92672">=</span> matrix(F2, A) <span style="color:#f92672">*</span> vector(state)
</span></span><span style="display:flex;"><span>    ns <span style="color:#f92672">=</span> [<span style="color:#ae81ff">0</span>] <span style="color:#f92672">*</span> len(state)
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">for</span> i <span style="color:#f92672">in</span> range(<span style="color:#ae81ff">0</span>, len(state), <span style="color:#ae81ff">4</span>):
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">if</span> state[i] <span style="color:#f92672">!=</span> <span style="color:#ae81ff">0</span>: print(i)
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">for</span> j <span style="color:#f92672">in</span> range(<span style="color:#ae81ff">4</span>):
</span></span><span style="display:flex;"><span>            ns[i <span style="color:#f92672">+</span> j] <span style="color:#f92672">=</span> pols[j](state[i], state[i <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>], state[i <span style="color:#f92672">+</span> <span style="color:#ae81ff">2</span>], state[i <span style="color:#f92672">+</span> <span style="color:#ae81ff">3</span>])
</span></span><span style="display:flex;"><span>    state <span style="color:#f92672">=</span> vector(ns)
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">return</span> vector(state)
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>xs <span style="color:#f92672">=</span> sum(v <span style="color:#f92672">*</span> ak <span style="color:#66d9ef">for</span> v, ak <span style="color:#f92672">in</span> zip(P<span style="color:#f92672">.</span>gens(), Ar))
</span></span><span style="display:flex;"><span>diff_state <span style="color:#f92672">=</span> list(matrix(F2, B) <span style="color:#f92672">*</span>(H_pol(xs) <span style="color:#f92672">+</span> H_pol( xs <span style="color:#f92672">+</span> dxs)))
</span></span><span style="display:flex;"><span>csts <span style="color:#f92672">=</span> vector(F2, [pol<span style="color:#f92672">.</span>constant_coefficient() <span style="color:#66d9ef">for</span> pol <span style="color:#f92672">in</span> diff_state])
</span></span><span style="display:flex;"><span>pl <span style="color:#f92672">=</span> Sequence(pol <span style="color:#f92672">+</span> cs <span style="color:#66d9ef">for</span> pol, cs <span style="color:#f92672">in</span> zip(diff_state, csts))
</span></span><span style="display:flex;"><span>M, u <span style="color:#f92672">=</span> pl<span style="color:#f92672">.</span>coefficients_monomials()
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>print(<span style="color:#e6db74">&#34;solvring&#34;</span>, u, flush<span style="color:#f92672">=</span><span style="color:#66d9ef">True</span>)
</span></span><span style="display:flex;"><span>print(<span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;</span><span style="color:#e6db74">{</span>K <span style="color:#e6db74">= }</span><span style="color:#e6db74">&#34;</span>)
</span></span><span style="display:flex;"><span>print(<span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;</span><span style="color:#e6db74">{</span>n <span style="color:#e6db74">= }</span><span style="color:#e6db74">&#34;</span>)
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>print(M<span style="color:#f92672">.</span>dimensions(), M<span style="color:#f92672">.</span>rank())
</span></span><span style="display:flex;"><span>us <span style="color:#f92672">=</span> M<span style="color:#f92672">.</span>solve_right(csts)
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>x <span style="color:#f92672">=</span> vector(F2, [xss<span style="color:#f92672">.</span>subs({ue: use <span style="color:#66d9ef">for</span> ue, use <span style="color:#f92672">in</span> zip(u, us)}) <span style="color:#66d9ef">for</span> xss <span style="color:#f92672">in</span> xs])
</span></span><span style="display:flex;"><span>y <span style="color:#f92672">=</span> x <span style="color:#f92672">+</span> dxs
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>x, y <span style="color:#f92672">=</span> bytes(pack(list(map(int, x)), <span style="color:#ae81ff">8</span>)), bytes(pack(list(map(int, y)), <span style="color:#ae81ff">8</span>))
</span></span><span style="display:flex;"><span>print(<span style="color:#e6db74">&#34;x =&#34;</span>, x<span style="color:#f92672">.</span>hex())
</span></span><span style="display:flex;"><span>print(<span style="color:#e6db74">&#34;y =&#34;</span>, y<span style="color:#f92672">.</span>hex())
</span></span><span style="display:flex;"><span>print(<span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;</span><span style="color:#e6db74">{</span>H(x) <span style="color:#f92672">==</span> H(y)<span style="color:#e6db74">}</span><span style="color:#e6db74">&#34;</span>)
</span></span></code></pre></div>]]></description>
      
    </item>
    
    
  </channel>
</rss>
