20210821-祥云杯-CryptoSecPartWriteUp
Guess
很多是非预期
1 | from Crypto.Util.number import ( |
key.sage
1 | from Crypto.Util.number import getRandomNBitInteger |
hint
1 | [269865700520122549144762599745168447135899292447636617756605602545212728167797447445787398106779613741477733230173614340453529478006749280203791219240495545320784253247776438152444000193996715061172344898960798274898870276035746116096626771403981985377907323596813517124099024451197742946526103390328807831246256 351825797459362105605308649037214670594688383340169438930434420259269928275998050547973935801446674821508093953928259345972518243250576886209287947085399150853100589302713875591726622523078239591200598436879752732176246887916248939358959982281252327937943016323841545720179709080112518678442049362350981509034718 263649494857153084116592322640026892708704523757635879704627428861744239824087544706911427923497181418081141799670872495368713195091290104184732226016053955456080069924363050718931449355663612295983210728462521014504883613920516962136372253488247300322354664463901602570541318156197056622985692829393446426824638 453400473599186415430546643705275038528777172686002821040599810743439930425207458033941717472852507386860793929840595207225134962986513734506356764693655438618941180687198445634254053696966577360482969943538482461972582638716434085445938134971492342779462032414137699485112547903822163588315191244265946324218228 221827206659930588955100802225668305862545149941640820857015107405314701820405616518433413575662470655465592803570411353938784340140188287733921352831214120360424367473260917811334848500233701311695438235451684226463170984345521338680563403806364662014170986174411732503648583380588103055128943038500134530643916 262203710827134666754393441371926810666786719624203864995763104952378827035382567436334257544099220873788181813028566666315029478997429146874858602787070177245600709015255267085423481719645325028750498589844959751577586557620102816409584289798347398835894955523264261758402589145048117452982723970755642721185948 449549947180605498384084224904383747663117854129634140960197279513891658001908553899154409208608867208695858453347485738326065752599578853421177093646899183717259826566392731977061092066943083219101516409628761436417329565252863717622046112713719560452994438641997826306366514591051557604666293190256180831457338 427882301208025139610114439882502441914598510240693844044902667415035988021658089285061603431657599603331045335448467272333422417626837392018638001129889364932929941669822436427404546395551452209585894226820734770968204014611476942151983657836762789688274393777314450201198374683092768582274185754609711412304708 206110709892941001547312247977630809641839341262123534620411119329846379553052343003462513763026898611550676850103678046155244343919504874675861711356256906122323272209951451243624891037181757295933079679771758786258823164385868611152404813858000740881052355543339622168479080269444970004478675521293416826708518 376172049695479754397279304655900327678015926783104795566699104261135819399512659621342636669298191140461316867639169744791504345311783942430174703887150776382877123936598986072421903671214609751973940119880560010023509512099294872489902196710299820192154670761462699775769831592820505043876853866377139051584700 354989144495191036439184720296945551786270296981167948019894874956969763278354891643393993638515549874937620037229446883785428867336828993393766325205264827014803398207234817979275257572341689686447010646631351076260136309756747006523828716693825921688154934832911308097472833298941167446737019496978821483004142 247657418221571455680808477138957290356931207729656804527032245580960429841816418251851497488948400261671314674513219816337747752077679968835580384381624054897709324089163678294189901105831869992119099572932762170016838924353956530516871378196167792087986296536436978303095420850688527841398649861755287315252914 267323214115576739778291260842843721623810532694699738318490243647729313782577235628052607303271826513284836885625483822163201361517891012567791817503099871180988597553316105403148790626072424557099203065132199859082058328832860860922184801132168393385984454558438841623269013769064186695669122926428112192958058 380213264649117070874301733758703992957052936843733186492527715942930662173593880870634301175054838023249481317633718679161000064110300930539209764959721575720322049712443403460593162873330727228662863503060615472077497723046998024646756953852274720572607225890476747502455930116669002121964715413052946067842934 299711354673898453867309253202762657296007144693008209662952150647212243688991887703988087318065032988637761345182760379040409182402949915825642302147237357969028446441002244872828954397547768452078685431997252342287035745022966033862847782615826742413561561692110959439029229515697207807688051683325604252733440 365249518697738703288761077464962564211784565489625880111214981001160495801883728584481549266513708874054054791287952319568149514368408201453178732248585813844809011050888061672886805741661833747721896023077257558372204817368398292194245959048942083958342665661675547822068884852334483336260109462386159088016564 234545469963164507706928881332558698102265602045874001492102111685872459757456367592469441102854212705510654825387325257074993658404998100908565444353109631283461873240676108320629040289352814544349197599373184745156814420454658805665114789039742029196643533194690810954176812644128288344876173839305663050924382 403528775485460422299177022688931715589694738265629775672770507924611837945109216220772816017023088114143940075372156298028685445638442326378577113339902407365411497947122572348948969051001772973442806880840187883877046852394584867407634101961472289147829591393511113697557028915654508582063486155060434533238994 257705800389350838171655930137607990615821847049495140599547431163884933722120908882943391518805467092890646138176976972348577478608553204931604995997522105267077845561071320509003102531223852713962266895091989335267822143524572493690679315729733459055455391559009207758735308530559987072982151466476819761020810 294949037304356424643319498923044835942305224417122064436278068994313693511819494043317635677951522630682156447848037907726136749360723795280554225964785571884704746898469546462623102938030066073650709553136937483623297572165996272004599095405260872411154410637266055198871382378758905668626258164495032515036494] |
在一次任务中我遇到了一个challenge,我的队友给我发了一个他截获的hint,你利用这个hint能帮我完成这个challenge吗?
先介绍一下题目中所用到的Paillier同态加密,之前做到一个GM同态的,参考InCTF-Gold_digger
密钥生成
- 随机选择$p,q$且$gcd(n,\ \varphi)=1$;保证$pq$等长
- $\lambda =lcm(p-1,\ q-1)$
- 随机选择$g(g\in \mathbb{Z}^*_{n^2})$;保证$n|ord(g)$(不懂)
- 定义$L(x)=\frac{x-1}{n}$
- $\mu =L(g^\lambda\ mod\ n^2)^{-1}\ mod\ n$
私钥为$(n,\ g)$,公钥为$(\lambda,\ \mu)$
- 通常还有个简化版
$g=n+1$
$\lambda=\varphi$
$\mu=\varphi ^{-1}\mod\ n$
加密
- $ 0\le m< n$
- 随机选择$r(0<r<n,\ r\in \mathbb{Z}^*_{n^2})$,且$gcd(r,\ n)=1$
- $c=g^m\cdot r^n\ mod\ n^2$
解密
- $m=L(c^\lambda\ mod\ n^2)\cdot \mu\ mod\ n$
稍微验证简化版的Paillier,$\varphi(n^2)=n\varphi(n)=pq(p-1)(q-1)$
由欧拉定理可知$r^{n\varphi(n)}\equiv 1\ (mod\ n^2)$,带进解密函数,注意二项式展开,$L(c^\lambda\ mod\ n^2)=L(g^{m\lambda}\ mod\ n^2)=L((n+1)^{m\lambda}\ mod\ n^2)=L((1+nm\lambda)\ mod\ n^2)$$=m\lambda$
又因为
$\mu=L(g^\lambda\ mod\ n^2)^{-1}=L((n+1)^\lambda\ mod\ n^2)^{-1}=L((1+n\lambda)\ mod\ n^2)^{-1}=\lambda^{-1}$
则$m=m\lambda\cdot \lambda^{-1}=m$
这就要引入两条重要性质,RSA和ElGamal是乘法同态,Paillier是加法同态
加法同态
$$
E(x+y)=E(x)\times E(y)\notag
$$
取个解密
$$
x+y=D(E(x)\times E(y))\notag
$$乘法同态
$$
E(x\times y)=E(x)\times E(y)\notag
$$
比赛的时候推到由二三四步求出一个key,回顾一下
只知道c1c2其中一个,直接用同态性是出不来的(可以试试看),必须配合攻击者精心构造的发送数据
根据已知,假设我们知道的是c1,m0m1完全由我们构造,最小是9
$$
c_1=E(m_0m_1key_1)\notag
$$
在二四步分别提供我们一个解密的机会,但是第四步不准用来解密第三步得到的其中一个c,那很好,用同态性绕过:不准我们直接给c解密,那么我们将c稍微变化一下
比如在第二步的时候我们send一个2过去,这样就得到了D(2),第三步m0m1随便取,然后在第四步,将c*2给send过去,由于
$$
c_1\times 2=E(m_0m_1key_1)\times E(D(2))=E(m_0m_1key_1+ D(2))\notag
$$
将c*2给send过去是作为密文用来解密的,那么得到
$$
D(E(m_0m_1key_1)\times E(D(2)))=m_0m_1key_1+D(2)\notag
$$
我们知道D(2),m0m1也是由我们构造的,所以在一个循环里面解出一个key是没有问题的
比赛中的思路到此戛然而止,因为对于key那方面,是一个矩阵的乘法,我毫无头绪
在复现中,我看到了关键的东西
1 | R = 2 * random.randint(0, 39) |
这是控制key的,显然R是偶数,所以如果知道全部的key,然后将第四步我们求出来的查表如果是偶数那么说明随机数I是0,如果是奇数,那么I是1
于是这就有了我看到的很多战队WP里写的,利用key不变的机制去重复断开连接断开连接,不断炼丹直到求出所有的key
但按照出题人的意图,这个应该是非预期解了,设计加密方案的一方完全可以将key每次都随机化或者R就取random.randint(0, 79)
;所以还是想在赛后看看有没有通过hint和key.sage来求key的
先来看主代码中key_gen的part2部分
1 | _key = open("key", "r").read() |
从代码中我们获取已知条件,key是个长度为80,且元素不重复的列表,前4个元素分别是119 241 718 647
key的生成与之类似,顺便得知key元素的范围
1 | key = random_matrix(ZZ, 20, 4, x = 100, y =1000) |
已知的是
1 | hint = Matrix(key * vector([getRandomNBitInteger(1024) for _ in range(4)]) for _ in range(12)) |
$$
\begin{bmatrix}
119 & 241 & 718 & 647\\
\vdots & \vdots & \vdots & \vdots\\
\cdots & \cdots & \cdots & \cdots
\end{bmatrix}_{20\times 4}\times
\begin{bmatrix}
v1\\
v2\\
v3\\
v4
\end{bmatrix}=hint\notag
$$
重复做了12次,有12个hint,每次vector里面的数据都是随机的
韩佬说可能要用十二组hint构造格,然后格归约求解,不会
myRSA
很多师傅是使用二分法做的
1 | # myRSA |
我的第一次密码学导论作业, 参数的生成大家觉得怎样呢?
加密的过程其实简单,我们知道cx+cy+z
关于z,这是与key有关的,根据之前的经验没有必要知道key怎么来的,只需要知道key是啥;至于题目提示的参数,也就是知道这些数字之间的位数关系,z是1040位的,z>n,n是1024位的
比赛中推导出要解一个一元三次方程那里,也就是将x和y带入,设t=cx+cy+z,得
$$
t=c((p+q)^3-(p+q)^2+(p+q)+4n)+z\notag
$$
c我们是完全可以算出来的,所以要解密,大致的方向就是绕过z,求出p+q,联系方程组求出p,成功分解n(所以send一个b’’得到z并没有什么用)
先两边模c
$$
c(x+y)+z\equiv 0+z\equiv z\ (mod\ c)\notag
$$
由于z比n要大,所以肯定也比c要大,模c之后得到是一个z的近似,就设为$z_0,\ z=z_0+kc$
联想刚才我们那个比特差,这完全是可以爆破的
nc链接这里我们直接输入0,从字节转数字后是48
1 | n = 102216849365436215382697924706110458811930514492676972297707749802743855550173221018307625399833159477899481939208157339087054049976609580335655988542843751320232525212725188253172284097958271570601093708102334730018773991294621754198973615453247445854418322094753657026256442996256624353675259431618058069873 |
以为sage可以帮我们直接算出来了,但数字大了,也变慢了,而且不确定解出来的是不是还带有sqrt
所以要写另外的解方程脚本,这里我们暂时按下不表,先说解密
假设我们已经知道了pq,那么对于$t=flag(x+y)+z$,两边整除一个x+y,类似海洋大学的easyrsa,由于x+y远大于z,z成了小数部分了,取个整得到就是flag加密后的结果
好了,最关键的一步,解方程,现有的函数不行,因为数据太大、格式等问题
$$
x+y=(p+q)^3-(p+q)^2+(p+q)+4n=(t-z)\div c\notag
$$
右边我们已经得到了,设a=p+q,则$f(a)=a^3-a^2+a+4n-(t-z)\div c$
求一次导可知$f^{‘}(a)=3a^2-2a+1$,$\Delta=4-12<0$,$f^{‘}(a)>0$
所以f(a)是单调递增的,与x轴只有一个交点,而且它的根p+q的范围在$(2^{511}, 2^{513})$
说到解这个方程,枚举当然简单暴力,但无奈数字实在太大,时间复杂度为O(n),那么很快就可以想到降低复杂度的二分法,用二分法逼近本身就是解方程的算法之一;这样时间复杂度就是O(logn),也就是500多
加上之前的枚举z写了以下脚本,因为对近似不是很懂,所以先还是框定在熟悉的整数范围
1 | #!/usr/bin/env python |
结果还是跑了很久
研究一下其他师傅的做法
他们的思路是直接用得到的z0求出一个x+y的近似值,将其带入f(a),得到是正数,说明这个数在真正的x+y的右边,根据单调性
这个近似的x+y的位数是1538,所以只要在$[2^{511}, 2^{1538}]$之间二分就好了,最后会二分到两个相邻的整数之间,因为方程的右边是我们得到的近似值,所以妄想得到一个整数解是不太可能的
1 | from sympy import poly, symbols, solve |
Random_RSA
之前也有类似的题目,通过相同的种子生成相同的随机数序列。这道题考点dp泄漏,对dp进行了异或操作;异或回来就好了
这里需要注意,出题人应该是用python2跑的,因为python3跑出来的随机数和题目中不一样
1 | from Crypto.Util.number import * |
1 | #!/usr/bin/env python2 |