<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>ROT256 : Cryptography &amp; Other Random Bits.</title><link>https://rot256.dev/</link><description>Recent posts on ROT256 : Cryptography &amp; Other Random Bits.</description><language>en-us</language><lastBuildDate>Fri, 04 Jul 2025 00:00:00 +0000</lastBuildDate><atom:link href="https://rot256.dev/index.xml" rel="self" type="application/rss+xml"/><item><title>Multilinear Proofs, Part I: Cubes &amp; Roots</title><link>https://rot256.dev/post/mle-1-basics/</link><pubDate>Thu, 03 Jul 2025 00:00:00 +0000</pubDate><guid>https://rot256.dev/post/mle-1-basics/</guid><description>&lt;p>&lt;img src="./milano.png" alt="Milano">&lt;/p>
&lt;h1 id="introduction">Introduction&lt;/h1>
&lt;p>This series of posts aims to be a &lt;em>comprehensive&lt;/em> collection of facts, protocols,
and theorems related to the information-theoretic foundations of multilinear proof systems.
By &amp;ldquo;multilinear proof system&amp;rdquo; we refer to a system with multilinear polynomials as the underlying &amp;ldquo;arithmetization&amp;rdquo; of the proof system: where satisfiability of the computation, a (RAM) machine or circuit, is expressed as randomized relations between multilinear polynomials
and the witness is the evaluation of multilinear polynomials over some tensor product.&lt;/p></description></item><item><title>Spikey Elf @ HXP 38C3 CTF</title><link>https://rot256.dev/post/spiky-elf/</link><pubDate>Thu, 02 Jan 2025 00:00:00 +0000</pubDate><guid>https://rot256.dev/post/spiky-elf/</guid><description>&lt;p>&lt;img src="./top.png" alt="top">&lt;/p>
&lt;p>Happy new year!&lt;/p>
&lt;p>Here is a writeup for the challenge &lt;code>Spikey Elf&lt;/code> from the 38C3 CTF by HXP.&lt;/p>
&lt;h1 id="the-challenge">The Challenge&lt;/h1>
&lt;p>We are given the following code:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sage" data-lang="sage">&lt;span class="line">&lt;span class="cl">&lt;span class="ch">#!/usr/bin/env sage&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">proof&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">all&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="kc">False&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">bits&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">1024&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">errs&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="n">p&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">random_prime&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="o">^&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">bits&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">q&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">random_prime&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="o">^&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">bits&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">n&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">p&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="n">q&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">e&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mh">0x10001&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="s1">&amp;#39;&lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">n&lt;/span> &lt;span class="si">= :&lt;/span>&lt;span class="s1">#x&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s1">&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="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s1">&amp;#39;&lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">e&lt;/span> &lt;span class="si">= :&lt;/span>&lt;span class="s1">#x&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s1">&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">flag&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nb">pow&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nb">int&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">from_bytes&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nb">open&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;flag.txt&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="s1">&amp;#39;rb&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 class="o">.&lt;/span>&lt;span class="n">strip&lt;/span>&lt;span class="p">()),&lt;/span> &lt;span class="n">e&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">n&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="s1">&amp;#39;&lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">flag&lt;/span> &lt;span class="si">= :&lt;/span>&lt;span class="s1">#x&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s1">&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">d&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">inverse_mod&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">e&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">lcm&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">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="n">q&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">locs&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nb">sorted&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">Subsets&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">bits&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="n">errs&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">random_element&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">loc&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="n">locs&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">d&lt;/span> &lt;span class="o">^^=&lt;/span> &lt;span class="mi">1&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="n">loc&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="s1">&amp;#39;&lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">d&lt;/span> &lt;span class="si">= :&lt;/span>&lt;span class="s1">#x&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s1">&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>And the output:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-txt" data-lang="txt">&lt;span class="line">&lt;span class="cl">n = 0x639d87bf6a02786607d67741ebde10aa39746dc8ed22b191ff2
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> fefe9c210b3ee2ce68b185dc7f8069e78441bdec1d33e2b342c22
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> 6b5cde8a49f567ac11a3bcb7ff88eeededdd0d50eb981635920d2
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> 380a6b878d327b261821355d65b2ef9f807035a70c77252d09787
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> c2b3dfafdfa4f5c6b39a1c66c5b39fe9d1ee4b36d86d5
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">e = 0x10001
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">flag = 0x40208a7900b1575431a49690030e4eb8be6269edcd3c7b2d
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> 97ae94a6eb744e9c622d81b95ea45b23ee6e0d773e3dd48adc6bb
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> 2c7c6423d8fd52eddcc6c0710f607590d5fc57a45883a36ad0d85
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> 1f84d4bee86ffaf65bc1773f97430080926550dce3666051befa8
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> 7bacc01d44dd09baa6ae93a85cedde5933f7cbbe2cb56cdd
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">d = 0x1a54893799cd9805600cfaee1c8a408813525db268fbc29e7f2
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> a81eb47b64d2dd20dc8be52b6332e375f92a120957042a92a4bd4
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> f5e13ef14e9b398bec330602dc9dbbb63cf3dfe6d33bf95d08306
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> a894b052e005a57cc41673fe866f4f8b2ffb0aa26fc4c51a8f513
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> 5e40df2107e0259ddf4c1d9c1eb41b1f702b135c941
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>In other words:&lt;/p></description></item><item><title>Proof-Carrying Border Gateway Protocol</title><link>https://rot256.dev/post/bgp-pcd/</link><pubDate>Wed, 25 Dec 2024 00:00:00 +0000</pubDate><guid>https://rot256.dev/post/bgp-pcd/</guid><description>&lt;p>&lt;img src="./top-mono.png" alt="">&lt;/p>
&lt;h1 id="introduction">Introduction&lt;/h1>
&lt;p>The Border Gateway Protocol (BGP) is &lt;em>the central protocol&lt;/em> of the internet, responsible for configuring routing tables of
autonomous systems (ASes) across the globe.
Unfortunately, it is incredibly vulnerable, and attempts to bolt cryptography onto BGP have been largely unsuccessful.
This is partly because of a mismatch between how BGP works and how cryptographic signatures work.
In this post we will explore an alternate way of securing BGP using Proof-Carrying Data.
This is particularly relevant because:&lt;/p></description></item><item><title>Multivariate Sum-Check</title><link>https://rot256.dev/post/multivariate-sum/</link><pubDate>Sun, 14 Apr 2024 00:00:00 +0000</pubDate><guid>https://rot256.dev/post/multivariate-sum/</guid><description>&lt;p>&lt;img src="./top-bw.png" alt="">&lt;/p>
&lt;p>This a short post explaining the &lt;em>multivariate sum-check&lt;/em>: a fundamental subprotocol used throughout multivariate succinct arguments (e.g. Spartan, HyperPlonK, etc).
Roughly speaking, it often serves the same role as the divisibility check in the univariate contexts.&lt;/p>
&lt;!--
The motivation for this post is simple:
*I find the existing explanations of the multivariate sumcheck overly complicated/magical.*
However, it is really a *very simple* and very intuitive protocol;
as we will see.
-->
&lt;p>This post assumes familiarity with finite fields, polynomials and lagrange interpolation/basis.&lt;/p></description></item><item><title>Fast Reed-Solomon IOP (FRI) Proximity Test</title><link>https://rot256.dev/post/fri/</link><pubDate>Sun, 19 Nov 2023 00:00:00 +0000</pubDate><guid>https://rot256.dev/post/fri/</guid><description>&lt;!-- todo: move to head -->
&lt;script src="./sage.js" >&lt;/script>
&lt;script src="./fri.js" type="module">&lt;/script>
&lt;link rel="stylesheet" as="style" href="./style.css" />
&lt;p>&lt;img src="top.jpg" alt="">&lt;/p>
&lt;h1 id="introduction">Introduction&lt;/h1>
&lt;p>In this post we will take a look at the &lt;strong>F&lt;/strong>ast &lt;strong>R&lt;/strong>eed-Solomon &lt;strong>I&lt;/strong>OP (FRI) proximity test, which enables an untrusted prover to convince a verifier that a committed vector is &lt;em>close&lt;/em> to a Reed-Solomon codeword with communication only poly-logarithmic in the dimension of the code.
This is readily used to construct practically efficient zkSNARKs from just cryptographic hash functions (rather random oracles), &lt;em>without the need for a trusted setup&lt;/em>.&lt;/p></description></item><item><title>Code Signing for Web Applications Using SXG</title><link>https://rot256.dev/post/browser-crypto/</link><pubDate>Sun, 20 Aug 2023 00:00:00 +0000</pubDate><guid>https://rot256.dev/post/browser-crypto/</guid><description>&lt;p>&lt;img src="quill-write.svg" alt="Quill" title="Let's (reproducibly) build and sign web applications.">&lt;/p>
&lt;p>Or, how to use &lt;a href="https://web.dev/signed-exchanges/">Signed HTTP Exchanges (SXG)&lt;/a> for good by
building a trustworthy software distribution method for the web.&lt;/p>
&lt;h1 id="intro-in-browser-crypto-its-everywhere">Intro. In-Browser Crypto: It&amp;rsquo;s Everywhere.&lt;/h1>
&lt;p>In this post we will look at web applications deploying cryptography
to protect users in the event of the service operator going rouge (or being hacked).
Prominently among such applications are those offering end-to-end encryption (E2EE) for files storage, calls or messaging,
wherein a malicious service provider cannot see the contents of the users communication because it is encrypted before being to the service.
All such applications must use cryptography executed on the client-side, which in the case of web applications means Javascript or Web Assembly served by a webserver
and executed in the users browser upon visiting the site hosting the application.
Here is just a small selection of a diverse set of applications using this type of in-browser cryptography:&lt;/p></description></item><item><title>Mixed Trees: Trade-Off Between (In/Out-Of)-Circuit Costs</title><link>https://rot256.dev/post/mix-trees/</link><pubDate>Wed, 19 Apr 2023 00:00:00 +0000</pubDate><guid>https://rot256.dev/post/mix-trees/</guid><description>&lt;p>&lt;img src="https://rot256.dev/post/mix-trees/top-bw.jpg#center" alt="Top" title="Clock at Boston University Campus on a snowy January night.">&lt;/p>
&lt;p>In applications where membership of the Merkle tree must be proved inside a SNARK,
the concrete cost of expressing the compression function in the proof system (in terms of gates/R1CS constraints etc.) affects performance of the prover massively.&lt;/p>
&lt;p>This has lead to the study/creation of so-called SNARK-friendly hash functions: hash functions with &amp;lsquo;&amp;rsquo;nice algebraic&amp;rsquo;&amp;rsquo; descriptions over (large) finite fields,
enabling an efficient description of the function as an arithmetic circuit over the field on which the SNARK operates.
Unfortunately such compression functions are often inherently expensive to evaluate,
due to their use of field operations in large finite fields &amp;ndash; which is substantially slower than word/bit operations used in e.g. SHA256 or Blake2s.&lt;/p></description></item><item><title>Git-Ring: Easy &amp; Flexible SSH Ring Signatures.</title><link>https://rot256.dev/post/git-ring/</link><pubDate>Mon, 10 Oct 2022 00:00:00 +0000</pubDate><guid>https://rot256.dev/post/git-ring/</guid><description>&lt;img src="top.svg#center" alt="a key in the shape of a question mark" title="Image generated by DALL·E and vectorized/simplified using Inkscape" width=150vh>
&lt;br>
&lt;p>This is the companion post to a tool,
&lt;a href="https://github.com/rot256/git-ring">git-ring&lt;/a>, that I recently released on Github.&lt;/p>
&lt;p>Github/Gitlab makes the public keys of its users publicly available (at github.com/USERNAME.keys and gitlab.com/USERNAME.keys),
this means that these services bind the users identity to public keys via this endpoint.
Git-ring &amp;ldquo;exploits&amp;rdquo; this
to enable the creation of (cryptographic) proofs showing membership among a set of users (or organizations) without revealing the identity of the person generating the proof.
The public keys of everyone (including the signer) is automatically downloaded from Github, while the tool finds the correct private key on the signers local computer.
All this combined makes using the tool pretty easy, as shown below, where we sign a message and then verify the resulting signature.&lt;/p></description></item><item><title>H1 @ Google CTF 2021</title><link>https://rot256.dev/post/h1/</link><pubDate>Sat, 24 Jul 2021 00:00:00 +0000</pubDate><guid>https://rot256.dev/post/h1/</guid><description>&lt;h1 id="the-h1-challenge">The &amp;ldquo;H1&amp;rdquo; Challenge&lt;/h1>
&lt;p>We are given two files.
A python3 script (&lt;code>chall.py&lt;/code>):&lt;/p>
&lt;details>
&lt;summary>Python Script (click to expand)&lt;/summary>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt"> 10
&lt;/span>&lt;span class="lnt"> 11
&lt;/span>&lt;span class="lnt"> 12
&lt;/span>&lt;span class="lnt"> 13
&lt;/span>&lt;span class="lnt"> 14
&lt;/span>&lt;span class="lnt"> 15
&lt;/span>&lt;span class="lnt"> 16
&lt;/span>&lt;span class="lnt"> 17
&lt;/span>&lt;span class="lnt"> 18
&lt;/span>&lt;span class="lnt"> 19
&lt;/span>&lt;span class="lnt"> 20
&lt;/span>&lt;span class="lnt"> 21
&lt;/span>&lt;span class="lnt"> 22
&lt;/span>&lt;span class="lnt"> 23
&lt;/span>&lt;span class="lnt"> 24
&lt;/span>&lt;span class="lnt"> 25
&lt;/span>&lt;span class="lnt"> 26
&lt;/span>&lt;span class="lnt"> 27
&lt;/span>&lt;span class="lnt"> 28
&lt;/span>&lt;span class="lnt"> 29
&lt;/span>&lt;span class="lnt"> 30
&lt;/span>&lt;span class="lnt"> 31
&lt;/span>&lt;span class="lnt"> 32
&lt;/span>&lt;span class="lnt"> 33
&lt;/span>&lt;span class="lnt"> 34
&lt;/span>&lt;span class="lnt"> 35
&lt;/span>&lt;span class="lnt"> 36
&lt;/span>&lt;span class="lnt"> 37
&lt;/span>&lt;span class="lnt"> 38
&lt;/span>&lt;span class="lnt"> 39
&lt;/span>&lt;span class="lnt"> 40
&lt;/span>&lt;span class="lnt"> 41
&lt;/span>&lt;span class="lnt"> 42
&lt;/span>&lt;span class="lnt"> 43
&lt;/span>&lt;span class="lnt"> 44
&lt;/span>&lt;span class="lnt"> 45
&lt;/span>&lt;span class="lnt"> 46
&lt;/span>&lt;span class="lnt"> 47
&lt;/span>&lt;span class="lnt"> 48
&lt;/span>&lt;span class="lnt"> 49
&lt;/span>&lt;span class="lnt"> 50
&lt;/span>&lt;span class="lnt"> 51
&lt;/span>&lt;span class="lnt"> 52
&lt;/span>&lt;span class="lnt"> 53
&lt;/span>&lt;span class="lnt"> 54
&lt;/span>&lt;span class="lnt"> 55
&lt;/span>&lt;span class="lnt"> 56
&lt;/span>&lt;span class="lnt"> 57
&lt;/span>&lt;span class="lnt"> 58
&lt;/span>&lt;span class="lnt"> 59
&lt;/span>&lt;span class="lnt"> 60
&lt;/span>&lt;span class="lnt"> 61
&lt;/span>&lt;span class="lnt"> 62
&lt;/span>&lt;span class="lnt"> 63
&lt;/span>&lt;span class="lnt"> 64
&lt;/span>&lt;span class="lnt"> 65
&lt;/span>&lt;span class="lnt"> 66
&lt;/span>&lt;span class="lnt"> 67
&lt;/span>&lt;span class="lnt"> 68
&lt;/span>&lt;span class="lnt"> 69
&lt;/span>&lt;span class="lnt"> 70
&lt;/span>&lt;span class="lnt"> 71
&lt;/span>&lt;span class="lnt"> 72
&lt;/span>&lt;span class="lnt"> 73
&lt;/span>&lt;span class="lnt"> 74
&lt;/span>&lt;span class="lnt"> 75
&lt;/span>&lt;span class="lnt"> 76
&lt;/span>&lt;span class="lnt"> 77
&lt;/span>&lt;span class="lnt"> 78
&lt;/span>&lt;span class="lnt"> 79
&lt;/span>&lt;span class="lnt"> 80
&lt;/span>&lt;span class="lnt"> 81
&lt;/span>&lt;span class="lnt"> 82
&lt;/span>&lt;span class="lnt"> 83
&lt;/span>&lt;span class="lnt"> 84
&lt;/span>&lt;span class="lnt"> 85
&lt;/span>&lt;span class="lnt"> 86
&lt;/span>&lt;span class="lnt"> 87
&lt;/span>&lt;span class="lnt"> 88
&lt;/span>&lt;span class="lnt"> 89
&lt;/span>&lt;span class="lnt"> 90
&lt;/span>&lt;span class="lnt"> 91
&lt;/span>&lt;span class="lnt"> 92
&lt;/span>&lt;span class="lnt"> 93
&lt;/span>&lt;span class="lnt"> 94
&lt;/span>&lt;span class="lnt"> 95
&lt;/span>&lt;span class="lnt"> 96
&lt;/span>&lt;span class="lnt"> 97
&lt;/span>&lt;span class="lnt"> 98
&lt;/span>&lt;span class="lnt"> 99
&lt;/span>&lt;span class="lnt">100
&lt;/span>&lt;span class="lnt">101
&lt;/span>&lt;span class="lnt">102
&lt;/span>&lt;span class="lnt">103
&lt;/span>&lt;span class="lnt">104
&lt;/span>&lt;span class="lnt">105
&lt;/span>&lt;span class="lnt">106
&lt;/span>&lt;span class="lnt">107
&lt;/span>&lt;span class="lnt">108
&lt;/span>&lt;span class="lnt">109
&lt;/span>&lt;span class="lnt">110
&lt;/span>&lt;span class="lnt">111
&lt;/span>&lt;span class="lnt">112
&lt;/span>&lt;span class="lnt">113
&lt;/span>&lt;span class="lnt">114
&lt;/span>&lt;span class="lnt">115
&lt;/span>&lt;span class="lnt">116
&lt;/span>&lt;span class="lnt">117
&lt;/span>&lt;span class="lnt">118
&lt;/span>&lt;span class="lnt">119
&lt;/span>&lt;span class="lnt">120
&lt;/span>&lt;span class="lnt">121
&lt;/span>&lt;span class="lnt">122
&lt;/span>&lt;span class="lnt">123
&lt;/span>&lt;span class="lnt">124
&lt;/span>&lt;span class="lnt">125
&lt;/span>&lt;span class="lnt">126
&lt;/span>&lt;span class="lnt">127
&lt;/span>&lt;span class="lnt">128
&lt;/span>&lt;span class="lnt">129
&lt;/span>&lt;span class="lnt">130
&lt;/span>&lt;span class="lnt">131
&lt;/span>&lt;span class="lnt">132
&lt;/span>&lt;span class="lnt">133
&lt;/span>&lt;span class="lnt">134
&lt;/span>&lt;span class="lnt">135
&lt;/span>&lt;span class="lnt">136
&lt;/span>&lt;span class="lnt">137
&lt;/span>&lt;span class="lnt">138
&lt;/span>&lt;span class="lnt">139
&lt;/span>&lt;span class="lnt">140
&lt;/span>&lt;span class="lnt">141
&lt;/span>&lt;span class="lnt">142
&lt;/span>&lt;span class="lnt">143
&lt;/span>&lt;span class="lnt">144
&lt;/span>&lt;span class="lnt">145
&lt;/span>&lt;span class="lnt">146
&lt;/span>&lt;span class="lnt">147
&lt;/span>&lt;span class="lnt">148
&lt;/span>&lt;span class="lnt">149
&lt;/span>&lt;span class="lnt">150
&lt;/span>&lt;span class="lnt">151
&lt;/span>&lt;span class="lnt">152
&lt;/span>&lt;span class="lnt">153
&lt;/span>&lt;span class="lnt">154
&lt;/span>&lt;span class="lnt">155
&lt;/span>&lt;span class="lnt">156
&lt;/span>&lt;span class="lnt">157
&lt;/span>&lt;span class="lnt">158
&lt;/span>&lt;span class="lnt">159
&lt;/span>&lt;span class="lnt">160
&lt;/span>&lt;span class="lnt">161
&lt;/span>&lt;span class="lnt">162
&lt;/span>&lt;span class="lnt">163
&lt;/span>&lt;span class="lnt">164
&lt;/span>&lt;span class="lnt">165
&lt;/span>&lt;span class="lnt">166
&lt;/span>&lt;span class="lnt">167
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&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="ch">#!/usr/bin/python3&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">hashlib&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">cryptography.hazmat.backends&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="n">default_backend&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">cryptography.hazmat.primitives&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="n">padding&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">cryptography.hazmat.primitives.ciphers&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="n">Cipher&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">algorithms&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">modes&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="nb">open&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;flag.txt&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="n">INF&lt;/span> &lt;span class="o">=&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">1&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">mod&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">8948962207650232551656602815159153422162609644098354511344597187200057010413552439917934304191956942765446530386427345937963894309923928536070534607816947&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">a&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">6294860557973063227666421306476379324074715770622746227136910445450301914281276098027990968407983962691151853678563877834221834027439718238065725844264138&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="mi">3245789008328967059274849584342077916531909009637501918328323668736179176583263496463525128488282611559800773506973771797764811498834995234341530862286627&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">n&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">8948962207650232551656602815159153422162609644098354511344597187200057010413418528378981730643524959857451398370029280583094215613882043973354392115544169&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">G&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="mi">5139617820728399941653175323358137352238277428061991823713659546881441331696699723004749024403291797641521696406798421624364096550661311227399430098134141&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="mi">1798860115416690485862271986832828064808333512613833729548071279524320966991708554765227095605106785724406691559310536469721469398449016850588110200884962&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="mi">5042518522433577951395875294780962682755843408950010956510838422057522452845550974098236475624683438351211176927595173916071040272153903968536756498306512&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">Double&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">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">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">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">z&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="mi">0&lt;/span> &lt;span class="ow">or&lt;/span> &lt;span class="n">y&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">return&lt;/span> &lt;span class="n">INF&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">ysqr&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">y&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="n">y&lt;/span> &lt;span class="o">%&lt;/span> &lt;span class="n">mod&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">zsqr&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">z&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="n">z&lt;/span> &lt;span class="o">%&lt;/span> &lt;span class="n">mod&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">s&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">4&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="n">x&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="n">ysqr&lt;/span> &lt;span class="o">%&lt;/span> &lt;span class="n">mod&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">m&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="mi">3&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="n">x&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="n">x&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="n">a&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="n">zsqr&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="n">zsqr&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">%&lt;/span> &lt;span class="n">mod&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">x2&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">m&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="n">m&lt;/span> &lt;span class="o">-&lt;/span> &lt;span class="mi">2&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="n">s&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">%&lt;/span> &lt;span class="n">mod&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">y2&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">m&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">s&lt;/span> &lt;span class="o">-&lt;/span> &lt;span class="n">x2&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">-&lt;/span> &lt;span class="mi">8&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="n">ysqr&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="n">ysqr&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">%&lt;/span> &lt;span class="n">mod&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">z2&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">2&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="n">y&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="n">z&lt;/span> &lt;span class="o">%&lt;/span> &lt;span class="n">mod&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">x2&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">y2&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">z2&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&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">p&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">q&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">p&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="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">return&lt;/span> &lt;span class="n">q&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">q&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="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">return&lt;/span> &lt;span class="n">p&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">x1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">y1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">z1&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">p&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">x2&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">y2&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">z2&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">q&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">z1sqr&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">z1&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="n">z1&lt;/span> &lt;span class="o">%&lt;/span> &lt;span class="n">mod&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">z2sqr&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">z2&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="n">z2&lt;/span> &lt;span class="o">%&lt;/span> &lt;span class="n">mod&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">u1&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">x1&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="n">z2sqr&lt;/span> &lt;span class="o">%&lt;/span> &lt;span class="n">mod&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">u2&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">x2&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="n">z1sqr&lt;/span> &lt;span class="o">%&lt;/span> &lt;span class="n">mod&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">s1&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">y1&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="n">z2&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="n">z2sqr&lt;/span> &lt;span class="o">%&lt;/span> &lt;span class="n">mod&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">s2&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">y2&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="n">z1&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="n">z1sqr&lt;/span> &lt;span class="o">%&lt;/span> &lt;span class="n">mod&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">u1&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="n">u2&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">s1&lt;/span> &lt;span class="o">!=&lt;/span> &lt;span class="n">s2&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">INF&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="k">return&lt;/span> &lt;span class="n">Double&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">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">h&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">u2&lt;/span> &lt;span class="o">-&lt;/span> &lt;span class="n">u1&lt;/span> &lt;span class="o">%&lt;/span> &lt;span class="n">mod&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">hsqr&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">h&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="n">h&lt;/span> &lt;span class="o">%&lt;/span> &lt;span class="n">mod&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">hcube&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">hsqr&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="n">h&lt;/span> &lt;span class="o">%&lt;/span> &lt;span class="n">mod&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">r&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">s2&lt;/span> &lt;span class="o">-&lt;/span> &lt;span class="n">s1&lt;/span> &lt;span class="o">%&lt;/span> &lt;span class="n">mod&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">t&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">u1&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="n">hsqr&lt;/span> &lt;span class="o">%&lt;/span> &lt;span class="n">mod&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">x3&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">r&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="n">r&lt;/span> &lt;span class="o">-&lt;/span> &lt;span class="n">hcube&lt;/span> &lt;span class="o">-&lt;/span> &lt;span class="mi">2&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="n">t&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">%&lt;/span> &lt;span class="n">mod&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">y3&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">r&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">t&lt;/span> &lt;span class="o">-&lt;/span> &lt;span class="n">x3&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">-&lt;/span> &lt;span class="n">s1&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="n">hcube&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">%&lt;/span> &lt;span class="n">mod&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">z3&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">h&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="n">z1&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="n">z2&lt;/span> &lt;span class="o">%&lt;/span> &lt;span class="n">mod&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">x3&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">y3&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">z3&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">Multiply&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">p&lt;/span>&lt;span class="p">,&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="k">if&lt;/span> &lt;span class="n">p&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="n">INF&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">p&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">res&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">INF&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">while&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">x&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">r&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nb">divmod&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>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">r&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">res&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">res&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">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">p&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">Double&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">p&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">res&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">Transform&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">m&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">l&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">z&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">m&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">shift&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">l&lt;/span> &lt;span class="o">-&lt;/span> &lt;span class="n">n&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">bit_length&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">shift&lt;/span> &lt;span class="o">&amp;gt;&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">z&lt;/span> &lt;span class="o">&amp;gt;&amp;gt;=&lt;/span> &lt;span class="n">shift&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">z&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">RNG&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">nbits&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">nbytes&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">nbits&lt;/span> &lt;span class="o">//&lt;/span> &lt;span class="mi">8&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="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="n">nbytes&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">a&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="nb">sum&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 class="o">*&lt;/span> &lt;span class="n">b&lt;/span> &lt;span class="o">**&lt;/span> &lt;span class="n">i&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="nb">len&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">B&lt;/span>&lt;span class="p">))])&lt;/span> &lt;span class="o">%&lt;/span> &lt;span class="mi">2&lt;/span>&lt;span class="o">**&lt;/span>&lt;span class="n">nbits&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">Sign&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">msg&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">d&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">h&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">hashlib&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">sha512&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">msg&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">z&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">Transform&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nb">int&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">from_bytes&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">h&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">digest&lt;/span>&lt;span class="p">(),&lt;/span> &lt;span class="s1">&amp;#39;big&amp;#39;&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="n">h&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">digest_size&lt;/span>&lt;span class="o">*&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">k&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">RNG&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">n&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">bit_length&lt;/span>&lt;span class="p">(),&lt;/span> &lt;span class="mi">16843009&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">4294967296&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">x1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">y1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">z1&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">Multiply&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">G&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">k&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">r&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">x1&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="nb">pow&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">z1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="o">-&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">mod&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">%&lt;/span> &lt;span class="n">mod&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">%&lt;/span> &lt;span class="n">n&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">s&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nb">pow&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="mi">1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">n&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">*&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">r&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="n">d&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">%&lt;/span> &lt;span class="n">n&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">int&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">s&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="nb">pow&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="mi">1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">n&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">*&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">r&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="n">d&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">%&lt;/span> &lt;span class="n">n&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">r&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">s&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">Verify&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">msg&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">Q&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">r&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">s&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">h&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">hashlib&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">sha512&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">msg&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">z&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">Transform&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nb">int&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">from_bytes&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">h&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">digest&lt;/span>&lt;span class="p">(),&lt;/span> &lt;span class="s1">&amp;#39;big&amp;#39;&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="n">h&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">digest_size&lt;/span>&lt;span class="o">*&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">u1&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">z&lt;/span>&lt;span class="o">*&lt;/span>&lt;span class="nb">pow&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">s&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="n">n&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">%&lt;/span> &lt;span class="n">n&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">u2&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">r&lt;/span>&lt;span class="o">*&lt;/span>&lt;span class="nb">pow&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">s&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="n">n&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">%&lt;/span> &lt;span class="n">n&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">x1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">y1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">z1&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">Multiply&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">G&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">u1&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="n">Multiply&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">Q&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">u2&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">r&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">x1&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="nb">pow&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">z1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="o">-&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">mod&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">%&lt;/span> &lt;span class="n">mod&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">%&lt;/span> &lt;span class="n">n&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">plaintext&lt;/span>&lt;span class="p">,&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">key&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">hashlib&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">sha256&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nb">str&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">x&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 class="o">.&lt;/span>&lt;span class="n">digest&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">aes&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">algorithms&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">AES&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="n">encryptor&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">Cipher&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">aes&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">modes&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">ECB&lt;/span>&lt;span class="p">(),&lt;/span> &lt;span class="n">default_backend&lt;/span>&lt;span class="p">())&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">encryptor&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">padder&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">padding&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">PKCS7&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">aes&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">block_size&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">padder&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">padded_data&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">padder&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">update&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="n">padder&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">finalize&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">encryptor&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">update&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">padded_data&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="n">encryptor&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">finalize&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">Decrypt&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">ciphertext&lt;/span>&lt;span class="p">,&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">key&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">hashlib&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">sha256&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nb">str&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">x&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 class="o">.&lt;/span>&lt;span class="n">digest&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">aes&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">algorithms&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">AES&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="n">decryptor&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">Cipher&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">aes&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">modes&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">ECB&lt;/span>&lt;span class="p">(),&lt;/span> &lt;span class="n">default_backend&lt;/span>&lt;span class="p">())&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">decryptor&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">unpadder&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">padding&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">PKCS7&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">aes&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">block_size&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">unpadder&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">decrypted_data&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">decryptor&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">update&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">ciphertext&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="n">decryptor&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">finalize&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="n">unpadder&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">update&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">decrypted_data&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="n">unpadder&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">finalize&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">plaintext&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="c1"># Alice and Bob have their keys:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">da&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">RNG&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">n&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">bit_length&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">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">Qa&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">Multiply&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">G&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">da&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">db&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">RNG&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">n&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">bit_length&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">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">Qb&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">Multiply&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">G&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">db&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">x1a&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">y1a&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">z1a&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">Multiply&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">Qb&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">da&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">ka&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">x1a&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="nb">pow&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">z1a&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="o">-&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">mod&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">%&lt;/span> &lt;span class="n">mod&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">x1b&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">y1b&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">z1b&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">Multiply&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">Qa&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">db&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">kb&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">x1b&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="nb">pow&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">z1b&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="o">-&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">mod&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">%&lt;/span> &lt;span class="n">mod&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="c1"># Alice sends message to Bob:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">msga&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="sa">b&lt;/span>&lt;span class="s1">&amp;#39;Hello Bob.&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">ra&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">sa&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">Sign&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">msga&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">da&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">ca&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">msga&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">ka&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="s1">&amp;#39;Alice -&amp;gt; Bob:&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">ra&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">sa&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nb">int&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">from_bytes&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">ca&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;big&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="c1"># Bob receives and verifies message:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">recv_msg&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">ca&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">kb&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">Verify&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">recv_msg&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">Qa&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">ra&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">sa&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="c1"># Bob sends message to Alice:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">msgb&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="sa">b&lt;/span>&lt;span class="s1">&amp;#39;Hello Alice.&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">rb&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">sb&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">Sign&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">msgb&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">db&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">cb&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">msgb&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">kb&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="s1">&amp;#39;Bob -&amp;gt; Alice:&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">rb&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">sb&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nb">int&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">from_bytes&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">cb&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;big&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="c1"># Alice receives and verifies message:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">recv_msg&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">cb&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">ka&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">Verify&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">recv_msg&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">Qb&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">rb&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">sb&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="c1"># Alice sends message to Bob:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">msga&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s1">&amp;#39;Dinner tonight? What about Tapioca? Btw, 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="s1">&amp;#39;&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">ra&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">sa&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">Sign&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">msga&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">da&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">ca&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">msga&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">ka&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="s1">&amp;#39;Alice -&amp;gt; Bob:&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">ra&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">sa&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nb">int&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">from_bytes&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">ca&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;big&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="c1"># Bob receives and verifies message:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">recv_msg&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">ca&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">kb&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">Verify&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">recv_msg&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">Qa&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">ra&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">sa&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="c1"># Bob sends message to Alice:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">msgb&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="sa">b&lt;/span>&lt;span class="s1">&amp;#39;Dinner sounds good. Thanks for the flag.&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">rb&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">sb&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">Sign&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">msgb&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">db&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">cb&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">msgb&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">kb&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="s1">&amp;#39;Bob -&amp;gt; Alice:&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">rb&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">sb&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nb">int&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">from_bytes&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">cb&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;big&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="c1"># Alice receives and verifies message:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">recv_msg&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">cb&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">ka&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">Verify&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">recv_msg&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">Qb&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">rb&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">sb&lt;/span>&lt;span class="p">)&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>
&lt;/details>
&lt;p>And the following output (stdout from the python script):&lt;/p></description></item><item><title>(In)Security of the "Pass" password manager</title><link>https://rot256.dev/post/pass/</link><pubDate>Fri, 01 Jan 2021 00:00:00 +0000</pubDate><guid>https://rot256.dev/post/pass/</guid><description>&lt;p>&lt;img src="https://rot256.dev/post/pass/link.svg#center" alt="Pass" title="Pass provides no cryptographic binding between keys (services) and values (passwords)">&lt;/p>
&lt;h1 id="what-is-pass">What is Pass?&lt;/h1>
&lt;p>What is &amp;ldquo;Pass; the standard unix password manager&amp;rdquo;?&lt;/p>
&lt;blockquote>
&lt;p>Password management should be simple and follow Unix philosophy. With pass, each password lives inside of a gpg encrypted file whose filename is the title of the website or resource that requires the password. These encrypted files may be organized into meaningful folder hierarchies, copied from computer to computer, and, in general, manipulated using standard command line file management utilities.&lt;/p></description></item><item><title>Differential Fault Injection Against AES on Atmega328</title><link>https://rot256.dev/post/glitch/</link><pubDate>Mon, 09 Mar 2020 00:00:00 +0000</pubDate><guid>https://rot256.dev/post/glitch/</guid><description>&lt;img src="top-simple.svg#center" width="50%">
&lt;p>A walk-through of real-world AES fault injection for dummies on a shoestring budget.&lt;/p>
&lt;h1 id="introduction">Introduction&lt;/h1>
&lt;p>In the post we will setup a microcontroller which encrypts using AES with an unknown key,
then explore how to recover the full AES key from simply (randomly) glitching the power-supply
which will introduce faults in the arithmetic during the computation of AES encryption.&lt;/p>
&lt;p>This post is designed to serve as a tutorial and enable the reader to follow along.
If you get stuck anywhere (or lack the hardware),
just skip the current step and pick up the provided files which will enable you to continue from the next step onwards.
To this end there is an &lt;a href="https://github.com/rot256/aes-atmega328-glitching">associated Github repository&lt;/a>
which contains the victim code, the attack and visualization scripts as well as the raw samples I collected &amp;ndash;
which can be used in lieu of setting up the hardware yourself.&lt;/p></description></item><item><title>HalfFeed @ Codegate 2020</title><link>https://rot256.dev/post/halffeed/</link><pubDate>Thu, 13 Feb 2020 00:00:00 +0000</pubDate><guid>https://rot256.dev/post/halffeed/</guid><description>&lt;h1 id="halffeed">HalfFeed&lt;/h1>
&lt;p>The HalfFeed service allows us to encrypt almost any message.
The only restriction is that it cannot contain the string &amp;ldquo;cat flag&amp;rdquo;:&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="k">def&lt;/span> &lt;span class="nf">encrypt&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">halffeed&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">global&lt;/span> &lt;span class="n">nonce&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">P&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">recv_data&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;plaintext&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="k">if&lt;/span> &lt;span class="sa">b&lt;/span>&lt;span class="s1">&amp;#39;cat flag&amp;#39;&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="n">P&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="s1">&amp;#39;[EXCEPTION] Invalid Command &amp;#34;cat flag&amp;#34;&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="n">exit&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">C&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">T&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">halffeed&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">nonce&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">to_bytes&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">16&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">byteorder&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s1">&amp;#39;big&amp;#39;&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="n">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">send_data&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;ciphertext&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">C&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">send_data&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;tag&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">T&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">nonce&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="mi">1&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>We can also provide a ciphertext, that is split on &amp;ldquo;;&amp;rdquo;.
If any of the segments is &amp;ldquo;cat flag&amp;rdquo; we win:&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="k">def&lt;/span> &lt;span class="nf">execute&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">halffeed&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">N&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">recv_data&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;nonce&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="n">C&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">recv_data&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;ciphertext&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="n">T&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">recv_data&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;tag&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">P&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">halffeed&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">N&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">C&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">T&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">P&lt;/span> &lt;span class="ow">is&lt;/span> &lt;span class="ow">not&lt;/span> &lt;span class="kc">None&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">cmds&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">P&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">split&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">b&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">for&lt;/span> &lt;span class="n">cmd&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="n">cmds&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">cmd&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">strip&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="sa">b&lt;/span>&lt;span class="s1">&amp;#39;cat flag&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">with&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="k">as&lt;/span> &lt;span class="n">f&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">f&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="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="s1">&amp;#39;[EXCEPTION] Unknown Command&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">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="s1">&amp;#39;[EXCEPTION] Authentication Failed&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="n">exit&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>We have our job cut out for us.&lt;/p></description></item><item><title>3DES-HMAC @ AU-CTF</title><link>https://rot256.dev/post/3des-hmac/</link><pubDate>Thu, 16 May 2019 00:00:00 +0000</pubDate><guid>https://rot256.dev/post/3des-hmac/</guid><description>&lt;h1 id="the-3des-hmac-challenge">The &amp;ldquo;3DES-HMAC&amp;rdquo; challenge&lt;/h1>
&lt;blockquote>
&lt;p>This challenge is written in Rust. So it is automatically secure, right?&lt;/p>
&lt;p>&amp;ndash; Challenge Text&lt;/p>&lt;/blockquote>
&lt;p>Original challenge files can be found &lt;a href="https://rot256.dev/post/3des-hmac/3des-hmac.tar.gz">here&lt;/a>.&lt;/p>
&lt;h2 id="setting-the-stage">Setting the stage&lt;/h2>
&lt;p>We are given a simple web-application written in Rust using the Actix framework.&lt;/p>
&lt;p>&lt;img src="https://rot256.dev/post/3des-hmac/page.png" alt="No Image?" title="3DES-HMAC Login Page">&lt;/p>
&lt;p>Looking at the server code we find a handler which allows us to retrieve the flag
if we are logged in as &amp;ldquo;&lt;code>almighty_administrator&lt;/code>&amp;rdquo; with the &amp;ldquo;&lt;code>is_admin&lt;/code>&amp;rdquo; key set to &amp;ldquo;&lt;code>of_course&lt;/code>&amp;rdquo;:&lt;/p></description></item><item><title>Zero-Correlation Linear Cryptanalysis</title><link>https://rot256.dev/post/zero-correlation/</link><pubDate>Sun, 01 Apr 2018 00:00:00 +0000</pubDate><guid>https://rot256.dev/post/zero-correlation/</guid><description>&lt;p>&lt;img src="top2.jpg#center" alt="">&lt;/p>
&lt;h1 id="introduction">Introduction&lt;/h1>
&lt;p>&lt;strong>Update:&lt;/strong> Slides from the related presentation at DTU, can now be found &lt;a href="https://rot256.dev/post/zero-correlation/slides.pdf">here&lt;/a>.&lt;/p>
&lt;p>Those who have read &lt;a href="https://www.engr.mun.ca/~howard/PAPERS/ldc_tutorial.pdf">Howard M. Heys&lt;/a>
excellent introduction to Linear and Differential cryptanalysis
or even worked with linear hulls (e.g. read the &lt;a href="https://www.springer.com/us/book/9783540425809">Rijndael book&lt;/a>)
might be tempted to believe that the absence of linear approximations with a non-zero correlation
implies that the cipher is immune to linear cryptanalysis.
However the existence of linear hulls with correlation zero also allows an attacker
to distinguish the cipher from a random permutation with high probability.
In this entry we will explore the work by Andrey Bogdanov and Vincent Rijmen on
so-called &amp;ldquo;Zero-Correlation Linear Cryptanalysis&amp;rdquo; and apply the technique to a toy cipher.&lt;/p></description></item><item><title>Software Update @ 34C3</title><link>https://rot256.dev/post/software-update/</link><pubDate>Sat, 30 Dec 2017 15:00:00 +0000</pubDate><guid>https://rot256.dev/post/software-update/</guid><description>&lt;h1 id="the-34c3-ctf">The 34C3 CTF&lt;/h1>
&lt;p>34C3 has just ended and the year is quickly coming to an end.
As usual I had the pleasure of playing the CTF at CCC.
What I particularly like about the C3 CTF
is the ingenuity and variety of challenges
(not just binary reversing + exploitation and web).&lt;/p>
&lt;h1 id="the-software-update-challenge">The &amp;ldquo;Software Update&amp;rdquo; challenge&lt;/h1>
&lt;p>We are given 3 files:&lt;/p>
&lt;ul>
&lt;li>installer.py&lt;/li>
&lt;li>public_key.der&lt;/li>
&lt;li>sw_update.zip&lt;/li>
&lt;/ul>
&lt;p>The challenge is a firmware updating service (provided in &lt;code>installer.py&lt;/code>)
and an example of a signed update (provided in &lt;code>sw_update.zip&lt;/code>).
The challenge is similar to &lt;code>flash&lt;/code> from 32C3.&lt;/p></description></item><item><title>GSoC: WireGuard</title><link>https://rot256.dev/post/gsoc/</link><pubDate>Thu, 07 Sep 2017 00:00:00 +0000</pubDate><guid>https://rot256.dev/post/gsoc/</guid><description>&lt;h1 id="introduction">Introduction&lt;/h1>
&lt;h2 id="google-summer-of-code">Google Summer of Code&lt;/h2>
&lt;p>Every year Google arranges their &lt;a href="https://developers.google.com/open-source/gsoc">Summer of Code program&lt;/a>,
giving students the opportunity of contributing to open source projects
during the summer and receive a stipend.
Over this summer I have completed the program with the WireGuard team
(under the Linux foundation umbrella),
with the goal to create a user space implementation of &lt;a href="https://www.wireguard.com">WireGuard&lt;/a>.&lt;/p>
&lt;h2 id="wireguard">WireGuard&lt;/h2>
&lt;p>WireGuard is a simple (layer 3) VPN protocol based around a &lt;a href="http://www.noiseprotocol.org">Noise pattern&lt;/a> (in particular Noise_IKpsk2).
Among the primary features offered by WireGuard are:&lt;/p></description></item><item><title>Bornhack CTF (2017)</title><link>https://rot256.dev/post/bornhack-2017/</link><pubDate>Wed, 30 Aug 2017 00:00:00 +0000</pubDate><guid>https://rot256.dev/post/bornhack-2017/</guid><description>&lt;h1 id="introduction">Introduction&lt;/h1>
&lt;p>Pwnies at Copenhagen University arranged this years &lt;a href="https://ctftime.org/ctf-wtf">CTF&lt;/a> at &lt;a href="https://bornhack.dk/bornhack-2017">Bornhack&lt;/a>.&lt;/p>
&lt;p>This is a short post detailing 2 of the crypto challenges I designed for this years CTF.&lt;/p>
&lt;h2 id="birthday-present">Birthday-PRESENT&lt;/h2>
&lt;p>The challenge (and solution) can be found &lt;a href="https://github.com/kokjo/bornhack-ctf/tree/master/challenges/birthday-PRESENT">on github&lt;/a>&lt;/p>
&lt;p>The Sweet16 / birthday-PRESENT challenge is based on a variant
of the &lt;a href="https://sweet32.info/">Sweet32&lt;/a> vulnability, with a block cipher (&lt;a href="https://eprint.iacr.org/2010/143.pdf">small scale variant of PRESENT&lt;/a>)
having a block size of 32-bit, which makes the attack more practical.&lt;/p>
&lt;p>Participants were given the C source code of a server which writes the flag into a large buffer (repeated),
then allows the user to overwrite the start of the buffer with any plaintext of their choosing.
The buffer is then encrypted under a random key using Small-PRESENT in CBC mode
and the ciphertext is returned to the user.&lt;/p></description></item><item><title>Bluesound POWERNODE</title><link>https://rot256.dev/post/bluesound-powernode/</link><pubDate>Fri, 23 Dec 2016 00:00:00 +0000</pubDate><guid>https://rot256.dev/post/bluesound-powernode/</guid><description>&lt;p>The Bluesound POWERNODE is a &amp;ldquo;Wireless Stereo Component&amp;rdquo;,
which allows the user to stream to an older analogue sound system.
It also includes an amp.
I (sadly) happen to have such a device at home
and decided to take a look at the firmware.
The results were as expected.&lt;/p>
&lt;p>Most of the product line appears to be vulnerable,
since they run mostly the same software.
I would also be surprised if this is the only vulnerability in the device.&lt;/p></description></item><item><title>PAKE @ Hitcon 2016</title><link>https://rot256.dev/post/pake/</link><pubDate>Tue, 15 Nov 2016 15:00:00 +0000</pubDate><guid>https://rot256.dev/post/pake/</guid><description>&lt;p>Writeup of a challenge completed some time ago.
Modified challenge code &lt;a href="https://github.com/rot256/Wargames/blob/master/hitcon/pake/pake.rb">here&lt;/a>&lt;/p>
&lt;h1 id="the-challenge">The challenge&lt;/h1>
&lt;p>The protocol is essentially &lt;a href="https://en.wikipedia.org/wiki/SPEKE_(cryptography)">SPEKE&lt;/a>,
but rather than use one large password, a number of smaller passwords are used and
combined to avoid online bruteforce.&lt;/p>
&lt;h1 id="talking-to-yourself">Talking to yourself&lt;/h1>
&lt;p>The first observation is that two sessions with the same server can convince
each other that they know the passwords.&lt;/p>
&lt;p>This may not appear very useful.
But this allows us to bruteforce one small
password (with 4-bits of entropy) at a time.
We guess the next unknown password and let the two connections
convince each other they know the remaining passwords.
There are some minor details to take care of before we can do this,
observe the core loop of the server:&lt;/p></description></item><item><title>NeoDNS</title><link>https://rot256.dev/post/neodns/</link><pubDate>Sat, 20 Aug 2016 00:00:00 +0200</pubDate><guid>https://rot256.dev/post/neodns/</guid><description>&lt;h1 id="neodns--a-new-dns-like-the-one-we-know">NeoDNS : A new DNS like the one we know&lt;/h1>
&lt;h2 id="the-goal">The goal&lt;/h2>
&lt;p>We wish to design a new DNS solution which offers the following:&lt;/p>
&lt;ol>
&lt;li>Ease of migration:
the solution must be able to coexists with the existing DNS and PKI.
Adopting NeoDNS should not break backwards compatibility.&lt;/li>
&lt;li>Authentication of domains:
users must be able to verify that they are talking to the legitimate service,
without a globally trusted central authorit(y|ies).
We relax this requirement and simple demand that an attempt at impersonation should become publicly known.&lt;/li>
&lt;li>Performant:
minimal overhead when compared with the existing systems.&lt;/li>
&lt;/ol>
&lt;h2 id="assumptions">Assumptions&lt;/h2>
&lt;p>It is assumed that the reader:&lt;/p></description></item><item><title>Proxy Server @ Pwnable</title><link>https://rot256.dev/post/proxy-server/</link><pubDate>Fri, 29 Apr 2016 20:04:43 +0100</pubDate><guid>https://rot256.dev/post/proxy-server/</guid><description>&lt;h1 id="the-challenge">The challenge&lt;/h1>
&lt;p>The challenge text on pwntable:&lt;/p>
&lt;blockquote>
&lt;p>I made a multi-thread based HTTP proxy server written in C.
It works fine for simple case, but it crashes occasionally.
Can you find me the bug?
(it has watchdog, proxy server will be respawned after crashing)&lt;/p>
&lt;p>* uname -a of server : FreeBSD bsd32 9.1-RELEASE FreeBSD 9.1-RELEASE #0 r243826: Tue Dec 4 06:55:39 UTC 2012 &lt;a href="mailto:root@obrian.cse.buffalo.edu">root@obrian.cse.buffalo.edu&lt;/a>:/usr/obj/usr/src/sys/GENERIC i386&lt;/p>
&lt;p>Download : &lt;a href="http://pwnable.kr/bin/myproxy">http://pwnable.kr/bin/myproxy&lt;/a>&lt;/p>
&lt;p>Running at : nc pwnable.kr 9903&lt;/p></description></item><item><title>AEG @ Pwnable</title><link>https://rot256.dev/post/aeg/</link><pubDate>Fri, 01 Apr 2016 15:54:08 +0200</pubDate><guid>https://rot256.dev/post/aeg/</guid><description>&lt;h1 id="the-challenge">The challenge&lt;/h1>
&lt;p>The challenge text on pwntable:&lt;/p>
&lt;blockquote>
&lt;p>How fast can you pwn me?&lt;/p>
&lt;p>Running at : nc pwnable.kr 9005&lt;/p>&lt;/blockquote>
&lt;p>Connecting, we are given a base64 block.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">$ nc pwnable.kr 9005
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">---------------------------------------------------
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">- Welcome to AEG (Automatic Exploit Generation) -
&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">I will send you a newly compiled binary (probably exploitable) in base64 format
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">after you get the binary, I will be waiting for your input as a plain text
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">when your input is given, I will execute the binary with your input as argv[1]
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">you have 10 seconds to build exploit payload
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">wait...
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">H52Qf4owMSIgQAAACBMmFADAB4CDCSHIgIgQiMKEiGJIuKjQIg4ACgBY5ABgAwA
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">... (many lines ommited) ...
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">ACGanhDCeu6EcUFELMSGUKXHojPmzOeQEivBIJYQmWKYXwR0YSgoB
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">here, get this binary and give me some crafted argv[1] for explotation
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">remember you only have 10 seconds... hurry up!
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Which turns out to be a gzip file containing a 64-bit elf binary:&lt;/p></description></item><item><title/><link>https://rot256.dev/post/elrs-1/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://rot256.dev/post/elrs-1/</guid><description>&lt;h1 id="expresslrs-hello-world">ExpressLRS: Hello World&lt;/h1>
&lt;h2 id="introduction">Introduction&lt;/h2>
&lt;h2 id="ssfh-spread-spectrum-frequency-hopping">SSFH (Spread Spectrum Frequency Hopping)&lt;/h2>
&lt;h2 id="sync-packets">Sync Packets&lt;/h2></description></item><item><title/><link>https://rot256.dev/probset/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://rot256.dev/probset/</guid><description>&lt;!doctype html>
&lt;html lang="en">
&lt;head>
&lt;meta charset="utf-8">
&lt;title>ProbSet&lt;/title>
&lt;link rel="stylesheet" href="styles.css">
&lt;link rel="icon" type="image/png" href="icon.png">
&lt;/style>
&lt;/head>
&lt;body>
&lt;script src="probset.js">&lt;/script>
&lt;/body>
&lt;/html></description></item></channel></rss>