<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Cryptography on picoCTF Writeup</title><link>https://picoctf-writeup.pinjim.dev/tags/cryptography/</link><description>Recent content in Cryptography on picoCTF Writeup</description><generator>Hugo</generator><language>en-us</language><lastBuildDate>Mon, 04 May 2026 03:00:00 +0800</lastBuildDate><atom:link href="https://picoctf-writeup.pinjim.dev/tags/cryptography/index.xml" rel="self" type="application/rss+xml"/><item><title>EVEN RSA CAN BE BROKEN???</title><link>https://picoctf-writeup.pinjim.dev/posts/cryptography/even-rsa-can-be-broken/</link><pubDate>Mon, 04 May 2026 03:00:00 +0800</pubDate><guid>https://picoctf-writeup.pinjim.dev/posts/cryptography/even-rsa-can-be-broken/</guid><description>&lt;h2 id="題目連結"&gt;題目連結&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://learn.cylabacademy.org/library/470"&gt;https://learn.cylabacademy.org/library/470&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="題目解法"&gt;題目解法&lt;/h2&gt;
&lt;p&gt;使用 &lt;code&gt;nc&lt;/code&gt; 連線後題目會提供 $N$, $e$（每次都不一樣）。在這題題目中的 $N$ 有明顯的漏洞，就是是 2 的倍數，代表其中一個質數一定是 $p = 2$。
解密步驟：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;計算出 $q$
$$q = \frac{N}{2}$$&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;計算出 $\phi(n)$
$$\phi(n) = \phi(p) \times \phi(q) = (p-1) \times (q-1) = (2-1) \times (q-1) = q-1$$&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;計算私鑰 $d$：&lt;br&gt;
使用模反元素（Modular Inverse）公式：
$$d \equiv e^{-1} \pmod{\phi(N)}$$&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;解密密文 $C$：
$$m = C^d \pmod{N}$$&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;轉換為文字：&lt;br&gt;
將得到的長整數 $m$ 轉回 bytes，再以 UTF-8 解碼。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="解題腳本"&gt;解題腳本&lt;/h2&gt;
&lt;p&gt;將 $N$, $e$, $cyphertext$ 填入執行即可。
&lt;div class="highlight"&gt;&lt;div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 1
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 2
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 3
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 4
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 5
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 6
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 7
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 8
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 9
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;10
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;11
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;12
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;13
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;14
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;15
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;16
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;17
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;18
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;19
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;20
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;21
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;22
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;from&lt;/span&gt; Crypto.Util.number &lt;span style="color:#f92672"&gt;import&lt;/span&gt; long_to_bytes, inverse
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 已知資訊&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;N &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;24363402644768690727955172666209469821725905198393631084455253811708663554350947264649402937037672246381690969915451279285279631133822103514599606304356602&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;e &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;65537&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cyphertext &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;13597050467487786638619946148639439992899445404956336122073567173641265830288842478196554274484546393046984321139824087540835441687603028763464962383947497&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 1. 分解 N (因為 N 是偶數，所以其中一個質數是 2)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;p &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;q &lt;span style="color:#f92672"&gt;=&lt;/span&gt; N &lt;span style="color:#f92672"&gt;//&lt;/span&gt; p
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 2. 計算 phi(N)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;phi &lt;span style="color:#f92672"&gt;=&lt;/span&gt; (p &lt;span style="color:#f92672"&gt;-&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;) &lt;span style="color:#f92672"&gt;*&lt;/span&gt; (q &lt;span style="color:#f92672"&gt;-&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 3. 計算私鑰 d&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;d &lt;span style="color:#f92672"&gt;=&lt;/span&gt; inverse(e, phi)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 4. 解密&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;m_long &lt;span style="color:#f92672"&gt;=&lt;/span&gt; pow(cyphertext, d, N)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 5. 轉回字串&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;print(long_to_bytes(m_long)&lt;span style="color:#f92672"&gt;.&lt;/span&gt;decode(&lt;span style="color:#e6db74"&gt;&amp;#39;utf-8&amp;#39;&lt;/span&gt;))&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/p&gt;</description></item><item><title>Shared Secrets</title><link>https://picoctf-writeup.pinjim.dev/posts/cryptography/shared-secrets/</link><pubDate>Sun, 03 May 2026 03:20:00 +0800</pubDate><guid>https://picoctf-writeup.pinjim.dev/posts/cryptography/shared-secrets/</guid><description>&lt;h2 id="題目連結"&gt;題目連結&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://learn.cylabacademy.org/library/715"&gt;https://learn.cylabacademy.org/library/715&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="加密方式"&gt;加密方式&lt;/h2&gt;
&lt;p&gt;這題是&lt;strong&gt;迪菲-赫爾曼密鑰交換&lt;/strong&gt; (&lt;strong&gt;Diffie-Hellman Key Exchange&lt;/strong&gt;) 演算法。&lt;br&gt;
加密邏輯如下：\&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;建立兩個公開參數，可以被任何人知道。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;大質數 $p$&lt;/li&gt;
&lt;li&gt;原根 $g$&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;產生私鑰與公鑰雙方各自產生自己的私鑰，並計算出對應的公鑰：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Alice：
&lt;ul&gt;
&lt;li&gt;選擇一個私鑰 $a$（隨機整數）。&lt;/li&gt;
&lt;li&gt;計算公鑰 $A = g^a \pmod p$。&lt;/li&gt;
&lt;li&gt;將 $A$ 傳送給 Bob。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Bob：
&lt;ul&gt;
&lt;li&gt;選擇一個私鑰 $b$（隨機整數）。&lt;/li&gt;
&lt;li&gt;計算公鑰 $B = g^b \pmod p$。&lt;/li&gt;
&lt;li&gt;將 $B$ 傳送給 Alice。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;計算共享密鑰&lt;br&gt;
雙方收到對方的公鑰後，利用自己的私鑰計算出相同的共享密鑰 $s$：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Alice 計算：$s = B^a \pmod p$&lt;/li&gt;
&lt;li&gt;Bob 計算：$s = A^b \pmod p$&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;$s = B^a \pmod p = A^b \pmod p = g^{ab} \pmod p$&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="題目解法"&gt;題目解法&lt;/h2&gt;
&lt;p&gt;這題的重點在於，雖然伺服器的私鑰 $a$ 是未知的，但題目已經直接給了所需的所有關鍵數值：$A$（伺服器公鑰）、$b$（客戶端私鑰）以及 $p$（大質數）。&lt;br&gt;
使用以下 python 腳本可以解密得到 flag。
&lt;div class="highlight"&gt;&lt;div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 1
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 2
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 3
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 4
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 5
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 6
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 7
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 8
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 9
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;10
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;11
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;12
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;13
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;14
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;15
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;16
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;17
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;18
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;19
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 從 message.txt 複製過來的數值&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;g &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;p &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1653798930689987750372209240014380521131540183716217687164747711336243702962818359267822691525697642105558753651223568056089606926425342081267821725904109431430327153613733358950243154522848602494020618427146508586350079988809469424456886589329449769221123659126892760967096413248127035734431548987006011015808526671&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;A &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;771122236020803078829911570090382183223626843114693013412703353349864301811612864849857638111588507084769437566078749825291937213523446695097948166153379036322108656350710200734137906115055446496743841090323252143278700024424965369059879247648625799137192258413471893876530475007392243768366999108564494255853654467&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;b &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;502087552249276796768894199149546386713173741864561762918671131549146319658647813949433247424965048798816294966029262647803764533595143429273283374211302160540685383641060542870573303301014875733971557824236009184578986290165659257363419797500816452080900496604781986251988455903195756181696996025184087945715324970&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;enc_hex &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;cfd6dcd0fcebf9c4dbd7e0cc8cdccd8ccbe0dddb8c87d98c8889c2&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 1. 計算共享密鑰 (Shared secret)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;shared &lt;span style="color:#f92672"&gt;=&lt;/span&gt; pow(A, b, p)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 2. 取得 XOR 的金鑰&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;key &lt;span style="color:#f92672"&gt;=&lt;/span&gt; shared &lt;span style="color:#f92672"&gt;%&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;256&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 3. 將 hex 轉回 bytes 並進行解密&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;enc_bytes &lt;span style="color:#f92672"&gt;=&lt;/span&gt; bytes&lt;span style="color:#f92672"&gt;.&lt;/span&gt;fromhex(enc_hex)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;flag &lt;span style="color:#f92672"&gt;=&lt;/span&gt; bytes([x &lt;span style="color:#f92672"&gt;^&lt;/span&gt; key &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; x &lt;span style="color:#f92672"&gt;in&lt;/span&gt; enc_bytes])
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;print(key)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;print(flag&lt;span style="color:#f92672"&gt;.&lt;/span&gt;decode())&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
不過這題的 key 很小，只有 256，所以直接暴力測試所有可能也可以。&lt;/p&gt;</description></item><item><title>StegoRSA</title><link>https://picoctf-writeup.pinjim.dev/posts/cryptography/stegorsa/</link><pubDate>Sun, 03 May 2026 02:40:00 +0800</pubDate><guid>https://picoctf-writeup.pinjim.dev/posts/cryptography/stegorsa/</guid><description>&lt;h2 id="題目連結"&gt;題目連結&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://learn.cylabacademy.org/library/719"&gt;https://learn.cylabacademy.org/library/719&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="題目解法"&gt;題目解法&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;下載後得到兩個檔案，&lt;code&gt;image.jpg&lt;/code&gt; 和 &lt;code&gt;flag.enc&lt;/code&gt; 兩個檔案，其中 &lt;code&gt;flag.enc&lt;/code&gt; 是加密後的結果，將其解密即可得到 flag。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;根據提示知道私鑰藏在 &lt;code&gt;image.jpg&lt;/code&gt; 的 metadata 中，使用 &lt;code&gt;exiftool&lt;/code&gt; 查看發現 &lt;code&gt;Comment&lt;/code&gt; 是一段使用 hex 編碼的內容，解碼後得到完整私鑰。&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;2d2d2d2d2d424547494e2050524956415445204b45592d2d2d2d2d0a4d494945765149424144414e42676b71686b6947397730424151454641415343424b63776767536a41674541416f4942415143783072583072754c34674f36620a753372315a6a33376e5971456672665a334e704e4f767a786d554e477a6f4b64452f664d6c75423749507944533241662f4238784e62696d76616a6d5a4447750a5562443656716a584f785930615570514f3672585068516568352b5a4b624f52516f3833722b57647a57566e473339794c723054674861592b755355424f35780a3473675250704262733675324848456a746b32522b2f566a6f5a45345567645a753663316a36774150464334336c7a4d5462744a2b4d53694d38536148494a410a33746f58506b6a33743048474f5675334b57444b5639566b34712f6965756b4d2f6631636c737335424256377147346d375775766d316172623970416865437a0a4a716b466b6968576b44665a79494a6b7a664f4d79332b38327a48414f663669507372734d6f347544664d70316e364c354532686c596a704b486c4b57664d4e0a446e596a4753723941674d424141454367674541444b316c502f6d303444734f353862637241436252435131347837476e4339593139387639386878716174670a312f4a37764e66337a6f64715154442f5043434646385449386f6738635a7073695530314a512f48447a7363364f556c775755546c36394c4432636a57322f440a35385037516d445671614f69536c4446532f356c682b326c5a7541694b69525533495571747349445743704e77466930507a504977584c5a536e3554424655450a525963713259582b49626d6138764b644f2b5749712b626f4973575733667333704a79692b2f4b3255635a2b5132435855596e323447353364545a727a4b78470a3730466d525042354832787541344b777771766246344c483345372b38416b47476b37382f463738416868656f6d6753715541743779397a5232766d532f2b2f0a323144732f74526e7432576b747370577074693375594e57586a377465734b46535a6d6f784b504d59514b426751446c4f51386557695a354b3643627333646b0a776c775a4d6c555a744652434e564f6e7763354b6f315a762b3637433070587139534b59724d3262504132494f505561534b4a6d596a61326b42797a66644f610a3441343238686232625739354a78644543754a62424168485147665a436b683267715247573039457a4c57664e4832714f7748414b595052492f4a2b44796e660a6b6262685967486d783757776c44457146444e38532f326933514b42675144476d4969754964347269345258754d6c53302f496659486439616a7a57316c7a6f0a51695946433268484d73374231506f5270584e736f6748583459637345566b366c4e584e454f2b6f6e6335414a6256634c6d4d72764144736e51535a4e4567310a6a48674443417632436a76494355374239793868775a44716631497a7359615052664e6d465954716a674d5273454368524c4e2b64444e62654f7575326e56760a6c6a4539497158576f514b426746414765364339474846314b62307943707a437669534e7a65674c624e3877667551795a544c706b325046476c3470357530410a5a2f4f6c594b4b786449663657706579672f2f3669643979734a4a3565306132736a2b38685166446251642b2f6b426a44474e364a4f6d374d6f597a634e6a760a4179734d39622b764f446b3875694b554e79672f5669584e787672376b454c645046757a4f376132516c68445a4761735a7330654f6f3642416f4742414964450a324477375a31656a70525958454648786555617a37302b6d6343417054496b4b6e566a7352792f50784a4b3048557974744376335157676f2f6d6765765063770a3731764a5147524b634853792b6f2f364c4b52615877724c664a6c5a7969466e4e307468544c786568672b66663179516f444c4f3549564643646d5a2f7278520a2b684b37623568502b486b77347953315a636b7048743463512f514b61746b4270544975436d5668416f474150756c6f58447469766569726b576f47715079530a544a576e354a656645776878445a37546139716d786a6f6f783053414f6343554b4e495a454359346c3968557444697749416358754a54696254494c77486c520a764938594b2b557355784368464a71446178664362595571742b797657684f597934694f386e39724470612f444e50392f6d2b6a304b6f436c4a5977566b4d310a6b35497937625a57464f74765257395a7772787847684d3d0a2d2d2d2d2d454e442050524956415445204b45592d2d2d2d2d0a
&lt;/code&gt;&lt;/pre&gt;&lt;pre tabindex="0"&gt;&lt;code&gt;-----BEGIN PRIVATE KEY-----
MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCx0rX0ruL4gO6b
u3r1Zj37nYqEfrfZ3NpNOvzxmUNGzoKdE/fMluB7IPyDS2Af/B8xNbimvajmZDGu
UbD6VqjXOxY0aUpQO6rXPhQeh5+ZKbORQo83r+WdzWVnG39yLr0TgHaY+uSUBO5x
4sgRPpBbs6u2HHEjtk2R+/VjoZE4UgdZu6c1j6wAPFC43lzMTbtJ+MSiM8SaHIJA
3toXPkj3t0HGOVu3KWDKV9Vk4q/ieukM/f1clss5BBV7qG4m7Wuvm1arb9pAheCz
JqkFkihWkDfZyIJkzfOMy3+82zHAOf6iPsrsMo4uDfMp1n6L5E2hlYjpKHlKWfMN
DnYjGSr9AgMBAAECggEADK1lP/m04DsO58bcrACbRCQ14x7GnC9Y198v98hxqatg
1/J7vNf3zodqQTD/PCCFF8TI8og8cZpsiU01JQ/HDzsc6OUlwWUTl69LD2cjW2/D
58P7QmDVqaOiSlDFS/5lh+2lZuAiKiRU3IUqtsIDWCpNwFi0PzPIwXLZSn5TBFUE
RYcq2YX+Ibma8vKdO+WIq+boIsWW3fs3pJyi+/K2UcZ+Q2CXUYn24G53dTZrzKxG
70FmRPB5H2xuA4KwwqvbF4LH3E7+8AkGGk78/F78AhheomgSqUAt7y9zR2vmS/+/
21Ds/tRnt2WktspWpti3uYNWXj7tesKFSZmoxKPMYQKBgQDlOQ8eWiZ5K6Cbs3dk
wlwZMlUZtFRCNVOnwc5Ko1Zv+67C0pXq9SKYrM2bPA2IOPUaSKJmYja2kByzfdOa
4A428hb2bW95JxdECuJbBAhHQGfZCkh2gqRGW09EzLWfNH2qOwHAKYPRI/J+Dynf
kbbhYgHmx7WwlDEqFDN8S/2i3QKBgQDGmIiuId4ri4RXuMlS0/IfYHd9ajzW1lzo
QiYFC2hHMs7B1PoRpXNsogHX4YcsEVk6lNXNEO+onc5AJbVcLmMrvADsnQSZNEg1
jHgDCAv2CjvICU7B9y8hwZDqf1IzsYaPRfNmFYTqjgMRsEChRLN+dDNbeOuu2nVv
ljE9IqXWoQKBgFAGe6C9GHF1Kb0yCpzCviSNzegLbN8wfuQyZTLpk2PFGl4p5u0A
Z/OlYKKxdIf6Wpeyg//6id9ysJJ5e0a2sj+8hQfDbQd+/kBjDGN6JOm7MoYzcNjv
AysM9b+vODk8uiKUNyg/ViXNxvr7kELdPFuzO7a2QlhDZGasZs0eOo6BAoGBAIdE
2Dw7Z1ejpRYXEFHxeUaz70+mcCApTIkKnVjsRy/PxJK0HUyttCv3QWgo/mgevPcw
71vJQGRKcHSy+o/6LKRaXwrLfJlZyiFnN0thTLxehg+ff1yQoDLO5IVFCdmZ/rxR
+hK7b5hP+Hkw4yS1ZckpHt4cQ/QKatkBpTIuCmVhAoGAPuloXDtiveirkWoGqPyS
TJWn5JefEwhxDZ7Ta9qmxjoox0SAOcCUKNIZECY4l9hUtDiwIAcXuJTibTILwHlR
vI8YK+UsUxChFJqDaxfCbYUqt+yvWhOYy4iO8n9rDpa/DNP9/m+j0KoClJYwVkM1
k5Iy7bZWFOtvRW9ZwrxxGhM=
-----END PRIVATE KEY-----
&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;首先先將私鑰存到 &lt;code&gt;private.pem&lt;/code&gt;（檔名隨意），使用 &lt;code&gt;nano&lt;/code&gt; 或習慣的文字編輯器。&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;nano private.pem
&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;這個私鑰屬於 &lt;strong&gt;PEM 格式&lt;/strong&gt;的私鑰，可以使用 &lt;code&gt;openssl&lt;/code&gt; 指令來進行解密。&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;openssl pkeyutl -decrypt -inkey private.pem -in flag.enc -out flag.txt
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;指令詳細內容：&lt;/p&gt;</description></item><item><title>hashcrack</title><link>https://picoctf-writeup.pinjim.dev/posts/cryptography/hashcrack/</link><pubDate>Sun, 03 May 2026 01:20:00 +0800</pubDate><guid>https://picoctf-writeup.pinjim.dev/posts/cryptography/hashcrack/</guid><description>&lt;h2 id="題目連結"&gt;題目連結&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://learn.cylabacademy.org/library/475"&gt;https://learn.cylabacademy.org/library/475&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="題目解法"&gt;題目解法&lt;/h2&gt;
&lt;p&gt;可以使用 python 腳本或是線上 hash cracking 工具來完成這題，以下示範使用 python 腳本加上 &lt;code&gt;rockyou.txt&lt;/code&gt; 字典。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;使用 &lt;code&gt;nc&lt;/code&gt; 連線進去後，第一個 hash 值長度為 32，可以猜測是 MD5。
&lt;div class="highlight"&gt;&lt;div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 1
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 2
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 3
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 4
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 5
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 6
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 7
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 8
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 9
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;10
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;11
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;import&lt;/span&gt; hashlib
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;target_hash &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;482c811da5d5b4bc6d497ffa98491e38&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;dict_path &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;rockyou.txt&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;with&lt;/span&gt; open(dict_path, &lt;span style="color:#e6db74"&gt;&amp;#39;rb&amp;#39;&lt;/span&gt;) &lt;span style="color:#66d9ef"&gt;as&lt;/span&gt; f:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; line &lt;span style="color:#f92672"&gt;in&lt;/span&gt; f:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; password &lt;span style="color:#f92672"&gt;=&lt;/span&gt; line&lt;span style="color:#f92672"&gt;.&lt;/span&gt;strip()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; hashlib&lt;span style="color:#f92672"&gt;.&lt;/span&gt;md5(password)&lt;span style="color:#f92672"&gt;.&lt;/span&gt;hexdigest() &lt;span style="color:#f92672"&gt;==&lt;/span&gt; target_hash:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; print(&lt;span style="color:#e6db74"&gt;f&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;Found: &lt;/span&gt;&lt;span style="color:#e6db74"&gt;{&lt;/span&gt;password&lt;span style="color:#f92672"&gt;.&lt;/span&gt;decode(errors&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#39;ignore&amp;#39;&lt;/span&gt;)&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;break&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/p&gt;</description></item><item><title>interencdec</title><link>https://picoctf-writeup.pinjim.dev/posts/cryptography/interencdec/</link><pubDate>Sun, 03 May 2026 01:20:00 +0800</pubDate><guid>https://picoctf-writeup.pinjim.dev/posts/cryptography/interencdec/</guid><description>&lt;h2 id="題目連結"&gt;題目連結&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://learn.cylabacademy.org/library/418"&gt;https://learn.cylabacademy.org/library/418&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="題目解法"&gt;題目解法&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;下載檔案後得到一個字串，字串的組成以及結尾的 &lt;code&gt;==&lt;/code&gt; 極可能是 base64 編碼。&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;YidkM0JxZGtwQlRYdHFhR3g2YUhsZmF6TnFlVGwzWVROclgyMHdNakV5TnpVNGZRPT0nCg==
&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;解碼後得到以下字串&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;b&amp;#39;d3BqdkpBTXtqaGx6aHlfazNqeTl3YTNrX20wMjEyNzU4fQ==&amp;#39;
&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;將單引號中的內容再次使用 base64 解碼後得到&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;wpjvJAM{jhlzhy_k3jy9wa3k_m0212758}
&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;使用&lt;strong&gt;凱撒加密&lt;/strong&gt;偏移量 19 進行解密即可得到 flag。&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;picoCTF{cae-------------------758}
&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;
&lt;/ol&gt;</description></item></channel></rss>