<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Cryptography on an's security blog</title><link>https://panman4040.github.io/tags/cryptography/</link><description>Recent content in Cryptography on an's security blog</description><generator>Hugo</generator><language>en</language><lastBuildDate>Tue, 19 May 2026 16:04:53 +0700</lastBuildDate><atom:link href="https://panman4040.github.io/tags/cryptography/index.xml" rel="self" type="application/rss+xml"/><item><title>rotation</title><link>https://panman4040.github.io/training/picoctf/cryptography/rotation/</link><pubDate>Mon, 04 May 2026 21:50:16 +0800</pubDate><guid>https://panman4040.github.io/training/picoctf/cryptography/rotation/</guid><description>&lt;p>First, calculate the shift amount. Then for each alphabetical character in the ciphertext, subtract that shift amount with the current character, rotate back to z/Z if went overboard&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-python" data-lang="python">&lt;span style="display:flex;">&lt;span>cipher &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#e6db74">&amp;#34;xqkwKBN&lt;/span>&lt;span style="color:#e6db74">{z0bib1wv_l3kzgxb3l_555957n3}&lt;/span>&lt;span style="color:#e6db74">&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>diff &lt;span style="color:#f92672">=&lt;/span> ord(cipher[&lt;span style="color:#ae81ff">0&lt;/span>]) &lt;span style="color:#f92672">-&lt;/span> ord(&lt;span style="color:#e6db74">&amp;#39;p&amp;#39;&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>plain &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#e6db74">&amp;#34;&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">for&lt;/span> c &lt;span style="color:#f92672">in&lt;/span> cipher:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> ch &lt;span style="color:#f92672">=&lt;/span> ord(c) &lt;span style="color:#f92672">-&lt;/span> diff
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">if&lt;/span> c&lt;span style="color:#f92672">.&lt;/span>islower():
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">if&lt;/span> chr(ch)&lt;span style="color:#f92672">.&lt;/span>islower():
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> plain &lt;span style="color:#f92672">+=&lt;/span> chr(ch)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">else&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> plain &lt;span style="color:#f92672">+=&lt;/span> chr(ch &lt;span style="color:#f92672">+&lt;/span> &lt;span style="color:#ae81ff">26&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">elif&lt;/span> c&lt;span style="color:#f92672">.&lt;/span>isupper():
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">if&lt;/span> chr(ch)&lt;span style="color:#f92672">.&lt;/span>isupper():
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> plain &lt;span style="color:#f92672">+=&lt;/span> chr(ch)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">else&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> plain &lt;span style="color:#f92672">+=&lt;/span> chr(ch &lt;span style="color:#f92672">+&lt;/span> &lt;span style="color:#ae81ff">26&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">else&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> plain &lt;span style="color:#f92672">+=&lt;/span> c
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>print(plain) 
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Note that this Python implemention is not exactly the prettiest in the world. And I struggled quite a bit because I thought digits are also rotated (its not lol)&lt;/p></description></item><item><title>basic-mod2</title><link>https://panman4040.github.io/training/picoctf/cryptography/basic-mod2/</link><pubDate>Mon, 04 May 2026 21:36:16 +0800</pubDate><guid>https://panman4040.github.io/training/picoctf/cryptography/basic-mod2/</guid><description>&lt;p>Take each number mod 41 and find its modular inverse using Fermat&amp;rsquo;s little theorem, then map it to the following character set: 1-26 is the alphabet (uppercase), 27-36 are the decimal digits, else an underscore.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-python" data-lang="python">&lt;span style="display:flex;">&lt;span>cipher &lt;span style="color:#f92672">=&lt;/span> [&lt;span style="color:#ae81ff">432&lt;/span>, &lt;span style="color:#ae81ff">331&lt;/span>, &lt;span style="color:#ae81ff">192&lt;/span>, &lt;span style="color:#ae81ff">108&lt;/span>, &lt;span style="color:#ae81ff">180&lt;/span>, &lt;span style="color:#ae81ff">50&lt;/span>, &lt;span style="color:#ae81ff">231&lt;/span>, &lt;span style="color:#ae81ff">188&lt;/span>, &lt;span style="color:#ae81ff">105&lt;/span>, &lt;span style="color:#ae81ff">51&lt;/span>, &lt;span style="color:#ae81ff">364&lt;/span>, &lt;span style="color:#ae81ff">168&lt;/span>, &lt;span style="color:#ae81ff">344&lt;/span>, &lt;span style="color:#ae81ff">195&lt;/span>, &lt;span style="color:#ae81ff">297&lt;/span>, &lt;span style="color:#ae81ff">342&lt;/span>, &lt;span style="color:#ae81ff">292&lt;/span>, &lt;span style="color:#ae81ff">198&lt;/span>, &lt;span style="color:#ae81ff">448&lt;/span>, &lt;span style="color:#ae81ff">62&lt;/span>, &lt;span style="color:#ae81ff">236&lt;/span>, &lt;span style="color:#ae81ff">342&lt;/span>, &lt;span style="color:#ae81ff">63&lt;/span>]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>plain &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#e6db74">&amp;#34;&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">for&lt;/span> n &lt;span style="color:#f92672">in&lt;/span> cipher:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> n &lt;span style="color:#f92672">=&lt;/span> n &lt;span style="color:#f92672">%&lt;/span> &lt;span style="color:#ae81ff">41&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> n &lt;span style="color:#f92672">=&lt;/span> pow(n, &lt;span style="color:#ae81ff">41&lt;/span> &lt;span style="color:#f92672">-&lt;/span> &lt;span style="color:#ae81ff">2&lt;/span>, &lt;span style="color:#ae81ff">41&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">if&lt;/span> &lt;span style="color:#ae81ff">1&lt;/span> &lt;span style="color:#f92672">&amp;lt;=&lt;/span> n &lt;span style="color:#f92672">&amp;lt;=&lt;/span> &lt;span style="color:#ae81ff">26&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> plain &lt;span style="color:#f92672">+=&lt;/span> chr(n &lt;span style="color:#f92672">-&lt;/span> &lt;span style="color:#ae81ff">1&lt;/span> &lt;span style="color:#f92672">+&lt;/span> &lt;span style="color:#ae81ff">65&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">elif&lt;/span> &lt;span style="color:#ae81ff">27&lt;/span> &lt;span style="color:#f92672">&amp;lt;=&lt;/span> n &lt;span style="color:#f92672">&amp;lt;=&lt;/span> &lt;span style="color:#ae81ff">36&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> plain &lt;span style="color:#f92672">+=&lt;/span> chr(n &lt;span style="color:#f92672">-&lt;/span> &lt;span style="color:#ae81ff">27&lt;/span> &lt;span style="color:#f92672">+&lt;/span> &lt;span style="color:#ae81ff">48&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">else&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> plain &lt;span style="color:#f92672">+=&lt;/span> &lt;span style="color:#e6db74">&amp;#39;_&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>print(plain)
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div></description></item><item><title>basic-mod1</title><link>https://panman4040.github.io/training/picoctf/cryptography/basic-mod1/</link><pubDate>Mon, 04 May 2026 21:25:16 +0800</pubDate><guid>https://panman4040.github.io/training/picoctf/cryptography/basic-mod1/</guid><description>&lt;p>Take each number mod 37 and map it to the following character set: 0-25 is the alphabet (uppercase), 26-35 are the decimal digits, and 36 is an underscore.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-python" data-lang="python">&lt;span style="display:flex;">&lt;span>encoded &lt;span style="color:#f92672">=&lt;/span> [&lt;span style="color:#ae81ff">350&lt;/span>, &lt;span style="color:#ae81ff">63&lt;/span>, &lt;span style="color:#ae81ff">353&lt;/span>, &lt;span style="color:#ae81ff">198&lt;/span>, &lt;span style="color:#ae81ff">114&lt;/span>, &lt;span style="color:#ae81ff">369&lt;/span>, &lt;span style="color:#ae81ff">346&lt;/span>, &lt;span style="color:#ae81ff">184&lt;/span>, &lt;span style="color:#ae81ff">202&lt;/span>, &lt;span style="color:#ae81ff">322&lt;/span>, &lt;span style="color:#ae81ff">94&lt;/span>, &lt;span style="color:#ae81ff">235&lt;/span>, &lt;span style="color:#ae81ff">114&lt;/span>, &lt;span style="color:#ae81ff">110&lt;/span>, &lt;span style="color:#ae81ff">185&lt;/span>, &lt;span style="color:#ae81ff">188&lt;/span>, &lt;span style="color:#ae81ff">225&lt;/span>, &lt;span style="color:#ae81ff">212&lt;/span>, &lt;span style="color:#ae81ff">366&lt;/span>, &lt;span style="color:#ae81ff">374&lt;/span>, &lt;span style="color:#ae81ff">261&lt;/span>, &lt;span style="color:#ae81ff">213&lt;/span>]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>plain &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#e6db74">&amp;#34;&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">for&lt;/span> n &lt;span style="color:#f92672">in&lt;/span> encoded:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> n &lt;span style="color:#f92672">=&lt;/span> n &lt;span style="color:#f92672">%&lt;/span> &lt;span style="color:#ae81ff">37&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">if&lt;/span> &lt;span style="color:#ae81ff">0&lt;/span> &lt;span style="color:#f92672">&amp;lt;=&lt;/span> n &lt;span style="color:#f92672">&amp;lt;=&lt;/span> &lt;span style="color:#ae81ff">25&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> plain &lt;span style="color:#f92672">+=&lt;/span> chr(n &lt;span style="color:#f92672">+&lt;/span> &lt;span style="color:#ae81ff">65&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">elif&lt;/span> &lt;span style="color:#ae81ff">26&lt;/span> &lt;span style="color:#f92672">&amp;lt;=&lt;/span> n &lt;span style="color:#f92672">&amp;lt;=&lt;/span> &lt;span style="color:#ae81ff">35&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> plain &lt;span style="color:#f92672">+=&lt;/span> chr(n &lt;span style="color:#f92672">-&lt;/span> &lt;span style="color:#ae81ff">26&lt;/span> &lt;span style="color:#f92672">+&lt;/span> &lt;span style="color:#ae81ff">48&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">else&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> plain &lt;span style="color:#f92672">+=&lt;/span> &lt;span style="color:#e6db74">&amp;#39;_&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>print(plain)
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div></description></item><item><title>Cryptography</title><link>https://panman4040.github.io/training/picoctf/cryptography/</link><pubDate>Mon, 04 May 2026 21:23:16 +0800</pubDate><guid>https://panman4040.github.io/training/picoctf/cryptography/</guid><description/></item><item><title>Modular Arithmetic</title><link>https://panman4040.github.io/training/cryptohack/modular_arithmetic/</link><pubDate>Mon, 04 May 2026 11:58:16 +0800</pubDate><guid>https://panman4040.github.io/training/cryptohack/modular_arithmetic/</guid><description>&lt;h1 id="modular-arithmetic">Modular Arithmetic&lt;/h1>
&lt;p>This module (no pun intended) introduces modular arithmetic, which is a critical mathematical edge for cryptography. Here are my important remarks:&lt;/p>
&lt;h2 id="euclidean-algorithm">Euclidean Algorithm&lt;/h2>
&lt;p>This is a very famous algorithm designed to calculate the GCD of two integers. I initially struggled trying to understand the intuition, but the following analogy helps:&lt;/p>
&lt;p>You are a carpenter. You have two wooden planks of different lengths, say Plank A is 105 inches long, Plank B 24. Our goal is to find a &amp;ldquo;ruler&amp;rdquo; that measures perfectly both plank from end-to-end.&lt;/p></description></item><item><title>CryptoHack</title><link>https://panman4040.github.io/training/cryptohack/</link><pubDate>Mon, 04 May 2026 07:23:16 +0700</pubDate><guid>https://panman4040.github.io/training/cryptohack/</guid><description/></item><item><title>Introduction to CryptoHack</title><link>https://panman4040.github.io/training/cryptohack/introduction_to_cryptohack/</link><pubDate>Mon, 27 Apr 2026 07:23:16 +0700</pubDate><guid>https://panman4040.github.io/training/cryptohack/introduction_to_cryptohack/</guid><description>&lt;h1 id="introduction-to-cryptohack">Introduction to CryptoHack&lt;/h1>
&lt;p>Since this is an introduction, these are pretty straightforward stuffs. But there are a few notes to consider:&lt;/p>
&lt;h2 id="base64">Base64&lt;/h2>
&lt;p>This allows us to represent binary data as an ASCII string using an alphabet of 64 characters. One character of a Base64 string encodes 6 binary digits (bits), and so 4 characters of Base64 encode three 8-bit bytes.&lt;/p>
&lt;p>There is also padding introduced when the number of bits is not divisible by 6. Read more here: &lt;a href="https://en.wikipedia.org/wiki/Base64#Examples">https://en.wikipedia.org/wiki/Base64#Examples&lt;/a>&lt;/p></description></item></channel></rss>