<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Cryptography on Giap's Blog</title><link>https://giapppp.github.io/tags/cryptography/</link><description>Recent content in Cryptography on Giap's Blog</description><generator>Hugo -- gohugo.io</generator><language>en</language><lastBuildDate>Mon, 22 Apr 2024 00:00:00 +0000</lastBuildDate><atom:link href="https://giapppp.github.io/tags/cryptography/index.xml" rel="self" type="application/rss+xml"/><item><title>Square Attack</title><link>https://giapppp.github.io/posts/square-attack/</link><pubDate>Mon, 22 Apr 2024 00:00:00 +0000</pubDate><guid>https://giapppp.github.io/posts/square-attack/</guid><description>&lt;p>Square Attack on reduced-round AES, with examples for four and five rounds.&lt;/p>
&lt;h1 id="week-1-square-attack">Week 1: Square Attack&lt;/h1>
&lt;p>Square Attack là một kĩ thuật tấn công đối với Block Cipher khi khai thác vào các tính chất không đổi của các round encryption trong cipher đó. Kĩ thuật này được phát hiện lần đầu tiên đối với &lt;a href="http://cse.iitkgp.ac.in/~debdeep/courses_iitkgp/Crypto/papers/square.pdf">Square Cipher&lt;/a>. Trong bài viết này, mình sẽ tập trung vào việc khai thác AES 4 round và giải một số bài liên quan đến kĩ thuật này. Ngoài ra, ta cũng sẽ thảo luận về áp dụng Square Attack cho 5 round AES&lt;/p>
&lt;h2 id="tài-liệu">Tài liệu&lt;/h2>
&lt;p>&lt;a href="https://www.davidwong.fr/blockbreakers/square.html">https://www.davidwong.fr/blockbreakers/square.html&lt;/a>&lt;/p>
&lt;h2 id="chi-tiết">Chi tiết&lt;/h2>
&lt;h3 id="aes-3-round">AES 3 round&lt;/h3>
&lt;p>Kí hiệu &lt;strong>$\varLambda$-set&lt;/strong> là tập hợp các bytearray phân biệt có độ dài 16 và khác nhau tại vị trí &lt;code>idx&lt;/code>, được gọi là &lt;strong>active index&lt;/strong>. Các active index này sẽ nhận toàn bộ các giá trị từ 0 đến 255 trong $\varLambda$-set. Lưu ý rằng $\varLambda$-set có thể có nhiều active index&lt;/p>
&lt;p>Xét trường hợp $\varLambda$-set của chúng ta chỉ có 1 active index, giả sử &lt;code>idx = 0&lt;/code>, ta sẽ phân tích output của từng phần tử khi trải qua các bước trong AES, gồm &lt;strong>SubBytes&lt;/strong>, &lt;strong>ShiftRows&lt;/strong>, &lt;strong>MixColumns&lt;/strong> và &lt;strong>AddRoundKey&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;strong>AddRoundKey&lt;/strong>&lt;/li>
&lt;/ul>
&lt;p>&lt;img src="https://giapppp.github.io/images/square-attack/square-attack_1.png" alt="image">&lt;/p>
&lt;p>Sau khi tất cả các phần tử trong $\varLambda$-set thực hiện bước này, ta vẫn sẽ thu được $\varLambda$-set với active index bằng 0&lt;/p>
&lt;ul>
&lt;li>&lt;strong>SubBytes&lt;/strong>&lt;/li>
&lt;/ul>
&lt;p>&lt;img src="https://giapppp.github.io/images/square-attack/square-attack_2.png" alt="image">&lt;/p>
&lt;p>Do với mỗi giá trị &lt;code>i&lt;/code> thì &lt;code>SBOX[i]&lt;/code> sẽ có một giá trị duy nhất nên khi thực hiện bước này, các non-active index vẫn sẽ là các non-active index, còn các active index vẫn không thay đổi, chính vì vậy, ta vẫn sẽ thu được $\varLambda$-set&lt;/p>
&lt;ul>
&lt;li>&lt;strong>ShiftRow&lt;/strong>&lt;/li>
&lt;/ul>
&lt;p>&lt;img src="https://giapppp.github.io/images/square-attack/square-attack_3.png" alt="image">&lt;/p>
&lt;p>Với bước này, các byte chỉ đổi chỗ cho nhau, vì thế ta vẫn sẽ thu được $\varLambda$-set (có thể với index không như trước do bị đổi chỗ, nhưng về bản chất vẫn là $\varLambda$-set)&lt;/p>
&lt;ul>
&lt;li>&lt;strong>MixColumns&lt;/strong>&lt;/li>
&lt;/ul>
&lt;p>&lt;img src="https://giapppp.github.io/images/square-attack/square-attack_4.png" alt="image">&lt;/p>
&lt;p>Với bước này, ta cần nhắc lại cách mà hàm MixColumns hoạt động: Ta có thể tính được column sau khi biến đổi bằng công thức&lt;/p>
&lt;p>$$\begin{bmatrix}d_{0}\d_{1}\d_{2}\d_{3}\end{bmatrix} =\begin{bmatrix}2&amp;amp;3&amp;amp;1&amp;amp;1\1&amp;amp;2&amp;amp;3&amp;amp;1\1&amp;amp;1&amp;amp;2&amp;amp;3\3&amp;amp;1&amp;amp;1&amp;amp;2\end{bmatrix}\begin{bmatrix}b_{0}\b_{1}\b_{2}\b_{3}\end{bmatrix}$$&lt;/p>
&lt;p>Vì thế, với 1 bytes thay đổi, ta có thể gây ảnh hưởng đến 3 bytes còn lại trong cột đó.&lt;/p>
&lt;p>Sau bước này, ta sẽ có thêm 3 active index, do mỗi byte trong kết quả thu được là tổ hợp tuyến tính giữa 4 byte, gồm 3 byte cố định và 1 byte thay đổi. Ví dụ như $$d_0 = 2b_0 + 3b_1 + b_2 + b_3$$&lt;/p>
&lt;p>Nếu ta cho $b_0$ chạy từ 0 đến 255, do các giá trị $b_1, b_2, b_3$ cố định nên $d_0$ cũng sẽ chạy từ 0 đến 255. Tương tự với $d_1, d_2, d_3$&lt;/p>
&lt;p>Vậy qua 1 round, từ 1 active index, ta sẽ thu được $\varLambda$-set có 4 active index. Bây giờ, ta sẽ cho $\varLambda$-set chạy qua 3 round.&lt;/p>
&lt;p>&lt;img src="https://giapppp.github.io/images/square-attack/square-attack_5.png" alt="image">&lt;/p>
&lt;p>Khi xong round thứ 3, ta không còn thu được $\varLambda$-set nữa. Nhưng ta có thể suy ra một tính chất như sau: Ta xor toàn bộ byte đầu của các phần tử sau khi trải qua bước &lt;strong>AddRoundKey&lt;/strong>, ta sẽ có&lt;/p>
&lt;p>$$\begin{aligned} S_0 &amp;amp;= b_0 \oplus b_1 \oplus &amp;hellip; \oplus b_{255} \ &amp;amp;= (2 a_{0, 0} \oplus 3 a_{0, 1} \oplus 1 a_{0, 2} \oplus 1 a_{0, 3}) \oplus (2 a_{1, 0} \oplus 3 a_{1, 1} \oplus 1 a_{1, 2} \oplus 1 a_{1, 3}) \oplus &amp;hellip;\oplus (2 a_{255, 0} \oplus 3 a_{255, 1} \oplus 1 a_{255, 2} \oplus 1 a_{255, 3}) \ &amp;amp;= 2 (a_{0,0} \oplus .. \oplus a_{255, 0}) + 3(a_{0,1} \oplus .. \oplus a_{255, 1}) + 1 (a_{0,2} \oplus .. \oplus a_{255, 2}) + 1 (a_{0,3} \oplus .. \oplus a_{255, 3}) \ &amp;amp;= 0\end{aligned}$$&lt;/p>
&lt;p>Lưu ý rằng không chỉ byte đầu, mà toàn bộ các byte còn lại cũng sẽ có tính chất này. Ta gọi tính chất này là (*) và sẽ sử dụng nó để break AES 4 round.&lt;/p>
&lt;h3 id="aes-4-round">AES 4 Round&lt;/h3>
&lt;p>Ta hãy xem qua các bước của AES 4 round:&lt;/p>
&lt;p>&lt;img src="https://giapppp.github.io/images/square-attack/square-attack_6.png" alt="image">&lt;/p>
&lt;p>Với tính chất thu được ở trên, ta có thể tìm được 1 byte ở vị trí &lt;code>i&lt;/code> của roundKey thứ 4 bằng chiến thuật sau:&lt;/p>
&lt;ol>
&lt;li>
&lt;p>Generate $\varLambda$-set với active index là &lt;code>i&lt;/code>, sau đó encrypt toàn bộ các phần tử trong set. Ta gọi tập các phần tử nhận được là &lt;strong>enc-$\varLambda$-set&lt;/strong>&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Đoán &lt;code>roundKey[4][i] = guess&lt;/code> là một giá trị từ 0-255&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Với mỗi &lt;code>ciphertext&lt;/code> trong &lt;strong>enc-$\varLambda$-set&lt;/strong>, ta sẽ thay đổi &lt;code>ciphertext[i] = ciphertext[i] ^ roundKey[i]&lt;/code>. Sau đó, &lt;code>ciphertext&lt;/code> mới của chúng ta sẽ đi qua 2 bước là &lt;code>InvShiftRows&lt;/code> và &lt;code>InvSubBytes&lt;/code>. Ta gọi tập các phần tử nhận được lúc này là &lt;strong>enc2-$\varLambda$-set&lt;/strong>&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Kiểm tra xem &lt;strong>enc2-$\varLambda$-set&lt;/strong> của chúng ta có thỏa mãn tính chất (*) hay không. Nếu có, &lt;code>guess&lt;/code> có thể chính là giá trị ta đang cần tìm.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Nếu có nhiều giá trị &lt;code>guess&lt;/code> thỏa mãn, ta nên regenerate $\varLambda$-set cho đến khi chỉ tìm được duy nhất 1 giá trị thỏa mãn&lt;/p>
&lt;/li>
&lt;/ol>
&lt;p>Từ đó, ta có thể tìm được roundKey thứ 4 của Cipher, và có thể reverse được Key mà Cipher đang sử dụng.&lt;/p>
&lt;h3 id="ví-dụ">Ví dụ&lt;/h3>
&lt;h4 id="aes4round1">aes4round1&lt;/h4>
&lt;p>&lt;code>chall.py&lt;/code>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">miniAES&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">os&lt;/span>&lt;span class="o">,&lt;/span>&lt;span class="nn">sys&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">FLAG&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="sa">b&lt;/span>&lt;span class="s2">&amp;#34;W1&lt;/span>&lt;span class="si">{test_e3d27b80b9a6595adc655c8518c4c0fd}&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;&amp;#39;&amp;#39;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s1">=============================================================
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s1">| Welcome to miniAES system!!! |
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s1">=============================================================
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s1">&amp;#39;&amp;#39;&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">key&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">os&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">urandom&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">16&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">try&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">while&lt;/span> &lt;span class="kc">True&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">pt&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nb">input&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;[-] plaintext(hex): &amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">pt&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="s1">&amp;#39;&amp;#39;&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">break&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">pt&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nb">bytes&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">fromhex&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">pt&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">ct&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">miniAES&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">encrypt&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">pt&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">key&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;[+] ciphertext(hex): &lt;/span>&lt;span class="si">%s&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span> &lt;span class="o">%&lt;/span> &lt;span class="n">ct&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">hex&lt;/span>&lt;span class="p">())&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">guess&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nb">input&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;key(hex): &amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">guess&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="n">key&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">hex&lt;/span>&lt;span class="p">():&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;!!! &lt;/span>&lt;span class="si">%s&lt;/span>&lt;span class="se">\n&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span> &lt;span class="o">%&lt;/span> &lt;span class="n">FLAG&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">decode&lt;/span>&lt;span class="p">())&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">else&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;???&lt;/span>&lt;span class="se">\n&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">sys&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">exit&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">except&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">sys&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">exit&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>(&lt;code>miniAES&lt;/code> chỉ là cài đặt lại AES, vì thế mình sẽ không đề cập đến)&lt;/p>
&lt;p>Đối với bài này, ta chỉ cần áp dụng lí thuyết mà mình đã đề cập ở trên.&lt;/p>
&lt;p>Một số lưu ý với code của mình:&lt;/p>
&lt;ul>
&lt;li>Các bạn có thể download lib &lt;code>aeskeyschedule&lt;/code> tại &lt;a href="https://github.com/fanosta/aeskeyschedule">đây&lt;/a>&lt;/li>
&lt;li>Ở đây, ta có thể thực hiện &lt;code>A_set_dec ^= InvS_box[ele[idx] ^ i]&lt;/code> thay vì chạy tuần tự các bước trên do ta chỉ quan tâm đến giá trị chứ không quan tâm đến vị trí, vậy nên tính &lt;code>A_set_dec&lt;/code> như vậy là đủ.&lt;/li>
&lt;/ul>
&lt;p>&lt;code>solve.py&lt;/code>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="kn">from&lt;/span> &lt;span class="nn">pwn&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="o">*&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">from&lt;/span> &lt;span class="nn">tqdm&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="o">*&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">os&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">from&lt;/span> &lt;span class="nn">miniAES&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="o">*&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">from&lt;/span> &lt;span class="nn">aeskeyschedule&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="n">reverse_key_schedule&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">target&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">process&lt;/span>&lt;span class="p">([&lt;/span>&lt;span class="s2">&amp;#34;python3&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;chall.py&amp;#34;&lt;/span>&lt;span class="p">])&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">def&lt;/span> &lt;span class="nf">encrypt&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">pt&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="nb">bytes&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">target&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">sendlineafter&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">b&lt;/span>&lt;span class="s2">&amp;#34;[-] plaintext(hex): &amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">pt&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">hex&lt;/span>&lt;span class="p">()&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">encode&lt;/span>&lt;span class="p">())&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">ct&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">target&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">recvline&lt;/span>&lt;span class="p">()[:&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">][&lt;/span>&lt;span class="nb">len&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;[+] ciphertext(hex): &amp;#34;&lt;/span>&lt;span class="p">):]&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">decode&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="nb">bytes&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">fromhex&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">ct&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">def&lt;/span> &lt;span class="nf">find_key_bytes&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">idx&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="nb">int&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">real_ans&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nb">set&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nb">list&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nb">range&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">256&lt;/span>&lt;span class="p">)))&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">key_pos&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">5&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">10&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">15&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">4&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">9&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">14&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">3&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">8&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">13&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">2&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">7&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">12&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">6&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">11&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">while&lt;/span> &lt;span class="kc">True&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">ans&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nb">set&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">A_set&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">[]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">init&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">os&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">urandom&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">16&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">for&lt;/span> &lt;span class="n">i&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="nb">range&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">256&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">temp&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nb">bytearray&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">init&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">temp&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="n">idx&lt;/span>&lt;span class="p">]&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">i&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">A_set&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="n">encrypt&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">temp&lt;/span>&lt;span class="p">)]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">for&lt;/span> &lt;span class="n">i&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="nb">range&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">256&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">A_set_dec&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">0&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">for&lt;/span> &lt;span class="n">ele&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="n">A_set&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># temp = bytearray(ele)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># temp[idx] ^= i&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># ele_dec_arr = list(temp)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># InvShiftRows(ele_dec_arr)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># InvSubBytes(ele_dec_arr)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># A_set_dec ^= ele_dec_arr[key_pos[idx]]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">A_set_dec&lt;/span> &lt;span class="o">^=&lt;/span> &lt;span class="n">InvS_box&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="n">ele&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="n">idx&lt;/span>&lt;span class="p">]&lt;/span> &lt;span class="o">^&lt;/span> &lt;span class="n">i&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">A_set_dec&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">ans&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">add&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">i&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">real_ans&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">intersection_update&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">ans&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="nb">len&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">real_ans&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="n">real_ans&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">pop&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">key&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">[]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">for&lt;/span> &lt;span class="n">i&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="n">tqdm&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nb">range&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">16&lt;/span>&lt;span class="p">)):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">ans&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">find_key_bytes&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">i&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">key&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">append&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">ans&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">hexkey&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">reverse_key_schedule&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nb">bytes&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">key&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="mi">4&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">hex&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">target&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">sendline&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">b&lt;/span>&lt;span class="s2">&amp;#34;&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">target&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">sendlineafter&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">b&lt;/span>&lt;span class="s2">&amp;#34;key(hex): &amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">hexkey&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">encode&lt;/span>&lt;span class="p">())&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">hexkey&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">target&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">interactive&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h4 id="aes4rounds2">aes4rounds2&lt;/h4>
&lt;p>&lt;code>main.py&lt;/code>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="kn">from&lt;/span> &lt;span class="nn">spiral&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="n">Spiral&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">from&lt;/span> &lt;span class="nn">secret&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="n">flag&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">from&lt;/span> &lt;span class="nn">os&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="n">urandom&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">menu&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s2">&amp;#34;&amp;#34;&amp;#34;Options:
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s2">1. Get encrypted flag
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s2">2. Encrypt message&amp;#34;&amp;#34;&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">key&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">urandom&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">16&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">cipher&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">Spiral&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">key&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">rounds&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="mi">4&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">def&lt;/span> &lt;span class="nf">main&lt;/span>&lt;span class="p">():&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">menu&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">while&lt;/span> &lt;span class="kc">True&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">try&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">option&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nb">int&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nb">input&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;&amp;gt;&amp;gt;&amp;gt; &amp;#34;&lt;/span>&lt;span class="p">))&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">option&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">ciphertext&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">cipher&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">encrypt&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">flag&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">ciphertext&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">hex&lt;/span>&lt;span class="p">())&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">elif&lt;/span> &lt;span class="n">option&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="mi">2&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">plaintext&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nb">bytes&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">fromhex&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nb">input&lt;/span>&lt;span class="p">())&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">ciphertext&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">cipher&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">encrypt&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">plaintext&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">ciphertext&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">hex&lt;/span>&lt;span class="p">())&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">else&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;Please select a valid option&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">except&lt;/span> &lt;span class="ne">Exception&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;Something went wrong, please try again.&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">if&lt;/span> &lt;span class="vm">__name__&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="s2">&amp;#34;__main__&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">main&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;code>spiral.py&lt;/code>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="kn">from&lt;/span> &lt;span class="nn">utils&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="o">*&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">class&lt;/span> &lt;span class="nc">Spiral&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">def&lt;/span> &lt;span class="fm">__init__&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="bp">self&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">key&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">rounds&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="mi">4&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">rounds&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">rounds&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">keys&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="n">bytes2matrix&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">key&lt;/span>&lt;span class="p">)]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">BLOCK_SIZE&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">16&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">for&lt;/span> &lt;span class="n">i&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="nb">range&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">rounds&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">keys&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">append&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">spiralLeft&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">keys&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">]))&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">def&lt;/span> &lt;span class="nf">encrypt&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="bp">self&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">plaintext&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="nb">len&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">plaintext&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">%&lt;/span> &lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">BLOCK_SIZE&lt;/span> &lt;span class="o">!=&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">padding&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">BLOCK_SIZE&lt;/span> &lt;span class="o">-&lt;/span> &lt;span class="nb">len&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">plaintext&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">%&lt;/span> &lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">BLOCK_SIZE&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">plaintext&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="nb">bytes&lt;/span>&lt;span class="p">([&lt;/span>&lt;span class="n">padding&lt;/span>&lt;span class="p">]&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="n">padding&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">ciphertext&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="sa">b&lt;/span>&lt;span class="s2">&amp;#34;&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">for&lt;/span> &lt;span class="n">i&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="nb">range&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nb">len&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">plaintext&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="mi">16&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">ciphertext&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">encrypt_block&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">plaintext&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="n">i&lt;/span> &lt;span class="p">:&lt;/span> &lt;span class="n">i&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="mi">16&lt;/span>&lt;span class="p">])&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="n">ciphertext&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">def&lt;/span> &lt;span class="nf">encrypt_block&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="bp">self&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">plaintext&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">state&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">bytes2matrix&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">plaintext&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">add_key&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">for&lt;/span> &lt;span class="n">i&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="nb">range&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">rounds&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">substitute&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">rotate&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">mix&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">add_key&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">i&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">substitute&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">rotate&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">add_key&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">rounds&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="n">matrix2bytes&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">state&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">def&lt;/span> &lt;span class="nf">add_key&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="bp">self&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">idx&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">for&lt;/span> &lt;span class="n">i&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="nb">range&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">4&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">for&lt;/span> &lt;span class="n">j&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="nb">range&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">4&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">state&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="n">i&lt;/span>&lt;span class="p">][&lt;/span>&lt;span class="n">j&lt;/span>&lt;span class="p">]&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">state&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="n">i&lt;/span>&lt;span class="p">][&lt;/span>&lt;span class="n">j&lt;/span>&lt;span class="p">]&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">keys&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="n">idx&lt;/span>&lt;span class="p">][&lt;/span>&lt;span class="n">i&lt;/span>&lt;span class="p">][&lt;/span>&lt;span class="n">j&lt;/span>&lt;span class="p">])&lt;/span> &lt;span class="o">%&lt;/span> &lt;span class="mi">255&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">def&lt;/span> &lt;span class="nf">substitute&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="bp">self&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">for&lt;/span> &lt;span class="n">i&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="nb">range&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">4&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">for&lt;/span> &lt;span class="n">j&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="nb">range&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">4&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">state&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="n">i&lt;/span>&lt;span class="p">][&lt;/span>&lt;span class="n">j&lt;/span>&lt;span class="p">]&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">SBOX&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">state&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="n">i&lt;/span>&lt;span class="p">][&lt;/span>&lt;span class="n">j&lt;/span>&lt;span class="p">]]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">def&lt;/span> &lt;span class="nf">rotate&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="bp">self&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">state&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">spiralRight&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">state&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">def&lt;/span> &lt;span class="nf">mix&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="bp">self&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">out&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">[[&lt;/span>&lt;span class="mi">0&lt;/span> &lt;span class="k">for&lt;/span> &lt;span class="n">_&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="nb">range&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">4&lt;/span>&lt;span class="p">)]&lt;/span> &lt;span class="k">for&lt;/span> &lt;span class="n">_&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="nb">range&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">4&lt;/span>&lt;span class="p">)]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">for&lt;/span> &lt;span class="n">i&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="nb">range&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">4&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">for&lt;/span> &lt;span class="n">j&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="nb">range&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">4&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">for&lt;/span> &lt;span class="n">k&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="nb">range&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">4&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">out&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="n">i&lt;/span>&lt;span class="p">][&lt;/span>&lt;span class="n">j&lt;/span>&lt;span class="p">]&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="n">SPIRAL&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="n">i&lt;/span>&lt;span class="p">][&lt;/span>&lt;span class="n">k&lt;/span>&lt;span class="p">]&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">state&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="n">k&lt;/span>&lt;span class="p">][&lt;/span>&lt;span class="n">j&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">out&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="n">i&lt;/span>&lt;span class="p">][&lt;/span>&lt;span class="n">j&lt;/span>&lt;span class="p">]&lt;/span> &lt;span class="o">%=&lt;/span> &lt;span class="mi">255&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">state&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">out&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;code>utils.py&lt;/code>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># rotate a 4x4 matrix clockwise&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">def&lt;/span> &lt;span class="nf">spiralRight&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">matrix&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">right&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">[]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">for&lt;/span> &lt;span class="n">j&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="nb">range&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">4&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">for&lt;/span> &lt;span class="n">i&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="nb">range&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">3&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="o">-&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="o">-&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">right&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">append&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">matrix&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="n">i&lt;/span>&lt;span class="p">][&lt;/span>&lt;span class="n">j&lt;/span>&lt;span class="p">])&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="n">bytes2matrix&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">right&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># rotate a 4x4 matrix counterclockwise&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">def&lt;/span> &lt;span class="nf">spiralLeft&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">matrix&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">left&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">[]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">for&lt;/span> &lt;span class="n">j&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="nb">range&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">3&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="o">-&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="o">-&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">for&lt;/span> &lt;span class="n">i&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="nb">range&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">4&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">left&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">append&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">matrix&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="n">i&lt;/span>&lt;span class="p">][&lt;/span>&lt;span class="n">j&lt;/span>&lt;span class="p">])&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="n">bytes2matrix&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">left&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># convert bytes to 4x4 matrix&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">def&lt;/span> &lt;span class="nf">bytes2matrix&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nb">bytes&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="nb">list&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nb">bytes&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="n">i&lt;/span> &lt;span class="p">:&lt;/span> &lt;span class="n">i&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="mi">4&lt;/span>&lt;span class="p">])&lt;/span> &lt;span class="k">for&lt;/span> &lt;span class="n">i&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="nb">range&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nb">len&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nb">bytes&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="mi">4&lt;/span>&lt;span class="p">)]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># convert 4x4 matrix to bytes&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">def&lt;/span> &lt;span class="nf">matrix2bytes&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">matrix&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="nb">bytes&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nb">sum&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">matrix&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="p">[]))&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">SBOX&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="mi">184&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">79&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">76&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">49&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">237&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">28&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">54&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">183&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">106&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">24&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">192&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">7&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">43&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">111&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">175&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">44&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">46&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">199&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">182&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">115&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">83&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">227&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">61&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">230&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">6&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">57&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">165&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">137&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">58&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">14&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">94&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">217&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">66&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">120&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">53&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">142&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">29&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">150&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">103&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">75&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">186&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">39&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">31&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">196&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">18&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">207&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">244&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">16&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">213&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">243&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">114&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">251&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">96&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">4&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">138&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">197&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">10&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">176&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">157&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">91&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">238&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">155&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">254&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">71&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">86&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">37&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">130&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">12&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">52&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">162&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">220&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">56&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">88&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">188&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">27&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">208&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">25&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">51&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">172&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">141&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">168&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">253&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">85&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">193&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">90&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">35&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">95&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">105&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">200&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">127&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">247&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">21&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">93&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">67&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">13&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">235&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">84&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">190&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">225&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">119&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">189&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">81&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">250&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">117&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">231&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">50&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">179&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">22&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">223&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">26&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">228&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">132&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">139&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">166&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">210&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">23&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">64&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">108&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">212&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">201&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">99&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">218&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">160&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">240&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">129&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">224&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">233&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">242&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">159&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">47&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">126&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">125&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">146&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">229&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">252&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">161&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">98&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">30&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">63&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">239&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">164&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">36&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">80&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">151&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">245&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">38&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">107&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">3&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">65&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">73&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">204&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">8&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">205&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">82&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">78&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">173&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">112&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">219&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">136&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">123&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">149&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">118&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">32&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">215&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">163&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">74&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">134&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">248&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">68&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">110&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">45&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">59&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">145&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">178&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">156&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">100&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">177&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">221&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">2&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">92&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">20&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">40&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">144&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">101&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">140&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">169&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">116&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">143&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">202&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">113&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">209&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">104&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">133&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">128&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">70&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">89&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">216&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">147&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">122&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">131&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">9&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">249&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">121&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">109&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">191&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">77&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">124&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">246&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">55&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">198&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">187&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">185&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">17&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">60&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">180&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">203&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">19&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">158&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">97&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">206&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">148&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">5&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">87&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">170&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">236&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">222&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">194&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">15&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">214&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">241&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">211&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">234&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">42&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">41&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">153&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">62&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">102&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">152&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">69&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">181&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">34&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">48&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">226&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">11&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">195&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">154&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">174&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">167&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">135&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">232&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">72&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">171&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">33&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">SPIRAL&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">[&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">[&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">19&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">22&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">23&lt;/span>&lt;span class="p">],&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">[&lt;/span>&lt;span class="mi">166&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">169&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">173&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">31&lt;/span>&lt;span class="p">],&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">[&lt;/span>&lt;span class="mi">149&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">212&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">176&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">38&lt;/span>&lt;span class="p">],&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">[&lt;/span>&lt;span class="mi">134&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">94&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">59&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">47&lt;/span>&lt;span class="p">],&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Với bài này, ta cần tìm được &lt;code>secret&lt;/code> để có thể giải mã được flag. Với chú ý rằng Cipher của chúng ta có hình dạng khá giống với AES, cộng với việc có 4 round, ta có thể nghĩ ngay đến Square Attack&lt;/p>
&lt;p>Ta có thể viết lại hàm &lt;code>mix()&lt;/code> của server theo cách đại số như sau&lt;/p>
&lt;p>$$\begin{bmatrix}out_{0}\out_{1}\out_{2}\out_{3}\end{bmatrix} =\begin{bmatrix}1&amp;amp;19&amp;amp;22&amp;amp;23\166&amp;amp;169&amp;amp;173&amp;amp;31\149&amp;amp;212&amp;amp;176&amp;amp;38\134&amp;amp;94&amp;amp;59&amp;amp;47\end{bmatrix}\begin{bmatrix}s_{0}\s_{1}\s_{2}\s_{3}\end{bmatrix}$$&lt;/p>
&lt;p>Ta có thể hình dung Cipher của bài theo hình vẽ:
(Xin lỗi vì hình vẽ hơi xấu :(( )&lt;/p>
&lt;p>&lt;img src="https://giapppp.github.io/images/square-attack/square-attack_7.png" alt="Screenshot 2024-04-20 000157">&lt;/p>
&lt;p>Để ý rằng Cipher của chúng ta làm việc trên mod 255, nên với mỗi $\varLambda$-set có active index &lt;code>idx&lt;/code>, ta sẽ xây dựng được tính chất sau với &lt;code>idx = 0&lt;/code>&lt;/p>
&lt;p>$$\begin{aligned} Sum_0 &amp;amp;= b_0 + b_1 + &amp;hellip; + b_{254} \ &amp;amp;= (a_{0,0} + 19 * a_{0, 1} + 22 * a_{0, 2} + 23 * a_{0, 3}) + &amp;hellip; + (a_{254,0} + 19 * a_{254, 1} + 22 * a_{254, 2} + 23 * a_{254, 3}) \ &amp;amp;= (a_{0, 0} + &amp;hellip; + a_{254, 0}) + 19 * (a_{0, 1} + &amp;hellip; + a_{254, 1}) + 22 * (a_{0, 2} + &amp;hellip; + a_{254, 2}) + 23 * (a_{0, 3} + &amp;hellip; + a_{254, 3}) \ &amp;amp;= \sum_{i=0}^{254}i + 19 * \sum_{i=0}^{254}i + 22 * \sum_{i=0}^{254}i + 23 * \sum_{i=0}^{254}i \ &amp;amp;= 0 \mod 255 \end{aligned}$$&lt;/p>
&lt;p>Từ đó áp dụng Square Attack, ta sẽ tìm được key để decrypt&lt;/p>
&lt;p>Một số lưu ý về code của mình:&lt;/p>
&lt;ul>
&lt;li>Các hàm decrypt và inverse không được cung cấp, nên ta cần tự code lại. Việc cài đặt các hàm này khá đơn giản nên mình sẽ không đề cập&lt;/li>
&lt;li>Chú ý rằng &lt;code>roundKey&lt;/code> được tạo bằng cách xoay block theo chiều ngược kim đồng hồ, vì vậy &lt;code>roundKey[4]&lt;/code> chính là &lt;code>key&lt;/code> mà ta đang cần tìm.&lt;/li>
&lt;/ul>
&lt;p>&lt;code>solve.py&lt;/code>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="kn">from&lt;/span> &lt;span class="nn">pwn&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="o">*&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">os&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">from&lt;/span> &lt;span class="nn">utils&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="o">*&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">from&lt;/span> &lt;span class="nn">tqdm&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="o">*&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">from&lt;/span> &lt;span class="nn">spiral&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="o">*&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">target&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">process&lt;/span>&lt;span class="p">([&lt;/span>&lt;span class="s2">&amp;#34;python3&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;main.py&amp;#34;&lt;/span>&lt;span class="p">])&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">target&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">recvline&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">target&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">recvline&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">def&lt;/span> &lt;span class="nf">getEncryptedFlag&lt;/span>&lt;span class="p">():&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">target&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">sendlineafter&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">b&lt;/span>&lt;span class="s2">&amp;#34;&amp;gt;&amp;gt;&amp;gt; &amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="sa">b&lt;/span>&lt;span class="s2">&amp;#34;1&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">encFlag&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">target&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">recvline&lt;/span>&lt;span class="p">()[:&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">]&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">decode&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="nb">bytes&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">fromhex&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">encFlag&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">def&lt;/span> &lt;span class="nf">encryptMsg&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">hexmsg&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="nb">str&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">target&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">sendlineafter&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">b&lt;/span>&lt;span class="s2">&amp;#34;&amp;gt;&amp;gt;&amp;gt; &amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="sa">b&lt;/span>&lt;span class="s2">&amp;#34;2&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">target&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">sendline&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">hexmsg&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">encode&lt;/span>&lt;span class="p">())&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">encMsg&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">target&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">recvline&lt;/span>&lt;span class="p">()[:&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">]&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">decode&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="nb">bytes&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">fromhex&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">encMsg&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">def&lt;/span> &lt;span class="nf">find_key_bytes&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">idx&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="nb">int&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">real_ans&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nb">set&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nb">list&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nb">range&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">256&lt;/span>&lt;span class="p">)))&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">while&lt;/span> &lt;span class="kc">True&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">ans&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nb">set&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">A_set&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">[]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">init&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">os&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">urandom&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">16&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">for&lt;/span> &lt;span class="n">i&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="nb">range&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">255&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">temp&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nb">bytearray&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">init&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">temp&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="n">idx&lt;/span>&lt;span class="p">]&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">i&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">A_set&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="n">encryptMsg&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">temp&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">hex&lt;/span>&lt;span class="p">())]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">for&lt;/span> &lt;span class="n">j&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="nb">range&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">255&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">A_set_dec&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">0&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">for&lt;/span> &lt;span class="n">ele&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="n">A_set&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">A_set_dec&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="n">INV_SBOX&lt;/span>&lt;span class="p">[(&lt;/span>&lt;span class="n">ele&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="n">idx&lt;/span>&lt;span class="p">]&lt;/span> &lt;span class="o">-&lt;/span> &lt;span class="n">j&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">%&lt;/span> &lt;span class="mi">255&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">A_set_dec&lt;/span> &lt;span class="o">%&lt;/span> &lt;span class="mi">255&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">ans&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">add&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">j&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">real_ans&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">intersection_update&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">ans&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="nb">len&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">real_ans&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="n">real_ans&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">pop&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">key&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">[]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">for&lt;/span> &lt;span class="n">i&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="n">tqdm&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nb">range&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">16&lt;/span>&lt;span class="p">)):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">key&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">append&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">find_key_bytes&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">i&lt;/span>&lt;span class="p">))&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nb">bytes&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">key&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">hex&lt;/span>&lt;span class="p">())&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">cipher&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">Spiral&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">key&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nb">bytes&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">key&lt;/span>&lt;span class="p">))&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">cipher&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">decrypt&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">getEncryptedFlag&lt;/span>&lt;span class="p">()))&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="aes-5-round">AES 5 Round&lt;/h3>
&lt;p>&lt;img src="https://giapppp.github.io/images/square-attack/square-attack_8.png" alt="image">&lt;/p>
&lt;p>Về bản chất, ta vẫn có thể thực hiện được Square Attack với 5 round bằng việc đoán 4 bytes ở &lt;code>roundKey&lt;/code> cuối và 4 bytes ở &lt;code>roundKey&lt;/code> thứ 4, tuy nhiên, việc đoán 8 bytes để tìm được 1 bytes ở &lt;code>roundKey&lt;/code> thứ 5 tốn quá nhiều thời gian. Vì thế, ta có thể sử dụng ý tưởng sau: Do &lt;strong>MixColumns&lt;/strong> là hàm tuyến tính dựa trên các cột của input, nên ta có thể viết lại &lt;code>ciphertext&lt;/code> khi vừa hoàn thành round 4 như sau&lt;/p>
&lt;p>$$\begin{aligned} Ciphertext &amp;amp;= MixColumns(s) \oplus RoundKey[4] \ &amp;amp;= MixColumns(s) \oplus MixColumns(InvMixColumns(RoundKey[4])) \ &amp;amp;= MixColumns(s \oplus InvMixColumns(RoundKey[4]))\end{aligned}$$&lt;/p>
&lt;p>Do đó, ta chỉ cần đoán 4 bytes ở &lt;code>roundKey&lt;/code> cuối, cùng với 1 bytes ở &lt;code>roundKey&lt;/code> thứ 4 để tìm được 1 byte ở &lt;code>roundKey&lt;/code> thứ 5, tổng cộng là 5 bytes. Việc này giúp giảm đáng kể khối lượng công việc cần làm để recover key, nhưng vẫn tốn khá nhiều thời gian.&lt;/p>
&lt;p>&lt;img src="https://giapppp.github.io/images/square-attack/square-attack_9.png" alt="image">&lt;/p>
&lt;p>Trong CTF, thỉnh thoảng sẽ có một số bài yêu cầu break 5 round AES (hoặc 1 cái block cipher nào đó), tuy nhiên sẽ có một số thay đổi ở cách cài đặt, hoặc sẽ cho ta một số hint nào đó về Key để xử lí.&lt;/p>
&lt;h4 id="ví-dụ-1">Ví dụ&lt;/h4>
&lt;ul>
&lt;li>&lt;strong>Blocky5 - pbctf 2023&lt;/strong>
&lt;a href="https://github.com/m1dm4n/CTF-WriteUp/tree/main/2023/pbctf/Blocky5">https://github.com/m1dm4n/CTF-WriteUp/tree/main/2023/pbctf/Blocky5&lt;/a>&lt;/li>
&lt;li>&lt;strong>Jenga - ACSC 2024&lt;/strong>&lt;/li>
&lt;/ul>
&lt;p>&lt;code>task.py&lt;/code>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="kn">from&lt;/span> &lt;span class="nn">Jenga&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="n">Jenga&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">os&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">signal&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">TIMEOUT&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">30&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">key&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">os&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">urandom&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">9&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">cipher&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">Jenga&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">key&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">def&lt;/span> &lt;span class="nf">timeout&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">signum&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">frame&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;Timeout!!!&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">signal&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">alarm&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">exit&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">signal&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">signal&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">signal&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">SIGALRM&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">timeout&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">signal&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">alarm&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">TIMEOUT&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">for&lt;/span> &lt;span class="n">i&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="nb">range&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">256&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">pt&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nb">bytes&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">fromhex&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nb">input&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;&amp;gt; &amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">strip&lt;/span>&lt;span class="p">())&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">ct&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">cipher&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">encrypt&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">pt&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;ct: &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">ct&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">hex&lt;/span>&lt;span class="p">()&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">pt&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">os&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">urandom&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">9&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">ct&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">cipher&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">encrypt&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">pt&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;ct: &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">ct&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">hex&lt;/span>&lt;span class="p">()&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">user_pt&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nb">bytes&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">fromhex&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nb">input&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;pt? &amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">strip&lt;/span>&lt;span class="p">())&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">if&lt;/span> &lt;span class="n">pt&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="n">user_pt&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;Congratz!&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">flag&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nb">open&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;flag&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;r&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">read&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;Here is the flag: &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">flag&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">else&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;Wrong :(&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;code>Jenga.py&lt;/code>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="n">SBOX&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">[&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="mh">0x63&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x7C&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x77&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x7B&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0xF2&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x6B&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x6F&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0xC5&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x30&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x01&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x67&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x2B&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0xFE&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0xD7&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0xAB&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x76&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="mh">0xCA&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x82&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0xC9&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x7D&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0xFA&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x59&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x47&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0xF0&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0xAD&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0xD4&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0xA2&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0xAF&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x9C&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0xA4&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x72&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0xC0&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="mh">0xB7&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0xFD&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x93&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x26&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x36&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x3F&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0xF7&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0xCC&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x34&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0xA5&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0xE5&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0xF1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x71&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0xD8&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x31&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x15&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="mh">0x04&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0xC7&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x23&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0xC3&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x18&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x96&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x05&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x9A&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x07&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x12&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x80&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0xE2&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0xEB&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x27&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0xB2&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x75&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="mh">0x09&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x83&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x2C&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x1A&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x1B&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x6E&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x5A&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0xA0&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x52&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x3B&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0xD6&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0xB3&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x29&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0xE3&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x2F&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x84&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="mh">0x53&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0xD1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x00&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0xED&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x20&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0xFC&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0xB1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x5B&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x6A&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0xCB&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0xBE&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x39&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x4A&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x4C&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x58&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0xCF&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="mh">0xD0&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0xEF&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0xAA&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0xFB&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x43&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x4D&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x33&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x85&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x45&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0xF9&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x02&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x7F&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x50&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x3C&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x9F&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0xA8&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="mh">0x51&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0xA3&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x40&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x8F&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x92&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x9D&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x38&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0xF5&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0xBC&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0xB6&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0xDA&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x21&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x10&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0xFF&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0xF3&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0xD2&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="mh">0xCD&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x0C&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x13&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0xEC&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x5F&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x97&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x44&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x17&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0xC4&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0xA7&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x7E&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x3D&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x64&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x5D&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x19&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x73&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="mh">0x60&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x81&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x4F&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0xDC&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x22&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x2A&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x90&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x88&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x46&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0xEE&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0xB8&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x14&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0xDE&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x5E&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x0B&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0xDB&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="mh">0xE0&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x32&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x3A&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x0A&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x49&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x06&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x24&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x5C&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0xC2&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0xD3&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0xAC&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x62&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x91&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x95&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0xE4&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x79&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="mh">0xE7&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0xC8&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x37&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x6D&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x8D&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0xD5&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x4E&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0xA9&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x6C&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x56&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0xF4&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0xEA&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x65&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x7A&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0xAE&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x08&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="mh">0xBA&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x78&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x25&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x2E&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x1C&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0xA6&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0xB4&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0xC6&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0xE8&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0xDD&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x74&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x1F&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x4B&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0xBD&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x8B&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x8A&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="mh">0x70&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x3E&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0xB5&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x66&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x48&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x03&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0xF6&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x0E&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x61&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x35&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x57&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0xB9&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x86&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0xC1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x1D&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x9E&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="mh">0xE1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0xF8&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x98&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x11&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x69&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0xD9&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x8E&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x94&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x9B&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x1E&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x87&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0xE9&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0xCE&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x55&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x28&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0xDF&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="mh">0x8C&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0xA1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x89&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x0D&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0xBF&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0xE6&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x42&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x68&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x41&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x99&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x2D&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x0F&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0xB0&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x54&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0xBB&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x16&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">SBOX_inv&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">[&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="mh">0x52&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x09&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x6A&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0xD5&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x30&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x36&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0xA5&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x38&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0xBF&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x40&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0xA3&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x9E&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x81&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0xF3&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0xD7&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0xFB&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="mh">0x7C&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0xE3&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x39&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x82&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x9B&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x2F&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0xFF&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x87&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x34&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x8E&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x43&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x44&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0xC4&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0xDE&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0xE9&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0xCB&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="mh">0x54&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x7B&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x94&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x32&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0xA6&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0xC2&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x23&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x3D&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0xEE&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x4C&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x95&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x0B&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x42&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0xFA&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0xC3&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x4E&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="mh">0x08&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x2E&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0xA1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x66&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x28&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0xD9&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x24&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0xB2&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x76&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x5B&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0xA2&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x49&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x6D&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x8B&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0xD1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x25&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="mh">0x72&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0xF8&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0xF6&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x64&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x86&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x68&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x98&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x16&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0xD4&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0xA4&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x5C&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0xCC&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x5D&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x65&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0xB6&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x92&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="mh">0x6C&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x70&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x48&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x50&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0xFD&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0xED&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0xB9&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0xDA&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x5E&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x15&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x46&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x57&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0xA7&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x8D&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x9D&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x84&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="mh">0x90&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0xD8&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0xAB&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x00&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x8C&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0xBC&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0xD3&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x0A&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0xF7&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0xE4&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x58&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x05&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0xB8&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0xB3&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x45&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x06&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="mh">0xD0&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x2C&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x1E&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x8F&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0xCA&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x3F&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x0F&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x02&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0xC1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0xAF&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0xBD&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x03&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x01&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x13&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x8A&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x6B&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="mh">0x3A&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x91&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x11&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x41&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x4F&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x67&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0xDC&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0xEA&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x97&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0xF2&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0xCF&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0xCE&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0xF0&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0xB4&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0xE6&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x73&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="mh">0x96&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0xAC&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x74&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x22&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0xE7&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0xAD&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x35&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x85&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0xE2&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0xF9&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x37&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0xE8&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x1C&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x75&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0xDF&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x6E&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="mh">0x47&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0xF1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x1A&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x71&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x1D&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x29&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0xC5&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x89&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x6F&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0xB7&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x62&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x0E&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0xAA&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x18&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0xBE&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x1B&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="mh">0xFC&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x56&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x3E&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x4B&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0xC6&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0xD2&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x79&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x20&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x9A&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0xDB&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0xC0&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0xFE&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x78&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0xCD&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x5A&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0xF4&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="mh">0x1F&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0xDD&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0xA8&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x33&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x88&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x07&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0xC7&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x31&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0xB1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x12&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x10&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x59&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x27&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x80&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0xEC&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x5F&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="mh">0x60&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x51&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x7F&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0xA9&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x19&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0xB5&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x4A&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x0D&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x2D&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0xE5&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x7A&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x9F&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x93&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0xC9&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x9C&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0xEF&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="mh">0xA0&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0xE0&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x3B&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x4D&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0xAE&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x2A&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0xF5&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0xB0&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0xC8&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0xEB&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0xBB&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x3C&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x83&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x53&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x99&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x61&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="mh">0x17&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x2B&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x04&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x7E&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0xBA&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x77&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0xD6&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x26&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0xE1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x69&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x14&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x63&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x55&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x21&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x0C&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x7D&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">def&lt;/span> &lt;span class="nf">gf_mul&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">a&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">b&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">v&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">0&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">for&lt;/span> &lt;span class="n">i&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="nb">range&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">8&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">v&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;=&lt;/span> &lt;span class="mi">1&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">v&lt;/span> &lt;span class="o">&amp;amp;&lt;/span> &lt;span class="mh">0x100&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">v&lt;/span> &lt;span class="o">^=&lt;/span> &lt;span class="mh">0x11b&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">b&lt;/span> &lt;span class="o">&amp;gt;&amp;gt;&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="mi">7&lt;/span> &lt;span class="o">-&lt;/span> &lt;span class="n">i&lt;/span>&lt;span class="p">))&lt;/span> &lt;span class="o">&amp;amp;&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">v&lt;/span> &lt;span class="o">^=&lt;/span> &lt;span class="n">a&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="n">v&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">ROUND&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">5&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">class&lt;/span> &lt;span class="nc">Jenga&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">def&lt;/span> &lt;span class="fm">__init__&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="bp">self&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">key&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="nb">bytes&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">assert&lt;/span> &lt;span class="nb">len&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">key&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="mi">9&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">subkeys&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nb">list&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">key&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">for&lt;/span> &lt;span class="n">i&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="nb">range&lt;/span>&lt;span class="p">(&lt;/span> &lt;span class="mi">9&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">ROUND&lt;/span> &lt;span class="o">-&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">subkeys&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">append&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">SBOX&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="n">subkeys&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="mi">9&lt;/span>&lt;span class="p">]&lt;/span> &lt;span class="o">^&lt;/span> &lt;span class="n">subkeys&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">]])&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">subkeys&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">[&lt;/span> &lt;span class="n">subkeys&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="n">i&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="n">i&lt;/span>&lt;span class="o">+&lt;/span>&lt;span class="mi">9&lt;/span>&lt;span class="p">]&lt;/span> &lt;span class="k">for&lt;/span> &lt;span class="n">i&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="nb">range&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">9&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="n">ROUND&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">9&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nd">@staticmethod&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">def&lt;/span> &lt;span class="nf">hori&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">b&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">for&lt;/span> &lt;span class="n">i&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="nb">range&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">9&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">3&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">x&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">y&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">z&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">b&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="n">i&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="n">i&lt;/span>&lt;span class="o">+&lt;/span>&lt;span class="mi">3&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">b&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="n">i&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="n">i&lt;/span>&lt;span class="o">+&lt;/span>&lt;span class="mi">3&lt;/span>&lt;span class="p">]&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">(&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">gf_mul&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">x&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">4&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">^&lt;/span> &lt;span class="n">gf_mul&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">y&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">2&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">^&lt;/span> &lt;span class="n">z&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">gf_mul&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">y&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">4&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">^&lt;/span> &lt;span class="n">gf_mul&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">z&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">2&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">^&lt;/span> &lt;span class="n">x&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">gf_mul&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">z&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">4&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">^&lt;/span> &lt;span class="n">gf_mul&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">x&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">2&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">^&lt;/span> &lt;span class="n">y&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nd">@staticmethod&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">def&lt;/span> &lt;span class="nf">vert&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">b&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">for&lt;/span> &lt;span class="n">i&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="nb">range&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">3&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">x&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">y&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">z&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">b&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="n">i&lt;/span>&lt;span class="p">],&lt;/span> &lt;span class="n">b&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="n">i&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="mi">3&lt;/span>&lt;span class="p">],&lt;/span> &lt;span class="n">b&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="n">i&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="mi">6&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">b&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="n">i&lt;/span>&lt;span class="p">],&lt;/span> &lt;span class="n">b&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="n">i&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="mi">3&lt;/span>&lt;span class="p">],&lt;/span> &lt;span class="n">b&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="n">i&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="mi">6&lt;/span>&lt;span class="p">]&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">(&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">gf_mul&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">x&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">4&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">^&lt;/span> &lt;span class="n">gf_mul&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">y&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">2&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">^&lt;/span> &lt;span class="n">z&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">gf_mul&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">y&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">4&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">^&lt;/span> &lt;span class="n">gf_mul&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">z&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">2&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">^&lt;/span> &lt;span class="n">x&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">gf_mul&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">z&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">4&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">^&lt;/span> &lt;span class="n">gf_mul&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">x&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">2&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">^&lt;/span> &lt;span class="n">y&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nd">@staticmethod&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">def&lt;/span> &lt;span class="nf">hori_inv&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">b&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">for&lt;/span> &lt;span class="n">i&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="nb">range&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">9&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">3&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">x&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">y&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">z&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">b&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="n">i&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="n">i&lt;/span>&lt;span class="o">+&lt;/span>&lt;span class="mi">3&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">b&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="n">i&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="n">i&lt;/span>&lt;span class="o">+&lt;/span>&lt;span class="mi">3&lt;/span>&lt;span class="p">]&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">(&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">gf_mul&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">x&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x9e&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">^&lt;/span> &lt;span class="n">gf_mul&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">y&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x4f&lt;/span>&lt;span class="p">),&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">gf_mul&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">y&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x9e&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">^&lt;/span> &lt;span class="n">gf_mul&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">z&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x4f&lt;/span>&lt;span class="p">),&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">gf_mul&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">z&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x9e&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">^&lt;/span> &lt;span class="n">gf_mul&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">x&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x4f&lt;/span>&lt;span class="p">),&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nd">@staticmethod&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">def&lt;/span> &lt;span class="nf">vert_inv&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">b&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">for&lt;/span> &lt;span class="n">i&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="nb">range&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">3&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">x&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">y&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">z&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">b&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="n">i&lt;/span>&lt;span class="p">],&lt;/span> &lt;span class="n">b&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="n">i&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="mi">3&lt;/span>&lt;span class="p">],&lt;/span> &lt;span class="n">b&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="n">i&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="mi">6&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">b&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="n">i&lt;/span>&lt;span class="p">],&lt;/span> &lt;span class="n">b&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="n">i&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="mi">3&lt;/span>&lt;span class="p">],&lt;/span> &lt;span class="n">b&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="n">i&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="mi">6&lt;/span>&lt;span class="p">]&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">(&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">gf_mul&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">x&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x9e&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">^&lt;/span> &lt;span class="n">gf_mul&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">y&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x4f&lt;/span>&lt;span class="p">),&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">gf_mul&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">y&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x9e&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">^&lt;/span> &lt;span class="n">gf_mul&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">z&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x4f&lt;/span>&lt;span class="p">),&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">gf_mul&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">z&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x9e&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">^&lt;/span> &lt;span class="n">gf_mul&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">x&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">0x4f&lt;/span>&lt;span class="p">),&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">def&lt;/span> &lt;span class="nf">xor&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="bp">self&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">b&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">rnd&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">for&lt;/span> &lt;span class="n">i&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="nb">range&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">9&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">b&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="n">i&lt;/span>&lt;span class="p">]&lt;/span> &lt;span class="o">^=&lt;/span> &lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">subkeys&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="n">rnd&lt;/span>&lt;span class="p">][&lt;/span>&lt;span class="n">i&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nd">@staticmethod&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">def&lt;/span> &lt;span class="nf">sbox&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">b&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">for&lt;/span> &lt;span class="n">i&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="nb">range&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">9&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">b&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="n">i&lt;/span>&lt;span class="p">]&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">SBOX&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="n">b&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="n">i&lt;/span>&lt;span class="p">]]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nd">@staticmethod&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">def&lt;/span> &lt;span class="nf">sbox_inv&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">b&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">for&lt;/span> &lt;span class="n">i&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="nb">range&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">9&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">b&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="n">i&lt;/span>&lt;span class="p">]&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">SBOX_inv&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="n">b&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="n">i&lt;/span>&lt;span class="p">]]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">def&lt;/span> &lt;span class="nf">encrypt&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="bp">self&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">block&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="nb">bytes&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">b&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nb">list&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">block&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">for&lt;/span> &lt;span class="n">rnd&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="nb">range&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">ROUND&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">vert&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">b&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="k">if&lt;/span> &lt;span class="n">rnd&lt;/span> &lt;span class="o">%&lt;/span> &lt;span class="mi">2&lt;/span> &lt;span class="k">else&lt;/span> &lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">hori&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">b&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">rnd&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="n">ROUND&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">break&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">xor&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">b&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">rnd&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">sbox&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">b&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="nb">bytes&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">b&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">def&lt;/span> &lt;span class="nf">decrypt&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="bp">self&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">block&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="nb">bytes&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">b&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nb">list&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">block&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">for&lt;/span> &lt;span class="n">rnd&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="nb">reversed&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nb">range&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">ROUND&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">)):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">vert_inv&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">b&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="k">if&lt;/span> &lt;span class="n">rnd&lt;/span> &lt;span class="o">%&lt;/span> &lt;span class="mi">2&lt;/span> &lt;span class="k">else&lt;/span> &lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">hori_inv&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">b&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">rnd&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">break&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">sbox_inv&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">b&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">xor&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">b&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">rnd&lt;/span> &lt;span class="o">-&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="nb">bytes&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">b&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">if&lt;/span> &lt;span class="vm">__name__&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="s2">&amp;#34;__main__&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kn">import&lt;/span> &lt;span class="nn">os&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">for&lt;/span> &lt;span class="n">_&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="nb">range&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">10&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">key&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">os&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">urandom&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">9&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">cipher&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">Jenga&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">key&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">for&lt;/span> &lt;span class="n">_&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="nb">range&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">100&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">pt&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">os&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">urandom&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">9&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">assert&lt;/span> &lt;span class="n">cipher&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">decrypt&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">cipher&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">encrypt&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">pt&lt;/span>&lt;span class="p">))&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="n">pt&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">assert&lt;/span> &lt;span class="n">cipher&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">encrypt&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">cipher&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">decrypt&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">pt&lt;/span>&lt;span class="p">))&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="n">pt&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ul>
&lt;li>&lt;strong>blocky 4.5 lite - 0CTF/TCTF 2023&lt;/strong>
&lt;a href="https://github.com/sea0h7e/My-Public-CTF-Challenges/tree/main/0CTF-TCTF-2023/blocky-4.5-lite">https://github.com/sea0h7e/My-Public-CTF-Challenges/tree/main/0CTF-TCTF-2023/blocky-4.5-lite&lt;/a>&lt;/li>
&lt;/ul></description></item></channel></rss>