PageSourceSearch

https://www.hestudio.net/assets/wdb-qinglong-crypto2.html-Cy50QG2C.js

js hestudio.net collected 2026-09-24 10:37:18 UTC 104,285 bytes, 254 lines download raw bytes

1import{_ as s,c as a,f as p,o as t}from"./app-D7CCjthX.js";const e={};function o(c,n){return t(),a("div",null,[...n[0]||(n[0]=[p(`<h3 id="原题" tabindex="-1"><a class="header-anchor" href="#原题"><span>原题</span></a></h3><div class="language-python line-numbers-mode has-collapsed-lines collapsed" data-highlighter="prismjs" data-ext="py" style="--vp-collapsed-lines:15;"><pre><code class="language-python"><span class="line"><span class="token keyword">import</span> gmpy2</span>
2<span class="line"><span class="token keyword">import</span> random</span>
3<span class="line"><span class="token keyword">import</span> binascii</span>
4<span class="line"><span class="token keyword">from</span> hashlib <span class="token keyword">import</span> sha256</span>
5<span class="line"><span class="token keyword">from</span> sympy <span class="token keyword">import</span> nextprime</span>
6<span class="line"><span class="token keyword">from</span> Crypto<span class="token punctuation">.</span>Cipher <span class="token keyword">import</span> AES</span>
7<span class="line"><span class="token keyword">from</span> Crypto<span class="token punctuation">.</span>Util<span class="token punctuation">.</span>Padding <span class="token keyword">import</span> pad</span>
8<span class="line"><span class="token keyword">from</span> Crypto<span class="token punctuation">.</span>Util<span class="token punctuation">.</span>number <span class="token keyword">import</span> long_to_bytes</span>
9<span class="line"><span class="token keyword">from</span> FLAG <span class="token keyword">import</span> flag</span>
10<span class="line"><span class="token comment">#flag = &#39;wdflag{123}&#39;</span></span>
11<span class="line"></span>
12<span class="line"><span class="token keyword">def</span> <span class="token function">victory_encrypt</span><span class="token punctuation">(</span>plaintext<span class="token punctuation">,</span> key<span class="token punctuation">)</span><span class="token punctuation">:</span></span>
13<span class="line">    key <span class="token operator">=</span> key<span class="token punctuation">.</span>upper<span class="token punctuation">(</span><span class="token punctuation">)</span></span>
14<span class="line">    key_length <span class="token operator">=</span> <span class="token builtin">len</span><span class="token punctuation">(</span>key<span class="token punctuation">)</span></span>
15<span class="line">    plaintext <span class="token operator">=</span> plaintext<span class="token punctuation">.</span>upper<span class="token punctuation">(</span><span class="token punctuation">)</span></span>
16<span class="line">    ciphertext <span class="token operator">=</span> <span class="token string">&#39;&#39;</span></span>
17<span class="line"></span>
18<span class="line">    <span class="token keyword">for</span> i<span class="token punctuation">,</span> char <span class="token keyword">in</span> <span class="token builtin">enumerate</span><span class="token punctuation">(</span>plaintext<span class="token punctuation">)</span><span class="token punctuation">:</span></span>
19<span class="line">        <span class="token keyword">if</span> char<span class="token punctuation">.</span>isalpha<span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span></span>
20<span class="line">            shift <span class="token operator">=</span> <span class="token builtin">ord</span><span class="token punctuation">(</span>key<span class="token punctuation">[</span>i <span class="token operator">%</span> key_length<span class="token punctuation">]</span><span class="token punctuation">)</span> <span class="token operator">-</span> <span class="token builtin">ord</span><span class="token punctuation">(</span><span class="token string">&#39;A&#39;</span><span class="token punctuation">)</span></span>
21<span class="line">            encrypted_char <span class="token operator">=</span> <span class="token builtin">chr</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token builtin">ord</span><span class="token punctuation">(</span>char<span class="token punctuation">)</span> <span class="token operator">-</span> <span class="token builtin">ord</span><span class="token punctuation">(</span><span class="token string">&#39;A&#39;</span><span class="token punctuation">)</span> <span class="token operator">+</span> shift<span class="token punctuation">)</span> <span class="token operator">%</span> <span class="token number">26</span> <span class="token operator">+</span> <span class="token builtin">ord</span><span class="token punctuation">(</span><span class="token string">&#39;A&#39;</span><span class="token punctuation">)</span><span class="token punctuation">)</span></span>
22<span class="line">
22            ciphertext <span class="token operator">+=</span> encrypted_char</span>
23<span class="line">        <span class="token keyword">else</span><span class="token punctuation">:</span></span>
24<span class="line">            ciphertext <span class="token operator">+=</span> char</span>
25<span class="line"></span>
26<span class="line">    <span class="token keyword">return</span> ciphertext</span>
27<span class="line"></span>
28<span class="line">victory_key <span class="token operator">=</span> <span class="token string">&quot;WANGDINGCUP&quot;</span></span>
29<span class="line">victory_encrypted_flag <span class="token operator">=</span> victory_encrypt<span class="token punctuation">(</span>flag<span class="token punctuation">,</span> victory_key<span class="token punctuation">)</span></span>
30<span class="line"></span>
31<span class="line">p <span class="token operator">=</span> <span class="token number">0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f</span></span>
32<span class="line">a <span class="token operator">=</span> <span class="token number">0</span></span>
33<span class="line">b <span class="token operator">=</span> <span class="token number">7</span></span>
34<span class="line">xG <span class="token operator">=</span> <span class="token number">0x79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798</span></span>
35<span class="line">yG <span class="token operator">=</span> <span class="token number">0x483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8</span></span>
36<span class="line">G <span class="token operator">=</span> <span class="token punctuation">(</span>xG<span class="token punctuation">,</span> yG<span class="token punctuation">)</span></span>
37<span class="line">n <span class="token operator">=</span> <span class="token number">0xfffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141</span></span>
38<span class="line">h <span class="token operator">=</span> <span class="token number">1</span></span>
39<span class="line">zero <span class="token operator">=</span> <span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">,</span><span class="token number">0</span><span class="token punctuation">)</span></span>
40<span class="line"></span>
41<span class="line">dA <span class="token operator">=</span> nextprime<span class="token punctuation">(</span>random<span class="token punctuation">.</span>randint<span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">,</span> n<span class="token punctuation">)</span><span class="token punctuation">)</span></span>
42<span class="line"></span>
43<span class="line"><span class="token keyword">if</span> dA <span class="token operator">&gt;</span> n<span class="token punctuation">:</span></span>
44<span class="line">    <span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string">&quot;warning!!&quot;</span><span class="token punctuation">)</span></span>
45<span class="line"></span>
46<span class="line"><span class="token keyword">def</span> <span class="token function">addition</span><span class="token punctuation">(</span>t1<span class="token punctuation">,</span> t2<span class="token punctuation">)</span><span class="token punctuation">:</span></span>
47<span class="line">    <span class="token keyword">if</span> t1 <span class="token operator">==</span> zero<span class="token punctuation">:</span></span>
48<span class="line">        <span class="token keyword">return</span> t2</span>
49<span class="line">    <span class="token keyword">if</span> t2 <span class="token operator">==</span> zero<span class="token punctuation">:</span></span>
50<span class="line">        <span class="token keyword">return</span> t2</span>
51<span class="line">    <span class="token punctuation">(</span>m1<span class="token punctuation">,</span> n1<span class="token punctuation">)</span> <span class="token operator">=</span> t1</span>
52<span class="line">    <span class="token punctuation">(</span>m2<span class="token punctuation">,</span> n2<span class="token punctuation">)</span> <span class="token operator">=</span> t2</span>
53<span class="line">    <span class="token keyword">if</span> m1 <span class="token operator">==</span> m2<span class="token punctuation">:</span></span>
54<span class="line">
54        <span class="token keyword">if</span> n1 <span class="token operator">==</span> <span class="token number">0</span> <span class="token keyword">or</span> n1 <span class="token operator">!=</span> n2<span class="token punctuation">:</span></span>
55<span class="line">            <span class="token keyword">return</span> zero</span>
56<span class="line">        <span class="token keyword">else</span><span class="token punctuation">:</span></span>
57<span class="line">            k <span class="token operator">=</span> <span class="token punctuation">(</span><span class="token number">3</span> <span class="token operator">*</span> m1 <span class="token operator">*</span> m1 <span class="token operator">+</span> a<span class="token punctuation">)</span> <span class="token operator">%</span> p <span class="token operator">*</span> gmpy2<span class="token punctuation">.</span>invert<span class="token punctuation">(</span><span class="token number">2</span> <span class="token operator">*</span> n1 <span class="token punctuation">,</span> p<span class="token punctuation">)</span> <span class="token operator">%</span> p</span>
58<span class="line">    <span class="token keyword">else</span><span class="token punctuation">:</span></span>
59<span class="line">        k <span class="token operator">=</span> <span class="token punctuation">(</span>n2 <span class="token operator">-</span> n1 <span class="token operator">+</span> p<span class="token punctuation">)</span> <span class="token operator">%</span> p <span class="token operator">*</span> gmpy2<span class="token punctuation">.</span>invert<span class="token punctuation">(</span><span class="token punctuation">(</span>m2 <span class="token operator">-</span> m1 <span class="token operator">+</span> p<span class="token punctuation">)</span> <span class="token operator">%</span> p<span class="token punctuation">,</span> p<span class="token punctuation">)</span> <span class="token operator">%</span> p</span>
60<span class="line">    m3 <span class="token operator">=</span> <span class="token punctuation">(</span>k <span class="token operator">*</span> k <span class="token operator">%</span> p <span class="token operator">-</span> m1 <span class="token operator">-</span> m2 <span class="token operator">+</span> p <span class="token operator">*</span> <span class="token number">2</span><span class="token punctuation">)</span> <span class="token operator">%</span> p</span>
61<span class="line">    n3 <span class="token operator">=</span> <span class="token punctuation">(</span>k <span class="token operator">*</span> <span class="token punctuation">(</span>m1 <span class="token operator">-</span> m3<span class="token punctuation">)</span> <span class="token operator">%</span> p <span class="token operator">-</span> n1 <span class="token operator">+</span> p<span class="token punctuation">)</span> <span class="token operator">%</span> p</span>
62<span class="line">    <span class="token keyword">return</span> <span class="token punctuation">(</span><span class="token builtin">int</span><span class="token punctuation">(</span>m3<span class="token punctuation">)</span><span class="token punctuation">,</span><span class="token builtin">int</span><span class="token punctuation">(</span>n3<span class="token punctuation">)</span><span class="token punctuation">)</span></span>
63<span class="line"></span>
64<span class="line"><span class="token keyword">def</span> <span class="token function">multiplication</span><span class="token punctuation">(</span>x<span class="token punctuation">,</span> k<span class="token punctuation">)</span><span class="token punctuation">:</span></span>
65<span class="line">    ans <span class="token operator">=</span> zero</span>
66<span class="line">    t <span class="token operator">=</span> <span class="token number">1</span></span>
67<span class="line">    <span class="token keyword">while</span><span class="token punctuation">(</span>t <span class="token operator">&lt;=</span> k<span class="token punctuation">)</span><span class="token punctuation">:</span></span>
68<span class="line">
68        <span class="token keyword">if</span> <span class="token punctuation">(</span>k <span class="token operator">&amp;</span>t <span class="token punctuation">)</span><span class="token operator">&gt;</span><span class="token number">0</span><span class="token punctuation">:</span></span>
69<span class="line">            ans <span class="token operator">=</span> addition<span class="token punctuation">(</span>ans<span class="token punctuation">,</span> x<span class="token punctuation">)</span></span>
70<span class="line">        x <span class="token operator">=</span> addition<span class="token punctuation">(</span>x<span class="token punctuation">,</span> x<span class="token punctuation">)</span></span>
71<span class="line">        t <span class="token operator">&lt;&lt;</span><span class="token operator">=</span> <span class="token number">1</span></span>
72<span class="line">    <span class="token keyword">return</span> ans</span>
73<span class="line"></span>
74<span class="line"><span class="token keyword">def</span> <span class="token function">getrs</span><span class="token punctuation">(</span>z<span class="token punctuation">,</span> k<span class="token punctuation">)</span><span class="token punctuation">:</span></span>
75<span class="line">    <span class="token punctuation">(</span>xp<span class="token punctuation">,</span> yp<span class="token punctuation">)</span> <span class="token operator">=</span> P</span>
76<span class="line">    r <span class="token operator">=</span> xp</span>
77<span class="line">    s <span class="token operator">=</span> <span class="token punctuation">(</span>z <span class="token operator">+</span> r <span class="token operator">*</span> dA <span class="token operator">%</span> n<span class="token punctuation">)</span> <span class="token operator">%</span> n <span class="token operator">*</span> gmpy2<span class="token punctuation">.</span>invert<span class="token punctuation">(</span>k<span class="token punctuation">,</span> n<span class="token punctuation">)</span> <span class="token operator">%</span> n</span>
78<span class="line">    <span class="token keyword">return</span> r<span class="token punctuation">,</span>s</span>
79<span class="line"></span>
80<span class="line">z1 <span class="token operator">=</span> random<span class="token punctuation">.</span>randint<span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">,</span> p<span class="token punctuation">)</span></span>
81<span class="line">z2 <span class="token operator">=</span> random<span class="token punctuation">.</span>randint<span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">,</span> p<span class="token punctuation">)</span></span>
82<span class="line">k <span class="token operator">=</span> random<span class="token punctuation">.</span>randint<span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">,</span> n<span class="token punctuation">)</span></span>
83<span class="line">P <span class="token operator">=</span> multiplication<span class="token punctuation">(</span>G<span class="token punctuation">,</span> k<span class="token punctuation">)</span></span>
84<span class="line">hA <span class="token operator">=</span> multiplication<span class="token punctuation">(</span>G<span class="token punctuation">,</span> dA<span class="token punctuation">)</span></span>
85<span class="line">r1<span class="token punctuation">,</span> s1 <span class="token operator">=</span> getrs<span class="token punctuation">(</span>z1<span class="token punctuation">,</span> k<span class="token punctuation">)</span></span>
86<span class="line">r2<span class="token punctuation">,</span> s2 <span class="token operator">=</span> getrs<span class="token punctuation">(</span>z2<span class="token punctuation">,</span> k<span class="token punctuation">)</span></span>
87<span class="line"></span>
88<span class="line"><span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string">&quot;r1 = {}&quot;</span><span class="token punctuation">.</span><span class="token builtin">format</span><span class="token punctuation">(</span>r1<span class="token punctuation">)</span><span class="token punctuation">)</span></span>
89<span class="line"><span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string">&quot;r2 = {}&quot;</span><span class="token punctuation">.</span><span class="token builtin">format</span><span class="token punctuation">(</span>r2<span class="token punctuation">)</span><span class="token punctuation">)</span></span>
90<span class="line"><span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string">&quot;s1 = {}&quot;</span><span class="token punctuation">.</span><span class="token builtin">format</span><span class="token punctuation">(</span>s1<span class="token punctuation">)</span><span class="token punctuation">)</span></span>
91<span class="line"><span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string">&quot;s2 = {}&quot;</span><span class="token punctuation">.</span><span class="token builtin">format</span><span class="token punctuation">(</span>s2<span class="token punctuation">)</span><span class="token punctuation">)</span></span>
92<span class="line"><span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string">&quot;z1 = {}&quot;</span><span class="token punctuation">.</span><span class="token builtin">format</span><span class="token punctuation">(</span>z1<span class="token punctuation">)</span><span class="token punctuation">)</span></span>
93<span class="line"><span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string">&quot;z2 = {}&quot;</span><span class="token punctuation">.</span><span class="token builtin">format</span><span class="token punctuation">(</span>z2<span class="token punctuation">)</span><span class="token punctuation">)</span></span>
94<span class="line"></span>
95<span class="line">key <span class="token operator">=</span> sha256<span class="token punctuation">(</span>long_to_bytes<span class="token punctuation">(</span>dA<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">.</span>digest<span class="token punctuation">(</span><span class="token punctuation">)</span></span>
96<span class="line">cipher <span class="token operator">=</span> AES<span class="token punctuation">.</span>new<span class="token punctuation">(</span>key<span class="token punctuation">,</span> AES<span class="token punctuation">.</span>MODE_CBC<span class="token punctuation">)</span></span>
97<span class="line">iv <span class="token operator">=</span> cipher<span class="token punctuation">.</span>iv</span>
98<span class="line">encrypted_flag <span class="token operator">=</span> cipher<span class="token punctuation">.</span>encrypt<span class="token punctuation">(</span>pad<span class="token punctuation">(</span>victory_encrypted_flag<span class="token punctuation">.</span>encode<span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span> AES<span class="token punctuation">.</span>block_size<span class="token punctuation">)</span><span class="token punctuation">)</span></span>
99<span class="line">encrypted_flag_hex <span class="token operator">=</span> binascii<span class="token punctuation">.</span>hexlify<span class="token punctuation">(</span>iv <span class="token operator">+</span> encrypted_flag<span class="token punctuation">)</span><span class="token punctuation">.</span>decode<span class="token punctuation">(</span><span class="token string">&#39;utf-8&#39;</span><span class="token punctuation">)</span></span>
100<span class="line"></span>
101<span class="line"><span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string">&quot;Encrypted flag (AES in CBC mode, hex):&quot;</span><span class="token punctuation">,</span> encrypted_flag_hex<span class="token punctuation">)</span></span>
102<span class="line"></span>
103<span class="line"><span class="token comment"># output</span></span>
104<span class="line"><span class="token comment"># r1 = 86806104739558095745988469033305523200538774705708894815836887970976487278764</span></span>
105<span class="line"><span class="token comment">
105# r2 = 86806104739558095745988469033305523200538774705708894815836887970976487278764</span></span>
106<span class="line"><span class="token comment"># s1 = 93400851884262731807098055393482657423555590196362184363643455285862566867372</span></span>
107<span class="line"><span class="token comment"># s2 = 58741027521216057788923508334695668250013849866589902683641825341545919891746</span></span>
108<span class="line"><span class="token comment"># z1 = 47591695289461307212638536234394543297527537576682980326526736956079807805586</span></span>
109<span class="line"><span class="token comment"># z2 = 97911075901954715147720917205165523174582665086645698292621371632896283314804</span></span>
110<span class="line"><span class="token comment"># (&#39;Encrypted flag (AES in CBC mode, hex):&#39;, u&#39;86cd24e2914c0c4d9b87bea34005a98bd8587d14cae71909b917679d3328304e7915e6ba4cad1096faa4a85bc52f8056d3f21ef09516be8a5160f1b338a6b936&#39;)</span></span>
111<span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div><div class="collapsed-lines"></div></div><h3 id="步骤一-安装缺失运行库" tabindex="-1"><a class="header-anchor" href="#步骤一-安装缺失运行库"><span>
111步骤一:安装缺失运行库</span></a></h3><div class="language-bash line-numbers-mode" data-highlighter="prismjs" data-ext="sh"><pre><code class="language-bash"><span class="line"><span class="token comment"># 创建虚拟环境,防止污染本机环境</span></span>
112<span class="line">python3 <span class="token parameter variable">-m</span> venv venv</span>
113<span class="line"><span class="token builtin class-name">source</span> ./venv/bin/activate</span>
114<span class="line"><span class="token comment"># pip安装运行库</span></span>
115<span class="line">pip <span class="token function">install</span> gmpy2 sympy pycryptodome</span>
116<span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h3 id="步骤二-分析加密代码实现" tabindex="-1"><a class="header-anchor" href="#步骤二-分析加密代码实现"><span>步骤二:分析加密代码实现</span></a></h3><div class="language-python line-numbers-mode" data-highlighter="prismjs" data-ext="py"><pre><code class="language-python"><span class="line">key <span class="token operator">=</span> sha256<span class="token punctuation">(</span>long_to_bytes<span class="token punctuation">(</span>dA<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">.</span>digest<span class="token punctuation">(</span><span class="token punctuation">)</span></span>
117<span class="line">cipher <span class="token operator">=</span> AES<span class="token punctuation">.</span>new<span class="token punctuation">(</span>key<span class="token punctuation">,</span> AES<span class="token punctuation">.</span>MODE_CBC<span class="token punctuation">)</span></span>
118<span class="line">iv <span class="token operator">=</span> cipher<span class="token punctuation">.</span>iv</span>
119<span class="line">encrypted_flag <span class="token operator">=</span> cipher<span class="token punctuation">.</span>encrypt<span class="token punctuation">(</span>pad<span class="token punctuation">(</span>victory_encrypted_flag<span class="token punctuation">.</span>encode<span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span> AES<span class="token punctuation">.</span>block_size<span class="token punctuation">)</span><span class="token punctuation">)</span></span>
120<span class="line">encrypted_flag_hex <span class="token operator">=</span> binascii<span class="token punctuation">.</span>hexlify<span class="token punctuation">(</span>iv <span class="token operator">+</span> encrypted_flag<span class="token punctuation">)</span><span class="token punctuation">.</span>decode<span class="token punctuation">(</span><span class="token string">&#39;utf-8&#39;</span><span class="token punctuation">)</span></span>
121<span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>题目提供给我们的是<code>encrypted_flag_hex</code>,我们要获取<code>flag</code>,需要先得到<code>encrypted_flag</code>.</p><div class="language-python line-numbers-mode" data-highlighter="prismjs" data-ext="py"><pre><code class="language-python"><span class="line">encrypted_flag_hex <span class="token operator">=</span> <span class="token string">u&#39;86cd24e2914c0c4d9b87bea34005a98bd8587d14cae71909b917679d3328304e7915e6ba4cad1096faa4a85bc52f8056d3f21ef09516be8a5160f1b338a6b936&#39;</span></span>
122<span class="line">encrypted_flag_bytes <span class="token operator">=</span> binascii<span class="token punctuation">.</span>unhexlify<span class="token punctuation">(</span>encrypted_flag_hex<span class="token punctuation">)</span></span>
123<span class="line">iv <span class="token operator">=</span> encrypted_flag_bytes<span class="token punctuation">[</span><span class="token punctuation">:</span>AES<span class="token punctuation">.</span>block_size<span class="token punctuation">]</span></span>
124<span class="line">encrypted_flag <span class="token operator">=</span> encrypted_flag_bytes<span class="token punctuation">[</span>AES<span class="token punctuation">.</span>block_size<span class="token punctuation">:</span><span class="token punctuation">]</span></span>
125<span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>我们需要获得<code>victory_encrypted_flag</code>的值,也就需要:</p><div class="language-python line-numbers-mode" data-highlighter="prismjs" data-ext="py"><pre><code class="language-python"><span class="line">key <span class="token operator">=</span> sha256<span class="token punctuation">(</span>long_to_bytes<span class="token punctuation">(</span>dA<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">.</span>digest<span class="token punctuation">(</span><span class="token punctuation">)</span></span>
126<span class="line">cipher <span class="token operator">=</span> AES<span class="token punctuation">.</span>new<span class="token punctuation">(</span>key<span class="token punctuation">,</span> AES<span class="token punctuation">.</span>MODE_CBC<span class="token punctuation">,</span> iv<span class="token punctuation">)</span></span>
127<span class="line"></span>
128<span class="line">victory_encrypted_flag <span class="token operator">=</span> unpad<span class="token punctuation">(</span>cipher<span class="token punctuation">.</span>decrypt<span class="token punctuation">(</span>encrypted_flag<span class="token punctuation">)</span><span class="token punctuation">,</span> AES<span class="token punctuation">.</span>block_size<span class="token punctuation">)</span><span class="token punctuation">.</span>decode<span class="token punctuation">(</span><span class="token string">&#39;utf-8&#39;</span><span class="token punctuation">)</span></span>
129<span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>这里需要<code>dA</code>的值,而<code>dA</code>在这里定义:</p><div class="language-python line-numbers-mode" data-highlighter="prismjs" data-ext="py"><pre><code class="language-python"><span class="line">dA <span class="token operator">=</span> nextprime<span class="token punctuation">(</span>random<span class="token punctuation">.</span>randint<span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">,</span> n<span class="token punctuation">)</span><span class="token punctuation">)</span></span>
130<span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div></div></div><p>首先生成一个在 <code>0</code> 到 <code>n</code> 之间的随机整数,然后找到大于这个随机整数的下一个质数,并将其赋值给变量<code>dA</code>. 如果要求得<code>dA</code>,就要求得<code>k</code>的值。</p><h3 id="步骤三-计算得到k值" tabindex="-1"><a class="header-anchor" href="#步骤三-计算得到k值"><span>步骤三:计算得到<code>k</code>值</span></a></h3><p>先看看原函数如何包装 k 值:</p><p>首先,生成范围为<code>(0, n)</code>的随机整数<code>k</code>.</p><div class="language-python line-numbers-mode" data-highlighter="prismjs" data-ext="py"><pre><code class="language-python"><span class="line">n <span class="token operator">=</span> <span class="token number">0xfffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141</span></span>
131<span class="line">k <span class="token operator">=</span> random<span class="token punctuation">.</span>randint<span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">,</span> n<span class="token punctuation">)</span></span>
132<span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div></div></div><p>然后生成范围为<code>(0, p)</code>的随机整数<code>z1</code>, <code>z2</code>.</p><div class="language-python line-numbers-mode" data-highlighter="prismjs" data-ext="py"><pre><code class="language-python"><span class="line">p <span class="token operator">=</span> <span class="token number">0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f</sp
132an></span>
133<span class="line">z1 <span class="token operator">=</span> random<span class="token punctuation">.</span>randint<span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">,</span> p<span class="token punctuation">)</span></span>
134<span class="line">z2 <span class="token operator">=</span> random<span class="token punctuation">.</span>randint<span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">,</span> p<span class="token punctuation">)</span></span>
135<span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p><code>z1</code>, <code>z2</code>均已给出输出值。</p><p>然后将<code>k</code>, <code>z1</code>, <code>z2</code>分别传入<code>getrs()</code>函数。并输出<code>r1</code>, <code>s1</code>, <code>r2</code>, <code>s2</code>.</p><div class="language-python line-numbers-mode" data-highlighter="prismjs" data-ext="py"><pre><code class="language-python"><span class="line">r1<span class="token punctuation">,</span> s1 <span class="token operator">=</span> getrs<span class="token punctuation">(</span>z1<span class="token punctuation">,</span> k<span class="token punctuation">)</span></span>
136<span class="line">r2<span class="token punctuation">,</span> s2 <span class="token operator">=</span> getrs<span class="token punctuation">(</span>z2<span class="token punctuation">,</span> k<span class="token punctuation">)</span></span>
137<span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div></div></div><p>现在已经明白了 k 是如何被一步步包装成六个变量的,可以根据代码逐步的逆向运算得到<code>k</code>值。</p><p>首先,<code>r1</code>, <code>s1</code>, <code>r2</code>, <code>s2</code>指向了一个<code>getrs()</code>函数,我们可以分析一下这个函数。</p><div class="language-python line-numbers-mode" data-highlighter="prismjs" data-ext="py"><pre><code class="language-python"><span class="line"><span class="token keyword">def</span> <span class="token function">getrs</span><span class="token punctuation">(</span>z<span class="token punctuation">,</span> k<span class="token punctuation">)</span><span class="token punctuation">:</span></span>
138<span class="line">    <span class="token punctuation">(</span>xp<span class="token punctuation">,</span> yp<span class="token punctuation">)</span> <span class="token operator">=</span> P</span>
139<span class="line">    r <span class="token operator">=</span> xp</span>
140<span class="line">    s <span class="token operator">=</span> <span class="token punctuation">(</span>z <span class="token operator">+</span> r <span class="token operator">*</span> dA <span class="token operator">%</span> n<span class="token punctuation">)</span> <span class="token operator">%</span> n <span class="token operator">*</span> gmpy2<span class="token punctuation">.</span>invert<span class="token punctuation">(</span>k<span class="token punctuation">,</span> n<span class="token punctuation">)</span> <span class="token operator">%</span> n</span>
141<span class="line">    <span class="token keyword">return</span> r<span class="token punctuation">,</span>s</span>
142<span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>此函数的<code>(xp, yp) = P</code>指向了<code>P = multiplication(G, k)</code>.我们可以分析一下<code>multiplication()</code>函数。</p><div class="language-python line-numbers-mode" data-highlighter="prismjs" data-ext="py"><pre><code class="language-python"><span class="line"><span class="token keyword">def</span> <span class="token function">multiplication</span><span class="token punctuation">(</span>
142x<span class="token punctuation">,</span> k<span class="token punctuation">)</span><span class="token punctuation">:</span></span>
143<span class="line">    ans <span class="token operator">=</span> zero</span>
144<span class="line">    t <span class="token operator">=</span> <span class="token number">1</span></span>
145<span class="line">    <span class="token keyword">while</span><span class="token punctuation">(</span>t <span class="token operator">&lt;=</span> k<span class="token punctuation">)</span><span class="token punctuation">:</span></span>
146<span class="line">        <span class="token keyword">if</span> <span class="token punctuation">(</span>k <span class="token operator">&amp;</span>t <span class="token punctuation">)</span><span class="token operator">&gt;</span><span class="token number">0</span><span class="token punctuation">:</span></span>
147<span class="line">            ans <span class="token operator">=</span> addition<span class="token punctuation">(</span>ans<span class="token punctuation">,</span> x<span class="token punctuation">)</span></span>
148<span class="line">        x <span class="token operator">=</span> addition<span class="token punctuation">(</span>x<span class="token punctuation">,</span> x<span class="token punctuation">)</span></span>
149<span class="line">        t <span class="token operator">&lt;&lt;</span><span class="token operator">=</span> <span class="token number">1</span></span>
150<span class="line">    <span class="token keyword">return</span> ans</span>
151<span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>这个函数的某些变量指向了<code>addition()</code>函数,我们继续看一下这段函数。</p><div class="language-python line-numbers-mode has-collapsed-lines collapsed" data-highlighter="prismjs" data-ext="py" style="--vp-collapsed-lines:15;"><pre><code class="language-python"><span class="line"><span class="token keyword">def</span> <span class="token function">addition</span><span class="token punctuation">(</span>t1<span class="token punctuation">,</span> t2<span class="token punctuation">)</span><span class="token punctuation">:</span></span>
152<span class="line">    <span class="token keyword">if</span> t1 <span class="token operator">==</span> zero<span class="token punctuation">:</span></span>
153<span class="line">        <span class="token keyword">return</span> t2</span>
154<span class="line">    <span class="token keyword">if</span> t2 <span class="token operator">==</span> zero<span class="token punctuation">:</span></span>
155<span class="line">        <span class="token keyword">return</span> t2</span>
156<span class="line">    <span class="token punctuation">(</span>m1<span class="token punctuation">,</span> n1<span class="token punctuation">)</span> <span class="token operator">=</span> t1</span>
157<span class="line">    <span class="token punctuation">(</span>m2<span class="token punctuation">,</span> n2<span class="token punctuation">)</span> <span class="token operator">=</span> t2</span>
158<span class="line">    <span class="token keyword">if</span> m1 <span class="token operator">==</span> m2<span class="token punctuation">:</span></span>
159<span class="line">        <span class="token keyword">if</span> n1 <span class="token operator">==</span> <span class="token number">0</span> <span class="token keyword">or</span> n1 <span class="token operator">!=</span> n2<span class="token punctuation">:</span></span>
160<span class="line">            <span class="token keyword">return</span> zero</span>
161<span class="line">        <span class="token keyword">else</span><span class="token punctuation">:</span></span>
162<span class="line">            k <span class="token operator">=</span> <span class="token punctuation">(</span><span class="token number">3</span> <span class="token operator">*</span> m1 <span class="token operator">*</span> m1 <span class="token operator">+</span> a<span class="token punctuation">)</span> <span class="token operator">%</span> p <span class="token operator">*</span> gmpy2<span class="token punctuation">.</span>invert<span class="token punctuation">(</span><span class="token number">2</span> <span class="token operator">*</span> n1 <span class="token punctuation">,</span> p<span class="token punctuation">)</span> <span class="token operator">%</span> p</span>
163<span class="line">    <span class="token keyword">else</span><span class="token punctuation">:</span></span>
164<span class="line">        k <span class="token operator">=</span> <span class="token punctuation">(</span>
164n2 <span class="token operator">-</span> n1 <span class="token operator">+</span> p<span class="token punctuation">)</span> <span class="token operator">%</span> p <span class="token operator">*</span> gmpy2<span class="token punctuation">.</span>invert<span class="token punctuation">(</span><span class="token punctuation">(</span>m2 <span class="token operator">-</span> m1 <span class="token operator">+</span> p<span class="token punctuation">)</span> <span class="token operator">%</span> p<span class="token punctuation">,</span> p<span class="token punctuation">)</span> <span class="token operator">%</span> p</span>
165<span class="line">    m3 <span class="token operator">=</span> <span class="token punctuation">(</span>k <span class="token operator">*</span> k <span class="token operator">%</span> p <span class="token operator">-</span> m1 <span class="token operator">-</span> m2 <span class="token operator">+</span> p <span class="token operator">*</span> <span class="token number">2</span><span class="token punctuation">)</span> <span class="token operator">%</span> p</span>
166<span class="line">    n3 <span class="token operator">=</span> <span class="token punctuation">(</span>k <span class="token operator">*</span> <span class="token punctuation">(</span>m1 <span class="token operator">-</span> m3<span class="token punctuation">)</span> <span class="token operator">%</span> p <span class="token operator">-</span> n1 <span class="token operator">+</span> p<span class="token punctuation">)</span> <span class="token operator">%</span> p</span>
167<span class="line">    <span class="token keyword">return</span> <span class="token punctuation">(</span><span class="token builtin">int</span><span class="token punctuation">(</span>m3<span class="token punctuation">)</span><span class="token punctuation">,</span><span class="token builtin">int</span><span class="token punctuation">(</span>n3<span class="token punctuation">)</span><span class="token punctuation">)</span></span>
168<span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div><div class="collapsed-lines"></div></div><p>通过这几段有关椭圆函数的运算可以推断出<code>k</code>是使用椭圆曲线数字签名算法(ECDSA)加密的。可参考<a href="https://zhuanlan.zhihu.com/p/455030060" target="_blank" rel="noopener noreferrer">一文看懂椭圆曲线签名算法 - 知乎</a>进行求解<code>k</code>值。</p><div class="language-python line-numbers-mode" data-highlighter="prismjs" data-ext="py"><pre><code class="language-python"><span class="line">k <span class="token operator">=</span> <span class="token punctuation">(</span>z1 <span class="token operator">-</span> z2<span class="token punctuation">)</span> <span class="token operator">*</span> gmpy2<span class="token punctuation">.</span>invert<span class="token punctuation">(</span>s1 <span class="token operator">-</span> s2<span class="token punctuation">,</span> n<span class="token punctuation">)</span> <span class="token operator">%</span> n</span>
169<span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div></div></div><h3 id="步骤四-计算得到da值" tabindex="-1"><a class="header-anchor" href="#步骤四-计算得到da值"><span>步骤四:计算得到<code>dA</code>值</span></a></h3><p>根据之前的分析,可以逆向得到<code>dA</code>.</p><div class="language-python line-numbers-mode" data-highlighter="prismjs" data-ext="py"><pre><code class="language-python"><span class="line">dA <span class="token operator">=</span> <span class="token punctuation">(</span>s1 <span class="token operator">*</span> k <span class="token operator">-</span> z1<span class="token punctuation">)</span> <span class="token operator">*</span> gmpy2<span class="token punctuation">.</span>invert<span class="token punctuation">(</span>r1<span class="token punctuation">,</span> n<span class="token punctuation">)</span> <span class="token operator">%</span> n</span>
170<span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div></div></div><h3 id="步骤五-反推函数得到victory-encrypted-flag" tabindex="-1"><a class="header-anchor" href="#步骤五-反推函数得到victory-encrypted-flag"><span>步骤五:反推函数得到<code>victory_encrypted_flag</code></span></a></h3><p>阅读“步骤二”可得<code>victory_encrypted_flag</code>的逆向代码。</p><div class="language-python line-numbers-mode" data-highlighter="prismjs" data-ext="py"><pre><code class="language-python"><span class="line">key <span class="token operator">=</span> sha256<span class="token punctuation">(</span>long_to_bytes<span class="token punctuation">(</span>dA<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">.</span>digest<span class="token punctuation">(</span><span class="token punctuation">)</span></span>
171<span class="line">cipher <span class="token operator">=</span> AES<span class="token punctuation">.</span>new<span class="token punctuation">(</span>key<span class="token punctuation">,</span> AES<span class="token punctuation">.</span>MODE_CBC<span class="token punctuation">,</span> iv<span class="token punctuation">)</span></span>
172<span class="line"></span>
173<span class="line">victory_encrypted_flag <span class="token operator">=</span> unpad<span class="token punctuation">(</span>cipher<span class="token punctuation">.</span>decrypt<span class="token punctuation">(</span>encrypted_flag<span class="token punctuation">)</span><span class="token punctuation">,</span> AES<span class="token punctuation">.</span>block_size<span class="token punctuation">)</span><span class="token punctuation">.</span>decode<span class="token punctuation">(</span><span class="token string">&#39;utf-8&#39;</span><span class="token punctuation">)</span></span>
174<span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>运行后得到输出值为<code>SDSRDO{xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx}</code>,这并不是正确<code>flag</code>格式。</p><h3 id="步骤六-得到正确flag" tabindex="-1"><a class="header-anchor" href="#步骤六-得到正确flag"><span>步骤六:得到正确<code>flag</code></span></a></h3><p>仔细阅读代码,可以发现<code>victory_encrypted_flag</code>由<code>victory_encrypt()</code>函数得到。</p><div class="language-python line-numbers-mode has-collapsed-lines collapsed" data-highlighter="prismjs" data-ext="py" style="--vp-collapsed-lines:15;"><pre><code class="language-python"><span class="line"><span class="token keyword">def</span> <span class="token function">victory_encrypt</span><span class="token punctuation">(</span>plaintext<span class="token punctuation">,</span> key<span class="token punctuation">)</span><span class="token punctuation">:</span></span>
175<span class="line">    key <span class="token operator">=</span> key<span class="token punctuation">.</span>upper<span class="token punctuation">(</span><span class="token punctuation">)</span></span>
176<span class="line">    key_length <span class="token operator">=</span> <span class="token builtin">len</span><span class="token punctuation">(</span>key<span class="token punctuation">)</span></span>
177<span class="line">    plaintext <span class="token operator">=</span> plaintext<span class="token punctuation">.</span>upper<span class="token punctuation">(</span><span class="token punctuation">)</span></span>
178<span class="line">
178    ciphertext <span class="token operator">=</span> <span class="token string">&#39;&#39;</span></span>
179<span class="line"></span>
180<span class="line">    <span class="token keyword">for</span> i<span class="token punctuation">,</span> char <span class="token keyword">in</span> <span class="token builtin">enumerate</span><span class="token punctuation">(</span>plaintext<span class="token punctuation">)</span><span class="token punctuation">:</span></span>
181<span class="line">        <span class="token keyword">if</span> char<span class="token punctuation">.</span>isalpha<span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span></span>
182<span class="line">            shift <span class="token operator">=</span> <span class="token builtin">ord</span><span class="token punctuation">(</span>key<span class="token punctuation">[</span>i <span class="token operator">%</span> key_length<span class="token punctuation">]</span><span class="token punctuation">)</span> <span class="token operator">-</span> <span class="token builtin">ord</span><span class="token punctuation">(</span><span class="token string">&#39;A&#39;</span><span class="token punctuation">)</span></span>
183<span class="line">            encrypted_char <span class="token operator">=</span> <span class="token builtin">chr</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token builtin">ord</span><span class="token punctuation">(</span>char<span class="token punctuation">)</span> <span class="token operator">-</span> <span class="token builtin">ord</span><span class="token punctuation">(</span><span class="token string">&#39;A&#39;</span><span class="token punctuation">)</span> <span class="token operator">+</span> shift<span class="token punctuation">)</span> <span class="token operator">%</span> <span class="token number">26</span> <span class="token operator">+</span> <span class="token builtin">ord</span><span class="token punctuation">(</span><span class="token string">&#39;A&#39;</span><span class="token punctuation">)</span><span class="token punctuation">)</span></span>
184<span class="line">            ciphertext <span class="token operator">+=</span> encrypted_char</span>
185<span class="line">        <span class="token keyword">else</span><span class="token punctuation">:</span></span>
186<span class="line">            ciphertext <span class="token operator">+=</span> char</span>
187<span class="line"></span>
188<span class="line">    <span class="token keyword">return</span> ciphertext</span>
189<span class="line"></span>
190<span class="line">victory_key <span class="token operator">=</span> <span class="token string">&quot;WANGDINGCUP&quot;</span></span>
191<span class="line">victory_encrypted_flag <span class="token operator">=</span> victory_encrypt<span class="token punctuation">(</span>flag<span class="token punctuation">,</span> victory_key<span class="token punctuation">)</span></span>
192<span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div><div class="collapsed-lines"></div></div><p>我们反推<code>victory_encrypt()</code>得到<code>victory_decrypt()</code></p><div class="language-python line-numbers-mode has-collapsed-lines collapsed" data-highlighter="prismjs" data-ext="py" style="--vp-collapsed-lines:15;"><pre><code class="language-python"><span class="line"><span class="token keyword">def</span> <span class="token function">victory_decrypt</span><span class="token punctuation">(</span>
192ciphertext<span class="token punctuation">,</span> key<span class="token punctuation">)</span><span class="token punctuation">:</span></span>
193<span class="line">	key <span class="token operator">=</span> key<span class="token punctuation">.</span> upper<span class="token punctuation">(</span><span class="token punctuation">)</span></span>
194<span class="line">	key_length <span class="token operator">=</span> <span class="token builtin">len</span><span class="token punctuation">(</span>key<span class="token punctuation">)</span></span>
195<span class="line">	ciphertext <span class="token operator">=</span> ciphertext<span class="token punctuation">.</span> upper<span class="token punctuation">(</span><span class="token punctuation">)</span></span>
196<span class="line">	plaintext <span class="token operator">=</span> <span class="token string">&#39;&#39;</span></span>
197<span class="line"></span>
198<span class="line">	<span class="token keyword">for</span> i<span class="token punctuation">,</span> char <span class="token keyword">in</span> <span class="token builtin">enumerate</span><span class="token punctuation">(</span>
198ciphertext<span class="token punctuation">)</span><span class="token punctuation">:</span></span>
199<span class="line">		<span class="token keyword">if</span> char<span class="token punctuation">.</span>isalpha<span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span></span>
200<span class="line">			shift <span class="token operator">=</span> <span class="token builtin">ord</span><span class="token punctuation">(</span>key<span class="token punctuation">[</span>i <span class="token operator">%</span> key_length<span class="token punctuation">]</span><span class="token punctuation">)</span> <span class="token operator">-</span> <span class="token builtin">ord</span><span class="token punctuation">(</span><span class="token string">&#39;A&#39;</span><span class="token punctuation">)</span></span>
201<span class="line">			decrypted_char <span class="token operator">=</span> <span class="token builtin">chr</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token builtin">ord</span><span class="token punctuation">(</span>char<span class="token punctuation">)</span> <span class="token operator">-</span> <span class="token builtin">ord</span><span class="token punctuation">(</span><span class="token string">&#39;A&#39;</span><span class="token punctuation">)</span> <span class="token operator">-</span> shift <span class="token operator">+</span><span class="token number">26</span><span class="token punctuation">)</span><span class="token operator">%</span> <span class="token number">26</span> <span class="token operator">+</span> <span class="token builtin">ord</span><span class="token punctuation">(</span><span class="token string">&#39;A&#39;</span><span class="token punctuation">)</span><span class="token punctuation">)</span></span>
202<span class="line">			plaintext <span class="token operator">+=</span> decrypted_char</span>
203<span class="line">		<span class="token keyword">else</span><span class="token punctuation">:</span></span>
204<span class="line">			plaintext <span class="token operator">+=</span> char</span>
205<span class="line"></span>
206<span class="line">	<span class="token keyword">return</span> plaintext</span>
207<span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div><div class="collapsed-lines"></div></div><p>通过<code>victory_decrypt()</code>可以得到大写的<code>FLAG</code>,将其转换成小写<code>flag</code>即可。</p><h3 id="完整实现源码" tabindex="-1"><a class="header-anchor" href="#完整实现源码"><span>完整实现源码</span></a></h3><div class="language-python line-numbers-mode has-collapsed-lines collapsed" data-highlighter="prismjs" data-ext="py" style="--vp-collapsed-lines:15;"><pre><code class="language-python"><span class="line"><span class="token keyword">import</span> binascii</span>
208<span class="line"><span class="token keyword">from</span> hashlib <span class="token keyword">import</span> sha256</span>
209<span class="line"><span class="token keyword">from</span> Crypto<span class="token punctuation">.</span>Cipher <span class="token keyword">import</span> AES</span>
210<span class="line"><span class="token keyword">from</span> Crypto<span class="token punctuation">.</span>Util<span class="token punctuation">.</span>number <span class="token keyword">import</span> long_to_bytes</span>
211<span class="line"><span class="token keyword">from</span> Crypto<span class="token punctuation">.</span>Util<span class="token punctuation">.</span>Padding <span class="token keyword">
211import</span> unpad</span>
212<span class="line"><span class="token keyword">import</span> gmpy2</span>
213<span class="line"></span>
214<span class="line">n <span class="token operator">=</span> <span class="token number">0xfffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141</span></span>
215<span class="line">r1 <span class="token operator">=</span> <span class="token number">86806104739558095745988469033305523200538774705708894815836887970976487278764</span></span>
216<span class="line">r2 <span class="token operator">=</span> <span class="token number">86806104739558095745988469033305523200538774705708894815836887970976487278764</span></span>
217<span class="line">s1 <span class="token operator">=</span> <span class="token number">93400851884262731807098055393482657423555590196362184363643455285862566867372</span></span>
218<span class="line">s2 <span class="token operator">=</span> <span class="token number">58741027521216057788923508334695668250013849866589902683641825341545919891746</span></span>
219<span class="line">z1 <span class="token operator">=</span> <span class="token number">47591695289461307212638536234394543297527537576682980326526736956079807805586</span></span>
220<span class="line">z2 <span class="token operator">=</span> <span class="token number">97911075901954715147720917205165523174582665086645698292621371632896283314804</span></span>
221<span class="line">k <span class="token operator">=</span> <span class="token punctuation">(</span>z1 <span class="token operator">-</span> z2<span class="token punctuation">)</span> <span class="token operator">*</span> gmpy2<span class="token punctuation">.</span>invert<span class="token punctuation">(</span>s1 <span class="token operator">-</span> s2<span class="token punctuation">,</span> n<span class="token punctuation">)</span> <span class="token operator">%</span> n</span>
222<span class="line">dA <span class="token operator">=</span> <span class="token punctuation">(</span>s1 <span class="token operator">*</span> k <span class="token operator">-</span> z1<span class="token punctuation">)</span> <span class="token operator">*</span> gmpy2<span class="token punctuation">.</span>invert<span class="token punctuation">(</span>r1<span class="token punctuation">,</span> n<span class="token punctuation">)</span> <span class="token operator">%</span> n</span>
223<span class="line"></span>
224<span class="line">encrypted_flag_hex <span class="token operator">=</span> <span class="token string">u&#39;86cd24e2914c0c4d9b87bea34005a98bd8587d14cae71909b917679d3328304e7915e6ba4cad1096faa4a85bc52f8056d3f21ef09516be8a5160f1b338a6b936&#39;</span></span>
225<span class="line">encrypted_flag_bytes <span class="token operator">=</span> binascii<span class="token punctuation">.</span>unhexlify<span class="token punctuation">(</span>encrypted_flag_hex<span class="token punctuation">)</span></span>
226<span class="line">iv <span class="token operator">=</span> encrypted_flag_bytes<span class="token punctuation">[</span><span class="token punctuation">:</span>AES<span class="token punctuation">.</span>block_size<span class="token punctuation">]</span></span>
227<span class="line">encrypted_flag <span class="token operator">=</span> encrypted_flag_bytes<span class="token punctuation">[</span>AES<span class="token punctuation">.</span>block_size<span class="token punctuation">:</span><span class="token punctuation">]</span></span>
228<span class="line"></span>
229<span class="line">key <span class="token operator">=</span> sha256<span class="token punctuation">(</span>long_to_bytes<span class="token punctuation">(</span>dA<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">.</span>digest<span class="token punctuation">(</span><span class="token punctuation">)</span></span>
230<span class="line">cipher <span class="token operator">=</span> AES<span class="token punctuation">.</span>new<span class="token punctuation">(</span>key<span class="token punctuation">,</span> AES<span class="token punctuation">.</span>MODE_CBC<span class="token punctuation">,</span> iv<span class="token punctuation">)</span></span>
231<span class="line"></span>
232<span class="line">victory_encrypted_flag <span class="token operator">=</span> unpad<span class="token punctuation">(</span>cipher<span class="token punctuation">.</span>decrypt<span class="token punctuation">(</span>encrypted_flag<span class="token punctuation">)</span><span class="token punctuation">,</span> AES<span class="token punctuation">.</span>block_size<span class="token punctuation">)</span><span class="token punctuation">.</span>decode<span class="token punctuation">(</span><span class="token string">&#39;utf-8&#39;</span><span class="token punctuation">)</span></span>
233<span class="line"></span>
234<span class="line"><span class="token keyword">def</span> <span class="token function">victory_decrypt</span><span class="token punctuation">(</span>
234ciphertext<span class="token punctuation">,</span> key<span class="token punctuation">)</span><span class="token punctuation">:</span></span>
235<span class="line">	key <span class="token operator">=</span> key<span class="token punctuation">.</span> upper<span class="token punctuation">(</span><span class="token punctuation">)</span></span>
236<span class="line">	key_length <span class="token operator">=</span> <span class="token builtin">len</span><span class="token punctuation">(</span>key<span class="token punctuation">)</span></span>
237<span class="line">	ciphertext <span class="token operator">=</span> ciphertext<span class="token punctuation">.</span> upper<span class="token punctuation">(</span><span class="token punctuation">)</span></span>
238<span class="line">	plaintext <span class="token operator">=</span> <span class="token string">&#39;&#39;</span></span>
239<span class="line"></span>
240<span class="line">	<span class="token keyword">for</span> i<span class="token punctuation">,</span> char <span class="token keyword">in</span> <span class="token builtin">enumerate</span><span class="token punctuation">(</span>
240ciphertext<span class="token punctuation">)</span><span class="token punctuation">:</span></span>
241<span class="line">		<span class="token keyword">if</span> char<span class="token punctuation">.</span>isalpha<span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span></span>
242<span class="line">			shift <span class="token operator">=</span> <span class="token builtin">ord</span><span class="token punctuation">(</span>key<span class="token punctuation">[</span>i <span class="token operator">%</span> key_length<span class="token punctuation">]</span><span class="token punctuation">)</span> <span class="token operator">-</span> <span class="token builtin">ord</span><span class="token punctuation">(</span><span class="token string">&#39;A&#39;</span><span class="token punctuation">)</span></span>
243<span class="line">			decrypted_char <span class="token operator">=</span> <span class="token builtin">chr</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token builtin">ord</span><span class="token punctuation">(</span>char<span class="token punctuation">)</span> <span class="token operator">-</span> <span class="token builtin">ord</span><span class="token punctuation">(</span><span class="token string">&#39;A&#39;</span><span class="token punctuation">)</span> <span class="token operator">-</span> shift <span class="token operator">+</span><span class="token number">26</span><span class="token punctuation">)</span><span class="token operator">%</span> <span class="token number">26</span> <span class="token operator">+</span> <span class="token builtin">ord</span><span class="token punctuation">(</span><span class="token string">&#39;A&#39;</span><span class="token punctuation">)</span><span class="token punctuation">)</span></span>
244<span class="line">			plaintext <span class="token operator">+=</span> decrypted_char</span>
245<span class="line">		<span class="token keyword">else</span><span class="token punctuation">:</span></span>
246<span class="line">			plaintext <span class="token operator">+=</span> char</span>
247<span class="line"></span>
248<span class="line">	<span class="token keyword">return</span> plaintext</span>
249<span class="line"></span>
250<span class="line">victory_key <span class="token operator">=</span> <span class="token string">&quot;WANGDINGCUP&quot;</span></span>
251<span class="line">flag <span class="token operator">=</span> victory_decrypt<span class="token punctuation">(</span>victory_encrypted_flag<span class="token punctuation">,</span> victory_key<span class="token punctuation">)</span></span>
252<span class="line"></span>
253<span class="line"><span class="token keyword">print</span><span class="token punctuation">(</span>flag<span class="token punctuation">)</span></span>
254<span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div><div class="collapsed-lines"></div></div>`,46)])])}const i=s(e,[["render",o]]),u=JSON.parse(`{"path":"/posts/wdb-qinglong-crypto2.html","title":"椭圆曲线签名算法 | 网鼎杯20241029青龙组 | Crypto2","lang":"zh-CN","frontmatter":{"title":"椭圆曲线签名算法 | 网鼎杯20241029青龙组 | Crypto2","category":["CTF"],"tag":["Python","Crypto"],"description":"原题 步骤一
254:安装缺失运行库 步骤二:分析加密代码实现 题目提供给我们的是encrypted_flag_hex,我们要获取flag,需要先得到encrypted_flag. 我们需要获得victory_encrypted_flag的值,也就需要: 这里需要dA的值,而dA在这里定义: 首先生成一个在 0 到 n 之间的随机整数,然后找到大于这个随机整数...","head":[["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"椭圆曲线签名算法 | 网鼎杯20241029青龙组 | Crypto2\\",\\"image\\":[\\"\\"],\\"dateModified\\":\\"2024-12-10T14:04:03.000Z\\",\\"author\\":[{\\"@type\\":\\"Person\\",\\"name\\":\\"undefined\\",\\"url\\":\\"https://www.hestudio.net/about/\\",\\"email\\":\\"[email protected]\\"}]}"],["meta",{"property":"og:url","content":"https://www.hestudio.net/posts/wdb-qinglong-crypto2.html"}],["meta",{"property":"og:site_name","content":"heStudio"}],["meta",{"property":"og:title","content":"椭圆曲线签名算法 | 网鼎杯20241029青龙组 | Crypto2"}],["meta",{"property":"og:description","content":"原题 步骤一:安装缺失运行库 步骤二:分析加密代码实现 题目提供给我们的是encrypted_flag_hex,我们要获取flag,需要先得到encrypted_flag. 我们需要获得victory_encrypted_flag的值,也就需要: 这里需要dA的值,而dA在这里定义: 首先生成一个在 0 到 n 之间的随机整数,然后找到大于这个随机整数..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2024-12-10T14:04:03.000Z"}],["meta",{"property":"article:tag","content":"Crypto"}],["meta",{"property":"article:tag","content":"Python"}],["meta",{"property":"article:modified_time","content":"2024-12-10T14:04:03.000Z"}]]},"git":{"createdTime":1730520238000,"updatedTime":1733839443000},"readingTime":{"minutes":4.73,"words":1418},"filePathRelative":"posts/wdb-qinglong-crypto2.md","excerpt":"<h3>原题</h3>\\n<div class=\\"language-python line-numbers-mode has-collapsed-lines collapsed\\" data-highlighter=\\"prismjs\\" data-ext=\\"py\\" style=\\"--vp-collapsed-lines:15;\\"><pre><code class=\\"language-python\\"><span class=\\"line\\"><span class=\\"token keyword\\">import</span> gmpy2</span>\\n<span class=\\"line\\"><span class=\\"token keyword\\">import</span> random</span>\\n<span class=\\"line\\"><span class=\\"token keyword\\">import</span> binascii</span>\\n<span class=\\"line\\"><span class=\\"token keyword\\">from</span> hashlib <span class=\\"token keyword\\">import</span> sha256</span>\\n<span class=\\"line\\"><span class=\\"token keyword\\">from</span> sympy <span class=\\"token keyword\\">import</span> nextprime</span>\\n<span class=\\"line\\"><span class=\\"token keyword\\">from</span> Crypto<span class=\\"token punctuation\\">.</span>Cipher <span class=\\"token keyword\\">import</span> AES</span>\\n<span class=\\"line\\"><span class=\\"token keyword\\">from</span> Crypto<span class=\\"token punctuation\\">.</span>Util<span class=\\"token punctuation\\">.</span>Padding <span class=\\"token keyword\\">import</span> pad</span>\\n<span class=\\"line\\"><span class=\\"token keyword\\">from</span> Crypto<span class=\\"token punctuation\\">.</span>Util<span class=\\"token punctuation\\">.</span>number <span class=\\"token keyword\\">import</span> long_to_bytes</span>\\n<span class=\\"line\\"><span class=\\"token keyword\\">from</span> FLAG <span class=\\"token keyword\\">import</span> flag</span>\\n<span class=\\"line\\"><span class=\\"token comment\\">#flag = 'wdflag{123}'</span></span>\\n<span class=\\"line\\"></span>\\n<span class=\\"line\\"><span class=\\"token keyword\\">def</span> <span class=\\"token function\\">victory_encrypt</span><span class=\\"token punctuation\\">(</span>plaintext<span class=\\"token punctuation\\">,</span> key<span class=\\"token punctuation\\">)</span><span class=\\"token punctuation\\">:</span></span>\\n<span class=\\"line\\">    key <span class=\\"token operator\\">=</span> key<span class=\\"token punctuation\\">.</span>upper<span class=\\"token punctuation\\">(</span><span class=\\"token punctuation\\">)</span></span>\\n<span class=\\"line\\">    key_length <span class=\\"token operator\\">=</span> <span class=\\"token builtin\\">len</span><span class=\\"token punctuation\\">(</span>key<span class=\\"token punctuation\\">)</span></span>\\n<span class=\\"line\\">    plaintext <span class=\\"token operator\\">=</span> plaintext<span class=\\"token punctuation\\">.</span>upper<span class=\\"token punctuation\\">(</span><span class=\\"token punctuation\\">)</span></span>\\n<span class=\\"line\\">
254    ciphertext <span class=\\"token operator\\">=</span> <span class=\\"token string\\">''</span></span>\\n<span class=\\"line\\"></span>\\n<span class=\\"line\\">    <span class=\\"token keyword\\">for</span> i<span class=\\"token punctuation\\">,</span> char <span class=\\"token keyword\\">in</span> <span class=\\"token builtin\\">enumerate</span><span class=\\"token punctuation\\">(</span>plaintext<span class=\\"token punctuation\\">)</span><span class=\\"token punctuation\\">:</span></span>\\n<span class=\\"line\\">        <span class=\\"token keyword\\">if</span> char<span class=\\"token punctuation\\">.</span>isalpha<span class=\\"token punctuation\\">(</span><span class=\\"token punctuation\\">)</span><span class=\\"token punctuation\\">:</span></span>\\n<span class=\\"line\\">            shift <span class=\\"token operator\\">=</span> <span class=\\"token builtin\\">ord</span><span class=\\"token punctuation\\">(</span>key<span class=\\"token punctuation\\">[</span>i <span class=\\"token operator\\">%</span> key_length<span class=\\"token punctuation\\">]</span><span class=\\"token punctuation\\">)</span> <span class=\\"token operator\\">-</span> <span class=\\"token builtin\\">ord</span><span class=\\"token punctuation\\">(</span><span class=\\"token string\\">'A'</span><span class=\\"token punctuation\\">)</span></span>\\n<span class=\\"line\\">            encrypted_char <span class=\\"token operator\\">=</span> <span class=\\"token builtin\\">chr</span><span class=\\"token punctuation\\">(</span><span class=\\"token punctuation\\">(</span><span class=\\"token builtin\\">ord</span><span class=\\"token punctuation\\">(</span>char<span class=\\"token punctuation\\">)</span> <span class=\\"token operator\\">-</span> <span class=\\"token builtin\\">ord</span><span class=\\"token punctuation\\">(</span><span class=\\"token string\\">'A'</span><span class=\\"token punctuation\\">)</span> <span class=\\"token operator\\">+</span> shift<span class=\\"token punctuation\\">)</span> <span class=\\"token operator\\">%</span> <span class=\\"token number\\">26</span> <span class=\\"token operator\\">+</span> <span class=\\"token builtin\\">ord</span><span class=\\"token punctuation\\">(</span><span class=\\"token string\\">'A'</span><span class=\\"token punctuation\\">)</span><span class=\\"token punctuation\\">)</span></span>\\n<span class=\\"line\\">            ciphertext <span class=\\"token operator\\">+=</span> encrypted_char</span>\\n<span class=\\"line\\">        <span class=\\"token keyword\\">else</span><span class=\\"token punctuation\\">:</span></span>\\n<span class=\\"line\\">            ciphertext <span class=\\"token operator\\">+=</span> char</span>\\n<span class=\\"line\\"></span>\\n<span class=\\"line\\">    <span class=\\"token keyword\\">return</span> ciphertext</span>\\n<span class=\\"line\\"></span>\\n<span class=\\"line\\">victory_key <span class=\\"token operator\\">=</span> <span class=\\"token string\\">\\"WANGDINGCUP\\"</span></span>\\n<span class=\\"line\\">victory_encrypted_flag <span class=\\"token operator\\">=</span> victory_encrypt<span class=\\"token punctuation\\">(</span>flag<span class=\\"token punctuation\\">,</span> victory_key<span class=\\"token punctuation\\">)</span></span>\\n<span class=\\"line\\"></span>\\n<span class=\\"line\\">p <span class=\\"token operator\\">=</span> <span class=\\"token number\\">0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f</span></span>\\n<span class=\\"line\\">a <span class=\\"token operator\\">=</span> <span class=\\"token number\\">0</span></span>\\n<span class=\\"line\\">b <span class=\\"token operator\\">=</span> <span class=\\"token number\\">7</span></span>\\n<span class=\\"line\\">xG <span class=\\"token operator\\">=</span> <span class=\\"token number\\">0x79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798</span></span>\\n<span class=\\"line\\">yG <span class=\\"token operator\\">=</span> <span class=\\"token number\\">0x483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8</span></span>\\n<span class=\\"line\\">G <span class=\\"token operator\\">=</span> <span class=\\"token punctuation\\">(</span>xG<span class=\\"token punctuation\\">,</span>
254 yG<span class=\\"token punctuation\\">)</span></span>\\n<span class=\\"line\\">n <span class=\\"token operator\\">=</span> <span class=\\"token number\\">0xfffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141</span></span>\\n<span class=\\"line\\">h <span class=\\"token operator\\">=</span> <span class=\\"token number\\">1</span></span>\\n<span class=\\"line\\">zero <span class=\\"token operator\\">=</span> <span class=\\"token punctuation\\">(</span><span class=\\"token number\\">0</span><span class=\\"token punctuation\\">,</span><span class=\\"token number\\">0</span><span class=\\"token punctuation\\">)</span></span>\\n<span class=\\"line\\"></span>\\n<span class=\\"line\\">dA <span class=\\"token operator\\">=</span> nextprime<span class=\\"token punctuation\\">(</span>random<span class=\\"token punctuation\\">.</span>randint<span class=\\"token punctuation\\">(</span><span class=\\"token number\\">0</span><span class=\\"token punctuation\\">,</span> n<span class=\\"token punctuation\\">)</span><span class=\\"token punctuation\\">)</span></span>\\n<span class=\\"line\\"></span>\\n<span class=\\"line\\"><span class=\\"token keyword\\">if</span> dA <span class=\\"token operator\\">&gt;</span> n<span class=\\"token punctuation\\">:</span></span>\\n<span class=\\"line\\">    <span class=\\"token keyword\\">print</span><span class=\\"token punctuation\\">(</span><span class=\\"token string\\">\\"warning!!\\"</span><span class=\\"token punctuation\\">)</span></span>\\n<span class=\\"line\\"></span>\\n<span class=\\"line\\"><span class=\\"token keyword\\">def</span> <span class=\\"token function\\">addition</span><span class=\\"token punctuation\\">(</span>t1<span class=\\"token punctuation\\">,</span> t2<span class=\\"token punctuation\\">)</span><span class=\\"token punctuation\\">:</span></span>\\n<span class=\\"line\\">    <span class=\\"token keyword\\">if</span> t1 <span class=\\"token operator\\">==</span> zero<span class=\\"token punctuation\\">:</span></span>\\n<span class=\\"line\\">        <span class=\\"token keyword\\">return</span> t2</span>\\n<span class=\\"line\\">    <span class=\\"token keyword\\">if</span> t2 <span class=\\"token operator\\">==</span> zero<span class=\\"token punctuation\\">:</span></span>\\n<span class=\\"line\\">        <span class=\\"token keyword\\">return</span> t2</span>\\n<span class=\\"line\\">    <span class=\\"token punctuation\\">(</span>m1<span class=\\"token punctuation\\">,</span> n1<span class=\\"token punctuation\\">)</span> <span class=\\"token operator\\">=</span> t1</span>\\n<span class=\\"line\\">    <span class=\\"token punctuation\\">(</span>m2<span class=\\"token punctuation\\">,</span> n2<span class=\\"token punctuation\\">)</span> <span class=\\"token operator\\">=</span> t2</span>\\n<span class=\\"line\\">    <span class=\\"token keyword\\">if</span> m1 <span class=\\"token operator\\">==</span> m2<span class=\\"token punctuation\\">:</span></span>\\n<span class=\\"line\\">        <span class=\\"token keyword\\">if</span> n1 <span class=\\"token operator\\">==</span> <span class=\\"token number\\">0</span> <span class=\\"token keyword\\">or</span> n1 <span class=\\"token operator\\">!=</span> n2<span class=\\"token punctuation\\">:</span></span>\\n<span class=\\"line\\">            <span class=\\"token keyword\\">return</span> zero</span>\\n<span class=\\"line\\">        <span class=\\"token keyword\\">else</span><span class=\\"token punctuation\\">:</span></span>\\n<span class=\\"line\\">            k <span class=\\"token operator\\">=</span> <span class=\\"token punctuation\\">(</span><span class=\\"token number\\">3</span> <span class=\\"token operator\\">*</span> m1 <span class=\\"token operator\\">*</span> m1 <span class=\\"token operator\\">+</span> a<span class=\\"token punctuation\\">)</span> <span class=\\"token operator\\">%</span> p <span class=\\"token operator\\">*</span> gmpy2<span class=\\"token punctuation\\">.</span>invert<span class=\\"token punctuation\\">(</span><span class=\\"token number\\">2</span> <span class=\\"token operator\\">*</span> n1 <span class=\\"token punctuation\\">,</span> p<span class=\\"token punctuation\\">)</span> <span class=\\"token operator\\">%</span> p</span>\\n<span class=\\"line\\">    <span class=\\"token keyword\\">else</span><span class=\\"token punctuation\\">:</span></span>\\n<span class=\\"line\\">        k <span class=\\"token operator\\">=</span> <span class=\\"token punctuation\\">(</span>
254n2 <span class=\\"token operator\\">-</span> n1 <span class=\\"token operator\\">+</span> p<span class=\\"token punctuation\\">)</span> <span class=\\"token operator\\">%</span> p <span class=\\"token operator\\">*</span> gmpy2<span class=\\"token punctuation\\">.</span>invert<span class=\\"token punctuation\\">(</span><span class=\\"token punctuation\\">(</span>m2 <span class=\\"token operator\\">-</span> m1 <span class=\\"token operator\\">+</span> p<span class=\\"token punctuation\\">)</span> <span class=\\"token operator\\">%</span> p<span class=\\"token punctuation\\">,</span> p<span class=\\"token punctuation\\">)</span> <span class=\\"token operator\\">%</span> p</span>\\n<span class=\\"line\\">    m3 <span class=\\"token operator\\">=</span> <span class=\\"token punctuation\\">(</span>k <span class=\\"token operator\\">*</span> k <span class=\\"token operator\\">%</span> p <span class=\\"token operator\\">-</span> m1 <span class=\\"token operator\\">-</span> m2 <span class=\\"token operator\\">+</span> p <span class=\\"token operator\\">*</span> <span class=\\"token number\\">2</span><span class=\\"token punctuation\\">)</span> <span class=\\"token operator\\">%</span> p</span>\\n<span class=\\"line\\">    n3 <span class=\\"token operator\\">=</span> <span class=\\"token punctuation\\">(</span>k <span class=\\"token operator\\">*</span> <span class=\\"token punctuation\\">(</span>m1 <span class=\\"token operator\\">-</span> m3<span class=\\"token punctuation\\">)</span> <span class=\\"token operator\\">%</span> p <span class=\\"token operator\\">-</span> n1 <span class=\\"token operator\\">+</span> p<span class=\\"token punctuation\\">)</span> <span class=\\"token operator\\">%</span> p</span>\\n<span class=\\"line\\">    <span class=\\"token keyword\\">return</span> <span class=\\"token punctuation\\">(</span><span class=\\"token builtin\\">int</span><span class=\\"token punctuation\\">(</span>m3<span class=\\"token punctuation\\">)</span><span class=\\"token punctuation\\">,</span><span class=\\"token builtin\\">int</span><span class=\\"token punctuation\\">(</span>n3<span class=\\"token punctuation\\">)</span><span class=\\"token punctuation\\">)</span></span>\\n<span class=\\"line\\"></span>\\n<span class=\\"line\\"><span class=\\"token keyword\\">def</span> <span class=\\"token function\\">multiplication</span><span class=\\"token punctuation\\">(</span>x<span class=\\"token punctuation\\">,</span> k<span class=\\"token punctuation\\">)</span><span class=\\"token punctuation\\">:</span></span>\\n<span class=\\"line\\">    ans <span class=\\"token operator\\">=</span> zero</span>\\n<span class=\\"line\\">    t <span class=\\"token operator\\">=</span> <span class=\\"token number\\">1</span></span>\\n<span class=\\"line\\">    <span class=\\"token keyword\\">while</span><span class=\\"token punctuation\\">(</span>t <span class=\\"token operator\\">&lt;=</span> k<span class=\\"token punctuation\\">)</span><span class=\\"token punctuation\\">:</span></span>\\n<span class=\\"line\\">        <span class=\\"token keyword\\">if</span> <span class=\\"token punctuation\\">(</span>k <span class=\\"token operator\\">&amp;</span>t <span class=\\"token punctuation\\">)</span><span class=\\"token operator\\">&gt;</span><span class=\\"token number\\">0</span><span class=\\"token punctuation\\">:</span></span>\\n<span class=\\"line\\">            ans <span class=\\"token operator\\">=</span> addition<span class=\\"token punctuation\\">(</span>ans<span class=\\"token punctuation\\">,</span> x<span class=\\"token punctuation\\">)</span></span>\\n<span class=\\"line\\">        x <span class=\\"token operator\\">=</span> addition<span class=\\"token punctuation\\">(</span>x<span class=\\"token punctuation\\">,</span> x<span class=\\"token punctuation\\">)</span></span>\\n<span class=\\"line\\">        t <span class=\\"token operator\\">&lt;&lt;</span><span class=\\"token operator\\">=</span> <span class=\\"token number\\">1</span></span>\\n<span class=\\"line\\">    <span class=\\"token keyword\\">return</span> ans</span>\\n<span class=\\"line\\"></span>\\n<span class=\\"line\\"><span class=\\"token keyword\\">def</span> <span class=\\"token function\\">getrs</span><span class=\\"token punctuation\\">(</span>z<span class=\\"token punctuation\\">,</span> k<span class=\\"token punctuation\\">)</span><span class=\\"token punctuation\\">:</span></span>\\n<span class=\\"line\\">    <span class=\\"token punctuation\\">(</span>xp<span class=\\"token punctuation\\">,</span> yp<span class=\\"token punctuation\\">)</span> <span class=\\"token operator\\">=</span> P</span>\\n<span class=\\"line\\">    r <span class=\\"token operator\\">=</span> xp</span>\\n<span class=\\"line\\">    s <span class=\\"token operator\\">=</span> <span class=\\"token punctuation\\">(</span>z <span class=\\"token operator\\">+</span> r <span class=\\"token operator\\">*</span> dA <span class=\\"token operator\\">%</span> n<span class=\\"token punctuation\\">)</span> <span class=\\"token operator\\">%</span> n <span class=\\"token operator\\">*</span> gmpy2<span class=\\"token punctuation\\">.</span>invert<span class=\\"token punctuation\\">(</span>k<span class=\\"token punctuation\\">,</span> n<span class=\\"token punctuation\\">)</span> <span class=\\"token operator\\">%</span> n</span>\\n<span class=\\"line\\">    <span class=\\"token keyword\\">return</span> r<span class=\\"token punctuation\\">,</span>s</span>\\n<span class=\\"line\\"></span>\\n<span class=\\"line\\">z1 <span class=\\"token operator\\">=</span> random<span class=\\"token punctuation\\">.</span>randint<span class=\\"token punctuation\\">(</span><span class=\\"token number\\">0</span><span class=\\"token punctuation\\">,</span> p<span class=\\"token punctuation\\">)</span></span>\\n<span class=\\"line\\">z2 <span class=\\"token operator\\">=</span> random<span class=\\"token punctuation\\">.</span>randint<span class=\\"token punctuation\\">(</span><span class=\\"token number\\">0</span><span class=\\"token punctuation\\">,</span> p<span class=\\"token punctuation\\">)</span></span>\\n<span class=\\"line\\">k <span class=\\"token operator\\">=</span> random<span class=\\"token punctuation\\">.</span>randint<span class=\\"token punctuation\\">(</span><span class=\\"token number\\">0</span><span class=\\"token punctuation\\">,</span> n<span class=\\"token punctuation\\">)</span></span>\\n<span class=\\"line\\">
254P <span class=\\"token operator\\">=</span> multiplication<span class=\\"token punctuation\\">(</span>G<span class=\\"token punctuation\\">,</span> k<span class=\\"token punctuation\\">)</span></span>\\n<span class=\\"line\\">hA <span class=\\"token operator\\">=</span> multiplication<span class=\\"token punctuation\\">(</span>G<span class=\\"token punctuation\\">,</span> dA<span class=\\"token punctuation\\">)</span></span>\\n<span class=\\"line\\">r1<span class=\\"token punctuation\\">,</span> s1 <span class=\\"token operator\\">=</span> getrs<span class=\\"token punctuation\\">(</span>z1<span class=\\"token punctuation\\">,</span> k<span class=\\"token punctuation\\">)</span></span>\\n<span class=\\"line\\">r2<span class=\\"token punctuation\\">,</span> s2 <span class=\\"token operator\\">=</span> getrs<span class=\\"token punctuation\\">(</span>z2<span class=\\"token punctuation\\">,</span> k<span class=\\"token punctuation\\">)</span></span>\\n<span class=\\"line\\"></span>\\n<span class=\\"line\\"><span class=\\"token keyword\\">print</span><span class=\\"token punctuation\\">(</span><span class=\\"token string\\">\\"r1 = {}\\"</span><span class=\\"token punctuation\\">.</span><span class=\\"token builtin\\">format</span><span class=\\"token punctuation\\">(</span>r1<span class=\\"token punctuation\\">)</span><span class=\\"token punctuation\\">)</span></span>\\n<span class=\\"line\\"><span class=\\"token keyword\\">print</span><span class=\\"token punctuation\\">(</span><span class=\\"token string\\">\\"r2 = {}\\"</span><span class=\\"token punctuation\\">.</span><span class=\\"token builtin\\">format</span><span class=\\"token punctuation\\">(</span>r2<span class=\\"token punctuation\\">)</span><span class=\\"token punctuation\\">)</span></span>\\n<span class=\\"line\\"><span class=\\"token keyword\\">print</span><span class=\\"token punctuation\\">(</span><span class=\\"token string\\">\\"s1 = {}\\"</span><span class=\\"token punctuation\\">.</span><span class=\\"token builtin\\">format</span><span class=\\"token punctuation\\">(</span>s1<span class=\\"token punctuation\\">)</span><span class=\\"token punctuation\\">)</span></span>\\n<span class=\\"line\\"><span class=\\"token keyword\\">print</span><span class=\\"token punctuation\\">(</span><span class=\\"token string\\">\\"s2 = {}\\"</span><span class=\\"token punctuation\\">.</span><span class=\\"token builtin\\">format</span><span class=\\"token punctuation\\">(</span>s2<span class=\\"token punctuation\\">)</span><span class=\\"token punctuation\\">)</span></span>\\n<span class=\\"line\\"><span class=\\"token keyword\\">print</span><span class=\\"token punctuation\\">(</span><span class=\\"token string\\">\\"z1 = {}\\"</span><span class=\\"token punctuation\\">.</span><span class=\\"token builtin\\">format</span><span class=\\"token punctuation\\">(</span>z1<span class=\\"token punctuation\\">)</span><span class=\\"token punctuation\\">)</span></span>\\n<span class=\\"line\\"><span class=\\"token keyword\\">print</span><span class=\\"token punctuation\\">(</span><span class=\\"token string\\">\\"z2 = {}\\"</span><span class=\\"token punctuation\\">.</span><span class=\\"token builtin\\">format</span><span class=\\"token punctuation\\">(</span>z2<span class=\\"token punctuation\\">)</span><span class=\\"token punctuation\\">)</span></span>\\n<span class=\\"line\\"></span>\\n<span class=\\"line\\">key <span class=\\"token operator\\">=</span> sha256<span class=\\"token punctuation\\">(</span>long_to_bytes<span class=\\"token punctuation\\">(</span>dA<span class=\\"token punctuation\\">)</span><span class=\\"token punctuation\\">)</span><span class=\\"token punctuation\\">.</span>digest<span class=\\"token punctuation\\">(</span><span class=\\"token punctuation\\">)</span></span>\\n<span class=\\"line\\">cipher <span class=\\"token operator\\">=</span> AES<span class=\\"token punctuation\\">.</span>new<span class=\\"token punctuation\\">(</span>key<span class=\\"token punctuation\\">,</span> AES<span class=\\"token punctuation\\">.</span>MODE_CBC<span class=\\"token punctuation\\">)</span></span>\\n<span class=\\"line\\">iv <span class=\\"token operator\\">=</span> cipher<span class=\\"token punctuation\\">.</span>iv</span>\\n<span class=\\"line\\">encrypted_flag <span class=\\"token operator\\">=</span> cipher<span class=\\"token punctuation\\">.</span>encrypt<span class=\\"token punctuation\\">(</span>pad<span class=\\"token punctuation\\">(</span>victory_encrypted_flag<span class=\\"token punctuation\\">.</span>encode<span class=\\"token punctuation\\">(</span><span class=\\"token punctuation\\">)</span><span class=\\"token punctuation\\">,</span> AES<span class=\\"token punctuation\\">.</span>block_size<span class=\\"token punctuation\\">)</span><span class=\\"token punctuation\\">)</span></span>\\n<span class=\\"line\\">encrypted_flag_hex <span class=\\"token operator\\">=</span> binascii<span class=\\"token punctuation\\">.</span>hexlify<span class=\\"token punctuation\\">(</span>iv <span class=\\"token operator\\">+</span> encrypted_flag<span class=\\"token punctuation\\">)</span><span class=\\"token punctuation\\">.</span>decode<span class=\\"token punctuation\\">(</span><span class=\\"token string\\">'utf-8'</span><span class=\\"token punctuation\\">)</span></span>\\n<span class=\\"line\\"></span>\\n<span class=\\"line\\"><span class=\\"token keyword\\">print</span><span class=\\"token punctuation\\">(</span><span class=\\"token string\\">\\"Encrypted flag (AES in CBC mode, hex):\\"</span><span class=\\"token punctuation\\">,</span> encrypted_flag_hex<span class=\\"token punctuation\\">)</span></span>\\n<span class=\\"line\\"></span>\\n<span class=\\"line\\"><span class=\\"token comment\\"># output</span></span>\\n<span class=\\"line\\"><span class=\\"token comment\\"># r1 = 86806104739558095745988469033305523200538774705708894815836887970976487278764</span></span>\\n<span class=\\"line\\"><span class=\\"token comment\\">
254# r2 = 86806104739558095745988469033305523200538774705708894815836887970976487278764</span></span>\\n<span class=\\"line\\"><span class=\\"token comment\\"># s1 = 93400851884262731807098055393482657423555590196362184363643455285862566867372</span></span>\\n<span class=\\"line\\"><span class=\\"token comment\\"># s2 = 58741027521216057788923508334695668250013849866589902683641825341545919891746</span></span>\\n<span class=\\"line\\"><span class=\\"token comment\\"># z1 = 47591695289461307212638536234394543297527537576682980326526736956079807805586</span></span>\\n<span class=\\"line\\"><span class=\\"token comment\\"># z2 = 97911075901954715147720917205165523174582665086645698292621371632896283314804</span></span>\\n<span class=\\"line\\"><span class=\\"token comment\\"># ('Encrypted flag (AES in CBC mode, hex):', u'86cd24e2914c0c4d9b87bea34005a98bd8587d14cae71909b917679d3328304e7915e6ba4cad1096faa4a85bc52f8056d3f21ef09516be8a5160f1b338a6b936')</span></span>\\n<span class=\\"line\\"></span></code></pre>\\n<div class=\\"line-numbers\\" aria-hidden=\\"true\\" style=\\"counter-reset:line-number 0\\"><div class=\\"line-number\\"></div><div class=\\"line-number\\"></div><div class=\\"line-number\\"></div><div class=\\"line-number\\"></div><div class=\\"line-number\\"></div><div class=\\"line-number\\"></div><div class=\\"line-number\\"></div><div class=\\"line-number\\"></div><div class=\\"line-number\\"></div><div class=\\"line-number\\"></div><div class=\\"line-number\\"></div><div class=\\"line-number\\"></div><div class=\\"line-number\\"></div><div class=\\"line-number\\"></div><div class=\\"line-number\\"></div><div class=\\"line-number\\"></div><div class=\\"line-number\\"></div><div class=\\"line-number\\"></div><div class=\\"line-number\\"></div><div class=\\"line-number\\"></div><div class=\\"line-number\\"></div><div class=\\"line-number\\"></div><div class=\\"line-number\\"></div><div class=\\"line-number\\"></div><div class=\\"line-number\\"></div><div class=\\"line-number\\"></div><div class=\\"line-number\\"></div><div class=\\"line-number\\"></div><div class=\\"line-number\\"></div><div class=\\"line-number\\"></div><div class=\\"line-number\\"></div><div class=\\"line-number\\"></div><div class=\\"line-number\\"></div><div class=\\"line-number\\"></div><div class=\\"line-number\\"></div><div class=\\"line-number\\"></div><div class=\\"line-number\\"></div><div class=\\"line-number\\"></div><div class=\\"line-number\\"></div><div class=\\"line-number\\"></div><div class=\\"line-number\\"></div><div class=\\"line-number\\"></div><div class=\\"line-number\\"></div><div class=\\"line-number\\"></div><div class=\\"line-number\\"></div><div class=\\"line-number\\"></div><div class=\\"line-number\\"></div><div class=\\"line-number\\"></div><div class=\\"line-number\\"></div><div class=\\"line-number\\"></div><div class=\\"line-number\\"></div><div class=\\"line-number\\"></div><div class=\\"line-number\\"></div><div class=\\"line-number\\"></div><div class=\\"line-number\\"></div><div class=\\"line-number\\"></div><div class=\\"line-number\\"></div><div class=\\"line-number\\"></div><div class=\\"line-number\\"></div><div class=\\"line-number\\"></div><div class=\\"line-number\\"></div><div class=\\"line-number\\"></div><div class=\\"line-number\\"></div><div class=\\"line-number\\"></div><div class=\\"line-number\\"></div><div class=\\"line-number\\"></div><div class=\\"line-number\\"></div><div class=\\"line-number\\"></div><div class=\\"line-number\\"></div><div class=\\"line-number\\"></div><div class=\\"line-number\\"></div><div class=\\"line-number\\"></div><div class=\\"line-number\\"></div><div class=\\"line-number\\"></div><div class=\\"line-number\\"></div><div class=\\"line-number\\"></div><div class=\\"line-number\\"></div><div class=\\"line-number\\"></div><div class=\\"line-number\\"></div><div class=\\"line-number\\"></div><div class=\\"line-number\\"></div><div class=\\"line-number\\"></div><div class=\\"line-number\\"></div><div class=\\"line-number\\"></div><div class=\\"line-number\\"></div><div class=\\"line-number\\"></div><div class=\\"line-number\\"></div><div class=\\"line-number\\"></div><div class=\\"line-number\\"></div><div class=\\"line-number\\"></div><div class=\\"line-number\\"></div><div class=\\"line-number\\"></div><div class=\\"line-number\\"></div><div class=\\"line-number\\"></div><div class=\\"line-number\\"></div><div class=\\"line-number\\"></div><div class=\\"line-number\\"></div><div class=\\"line-number\\"></div><div class=\\"line-number\\"></div><div class=\\"line-number\\"></div><div class=\\"line-number\\"></div><div class=\\"line-number\\"></div><div class=\\"line-number\\"></div><div class=\\"line-number\\"></div><div class=\\"line-number\\"></div><div class=\\"line-number\\"></div><div class=\\"line-number\\"></div><div class=\\"line-number\\"></div><div class=\\"line-number\\"></div><div class=\\"line-number\\"></div></div><div class=\\"collapsed-lines\\"></div></div>","autoDesc":true}`);export{i as comp,u as data};

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.