密码学硬核笔记——开n次方根

图文无关

前言

最近复现了一道NCTF的压轴密码题。这道密码题我打比赛的时候是懵逼的,后来看了出题人soreatu师傅的wp才学习到了这个算法(其实原理还是有些地方不太懂。。。)


AMM

全称为Adleman-Mander-Miller Method。在1977年他们发表的论文里只涉及了开平方根的方法,开n次方根并没有很详细的介绍。《Adleman-Manders-Miller Root Extraction Method Revisited》里三位中国人补充了他们开n次方根的方法。


平方根(x2≡ δ mod p)

AMM里开平方根的算法与Tonelli–Shanks算法几乎一样,只不过后面乘积时一个是从大到小一个是从小到大,所以我简要的介绍一下开平方根的思路。

首先令 p − 1 = 2 t s p-1=2^ts p1=2ts

接着计算出模p的二次非剩余 ρ

根据欧拉准则,我们有
( δ s ) 2 t − 1 ≡ 1   m o d   p (δ^s)^ {2^{t-1}}\equiv1\ mod \ p (δs)2t11 mod p
( ρ s ) 2 t − 1 ≡ − 1   m o d   p (ρ^s)^ {2^{t-1}}\equiv-1\ mod \ p (ρs)2t11 mod p

如果 t = 1 t=1 t=1,则
( δ s + 1 2 ) 2 ≡ 1   m o d   p (δ^{\frac{s+1}{2}})^2\equiv1\ mod \ p (δ2s+1)21 mod p
所以 δ s + 1 2 δ^{\frac{s+1}{2}} δ2s+1就是开平方根的结果。

如果 t ≥ 2 t\geq2 t2,

那么 ( δ s ) 2 t − 1 (δ^s)^ {2^{t-1}} (δs)2t1开平方根以后的结果就是1或者-1。
即:
( δ s ) 2 t − 2 m o d   p ∈ { 1 , − 1 } (δ^s)^ {2^{t-2}}mod \ p\in \{1,-1\} (δs)2t2mod p{1,1}

但我们仍有办法使它变成1。令 k 1 = 0   o r   1 k_1=0\ or\ 1 k1=0 or 1,使得
( δ s ) 2 t − 2 ( ρ s ) 2 t − 1 k 1 ≡ 1   m o d   p (δ^s)^ {2^{t-2}}(ρ^s)^{2^{t-1}k_1} \equiv 1\ mod\ p (δs)2t2(ρs)2t1k11 mod p

因为 ( ρ s ) 2 t − 1 ∗ 0 = 1 (ρ^s)^{2^{t-1}*0}=1 (ρs)2t10=1 ( ρ s ) 2 t − 1 ∗ 1 = − 1 (ρ^s)^{2^{t-1}*1}=-1 (ρs)2t11=1

同样的,对上式继续开平方根,使得:
( δ s ) 2 t − 3 ( ρ s ) 2 t − 2 k 1 m o d   p ∈ { 1 , − 1 } (δ^s)^ {2^{t-3}}(ρ^s)^{2^{t-2}k_1}mod \ p\in \{1,-1\} (δs)2t3(ρs)2t2k1mod p{1,1}

k 2 = 0   o r   1 k_2=0\ or\ 1 k2=0 or 1,则
( δ s ) 2 t − 3 ( ρ s ) 2 t − 2 k 1 ( ρ s ) 2 t − 1 k 2 ≡ 1   m o d   p (δ^s)^ {2^{t-3}}(ρ^s)^{2^{t-2}k_1}(ρ^s)^{2^{t-1}k_2} \equiv 1\ mod\ p (δs)2t3(ρs)2t2k1(ρs)2t1k21 mod p

同样的,我们取 k 3 , k 4 , . . . , k t − 1 ∈ { 1 , − 1 } k_3,k_4,...,k_{t-1}\in\{1,-1\} k3,k4,...,kt1{1,1},则
( δ s ) ( ρ s ) 2 k 1 + 2 2 k 2 + . . . + 2 t − 2 k t − 1 ≡ 1   m o d   p (δ^s)(ρ^s)^{2k_1+2^2k_2+...+2^{t-2}k_{t-1}} \equiv 1\ mod\ p (δs)(ρs)2k1+22k2+...+2t2kt11 mod p

两边同时乘δ并提出平方,则:
( δ s + 1 2 ) ( ρ s ) k 1 + 2 k 2 + . . . + 2 t − 3 k t − 1 (δ^{\frac{s+1}{2}})(ρ^s)^{k_1+2k_2+...+2^{t-3}k_{t-1}} (δ2s+1)(ρs)k1+2k2+...+2t3kt1
就是开平方根的结果。

算法如下:
在这里插入图片描述


n次方根(xr≡ δ mod q)

(很不成熟,所以有些解决不了的推论当作已知来处理)

解n次方根需要考虑两种情况:

(1) g c d ( r , q − 1 ) = 1 gcd(r,q-1)=1 gcd(r,q1=1

(2) r ∣ ( q − 1 ) r|(q-1) r(q1)

如果 r 和 q-1 互素,直接求逆元就能解决(普通RSA解密)

如果 r ∣ ( q − 1 ) r|(q-1) r(q1)

q − 1 = r t s q-1=r^ts q1=rts.

因为δ是r次剩余,所以我们有 δ q − 1 r ≡ ( X r ) q − 1 r ≡ X q − 1 ≡ 1   m o d   q δ^{\frac{q-1}{r}}\equiv({X^r})^{\frac{q-1}{r}}\equiv X^{q-1}\equiv 1\ mod\ q δrq1(Xr)rq1Xq11 mod q

找一个最小的非负整数α使得 s ∣ r α − 1 s|rα-1 srα1 (后面要开r次方根)

所以 ( δ r α − 1 ) r t − 1 ≡ 1 (δ^{rα-1})^{r^{t-1}}\equiv 1 (δrα1)rt11

如果 t = 1 t=1 t=1,则开根结果为δα.

t ≥ 2 t\geq2 t2,

取r次非剩余 ρ ρ ρ ρ q − 1 r ≠ 1   m o d   q ρ^{\frac{q-1}{r}}\neq1\ mod\ q ρrq1=1 mod q

K i = ( ρ s ) i ∗ r t − 1 a n d   K = { K 0 , K 1 , . . . K r − 1 } K_i=(ρ^s)^{i*r^{t-1}} and\ K=\{K_0,K_1,...K_{r-1}\} Ki=(ρs)irt1and K={K0,K1,...Kr1}

且对于所有的 K i K_i Ki,都是模1开r次方根的结果,即 ( K i ) r ≡ 1 (K_i)^r\equiv1 (Ki)r1.

而且我们还知道 K i K_i Ki互不相同,即:
( ρ s ) i ∗ r t − 1 ≠ ( ρ s ) j ∗ r t − 1   i ≠ j   a n d   i , j ∈ { 0 , 1 , . . . , r − 1 } (ρ^s)^{i*r^{t-1}}\neq(ρ^s)^{j*r^{t-1}} \ i\neq j\ and\ i,j\in \{0,1,...,r-1\} (ρs)irt1=(ρs)jrt1 i=j and i,j{0,1,...,r1}

也就是说模1开r次方根的结果的集合都在K这个集合里。

而且 K i ∗ K r − i ≡ 1   ( r − i ≡ − i   m o d   r ) K_i*K_{r-i}\equiv1\ (r-i\equiv -i\ mod\ r) KiKri1 (rii mod r)

这两步我真的不懂,就当作已知了(可是验算出来都是正确的)


2020.5.12 更新:
(来填坑了,之前不理解的现在理解了)

ρ ρ ρ是之前取的一个 r r r次非剩余,我们可以定义一个生成元为 ρ ρ ρ的模 q q q的循环群 G G G
G = { 1 , ρ 2 , ρ 3 , . . . , ρ q − 1 } G=\{1,ρ^2,ρ^3,...,ρ^{q-1}\} G={1,ρ2,ρ3,...,ρq1}
在该循环群 G G G中,我们再定义 ρ 1 = ρ p − 1 r ρ_1=ρ^{\frac{p-1}{r}} ρ1=ρrp1,所以可以得到一个生成元为 ρ 1 ρ_1 ρ1的子群 H H H
H = { 1 , ρ q − 1 r , ρ q − 1 r ∗ 2 , ρ q − 1 r ∗ 3 , . . . , ρ q − 1 r ∗ ( r − 1 ) } H=\{1,ρ^{\frac{q-1}{r}},ρ^{\frac{q-1}{r}*2},ρ^{\frac{q-1}{r}*3},...,ρ^{\frac{q-1}{r}*(r-1)}\} H={1,ρrq1,ρrq12,ρrq13,...,ρrq1(r1)}
在这个子群里,所有的元素都是由 ρ 1 = ρ p − 1 r ρ_1=ρ^{\frac{p-1}{r}} ρ1=ρrp1生成的,所以所有元素的 r r r次方都为1,因为子群 H H H里正好有 r r r个元素,所以 H H H是模1开r次方根的结果的集合。(解释了第一个问题)

对于群来说每个元素都存在逆元,而且因为 ρ q − 1 = 1 m o d   p ρ^{q-1}=1 mod\ p ρq1=1mod p,所以对于子群里任何一个元素 ρ p − 1 r ∗ i ρ^{\frac{p-1}{r}*i} ρrp1i来说,都有:
ρ q − 1 r ∗ i ∗ ρ q − 1 r ∗ ( r − i ) = ρ q − 1 = 1 m o d   q ρ^{\frac{q-1}{r}*i}*ρ^{\frac{q-1}{r}*(r-i)}=ρ^{{q-1}}= 1 mod\ q ρrq1iρrq1(ri)=ρq1=1mod q
(解释了第二个问题)

题外话:其实并不需要群理论,只用把 ( ρ s ) i ∗ r t − 1 (ρ^s)^{i*r^{t-1}} (ρs)irt1换成 ( ρ ) q − 1 r ∗ i (ρ)^{\frac{q-1}{r}*i} (ρ)rq1i来理解就很好理解了。


有了这两个条件,我们可以开始像解平方根那样解n次方根了:

首先
( ( δ r α − 1 ) r t − 2 ) r ≡ 1 ((δ^{rα-1})^{r^{t-2}})^r\equiv 1 ((δrα1)rt2)r1

开r次方后余数为集合 K K K中的一个数,设为 K r − j K_{r-j} Krj,即:
( δ r α − 1 ) r t − 2 ≡ K r − j (δ^{rα-1})^{r^{t-2}}\equiv K_{r-j} (δrα1)rt2Krj
求逆元,得:
( δ r α − 1 ) r t − 2 K j ≡ 1 (δ^{rα-1})^{r^{t-2}}K_{j}\equiv 1 (δrα1)rt2Kj1
即:
( δ r α − 1 ) r t − 2 ( ρ s ) j ∗ r t − 1 ≡ 1 (δ^{rα-1})^{r^{t-2}}(ρ^s)^{j*r^{t-1}}\equiv 1 (δrα1)rt2(ρs)jrt11

同样的,继续开方,最终得到:
( δ r α − 1 ) ( ρ s ) j 1 ∗ r 1 + j 2 ∗ r 2 + . . . + j t − 1 ∗ r t − 1 ≡ 1 (δ^{rα-1})(ρ^s)^{j_1*r^{1}+j_2*r^2+...+j_{t-1}*r^{t-1} } \equiv 1 (δrα1)(ρs)j1r1+j2r2+...+jt1rt11
最后乘δ提取r次方:

( δ α ) r ( ( ρ s ) j 1 + j 2 ∗ r 1 + . . . + j t − 1 ∗ r t − 2 ) r ≡ δ (δ^{α})^r((ρ^s)^{j_1+j_2*r^1+...+j_{t-1}*r^{t-2} } )^r\equiv δ (δα)r((ρs)j1+j2r1+...+jt1rt2)rδ

得到最终结果:

δ α ( ρ s ) j 1 + j 2 ∗ r 1 + . . . + j t − 1 ∗ r t − 2 δ^{α}(ρ^s)^{j_1+j_2*r^1+...+j_{t-1}*r^{t-2} } δα(ρs)j1+j2r1+...+jt1rt2

算法如下:
在这里插入图片描述
其实开n次方根的方法还有很多,只不过我目前只学了这一种。。。


真题实战(2019NCTF——babyRSA)

大佬wp在这里

CTF三大谎言:baby、easy、warmup

题目只给了e,p,q,c
在这里插入图片描述
然而e|p-1,e|q-1,根本无从下手。

其实我们可以先用中国剩余定理展开

m e ≡ c   m o d   p m^e \equiv c\ mod\ p mec mod p m e ≡ c   m o d   q m^e \equiv c\ mod\ q mec mod q

由于e比较小,所以可以用上述开n次方的方法,在模p和模q中分别找到一个0x1337次方的根 m 0 m_0 m0

然而实际上0x1337开根会产生1337个根,那么如何找到剩余的0x1336个根呢?

根据公式:
( x p − 1 e ) e ≡ x q − 1 ≡ 1 (x^{\frac{p-1}{e}})^e\equiv x^{q-1}\equiv 1 (xep1)exq11

所以可以通过用 m 0 ∗ x p − 1 e m_0*x^{\frac{p-1}{e}} m0xep1的方式找到剩余的0x1336个根。

最后模p的0x1337个根和模q的0x1337个根,一共有4919*4919=24196561种组合,再利用中国剩余定理,就能算出最终的flag。


提示:

list=set()
while(len(list)<r):
    p=pow(random.randint(1,q-1),(q-1)/r,q)
list.add(p)

这几行代码可以保证生成的子根不会有重复

最终结果:
在这里插入图片描述

完整代码在这里

参考文章:
首先是大佬的博客
然后是论文

后记

第一次学到了这种开方的姿势,眼光宽广了很多,以后也会继续努力滴!

始有计划写这本书的时候, Altera 还叫 Altera, 还没有加入 Intel 的大家庭, Xilinx 的 ZYNQ 也才刚刚始有人探索, Altera 大学计划第一次将亚洲创新大赛由传统的 SOPC 大赛 换成了 SOC 大赛,软核变硬核,性能翻几番。 那个时候,能出一本认认真真讲 FPGA 设计的 书, 会得到非常高的评价。 而我,则由于工作变动, 中间拖沓了半年,当半年后再来准备动 笔时,才恍然领悟到, Altera 即将成为 Intel 的可编程事业部, 基于嵌入式硬核的 SOC FPGA 芯片始获得了大量的关注,已经有不少大的小的公司在着手这方面的教学内容与板卡设 计。原本计划编写的内容在新技术新产品面前,好像显得非常的不值一提。 总感觉当大家把 目光都投在了前沿的可编程 SOC 上的时候,我再编写这样一本单纯讲解 FPGA 数字逻辑设计 的书会显得与时代脱节。 于是,编书的动力没有了那么强烈, 这事,又这么放了下来。 在这期间,我也向着 SOC FPGA 做了积极努力的探索, 学习了 Cyclone V SOC 的发流 程, 从裸机到基于 Linux 嵌入式系统,实现了 FPGA 和 ARM Cortex-A9 CPU 之间的双向控制和 数据传输。 在做完这之后,就感觉遇到了瓶颈, 瓶颈主要来自于两个方面,第一是对 Linux 软件发不熟悉,而 SOC FPGA 的处理器端应用又恰好需要对 Linux 的底层和应用都需要一 定的了解。 另一方面是对 FPGA 设计经验的欠缺,使用到 SOC FPGA 架构的场合,往往都是 一些较为复杂的系统,在系统中,本身就对 FPGA 的设计内容要求较高, 如视频流的处理, 运算加速逻辑的设计, 通信接口的实现等。 所以, 欠缺了任何一方面的知识, 在使用 SOC FPGA 架构的时候都会困难重重。如果 FPGA 方面没有踏实的功底,那么使用 SOC FPGA 也仅 仅只能是当做通用的嵌入式处理器使用, 无法将其结构的优势发挥出来 。 如果没有 ARM 嵌 入式处理器方面的踏实功底, SOC FPGA 也仅仅只能是个 FPGA。 所以, 编写这样一本单纯讲解 FPGA 数字逻辑的书还是非常有意义的,因为这才是真正合理应用 SOC FPGA 优势架构的 基础。
相关推荐
<p> <strong><span style="font-size:16px;color:#337FE5;"><b><a target="_blank" href="https://edu.csdn.net/bundled/detail/308"></a><a target="_blank" href="https://edu.csdn.net/bundled/detail/308"><span> </span></a></b></span></strong> </p> <p class="ql-long-39788408" style="font-size:11pt;color:#494949;"> <strong><b><strong><a class="ql-link ql-size-12 ql-author-39788408" href="https://edu.csdn.net/bundled/detail/298" target="_blank">[本课程属于AI完整学习路线套餐,该套餐已“硬核”上线,点击立即学习!]</a></strong> </b></strong> </p> <p class="ql-long-39788408" style="font-size:11pt;color:#494949;"> <br /> </p> <p> <strong><span style="font-size:16px;color:#337FE5;"><img src="https://img-bss.csdnimg.cn/202011090216454206.png" alt="" /><br /> </span></strong> </p> <p> <strong><span style="font-size:16px;color:#337FE5;"><br /> </span></strong> </p> <p> <strong><span style="font-size:16px;color:#337FE5;">【为什么要学习深度学习和计算机视觉?】</span></strong> </p> <p> <span style="font-family:"background-color:#FFFFFF;">AI人工智能现在已经成为人类发展中最火热的领域。而计算机视觉(CV)是AI中最热门,也是落地最多的一个应用方向<span style="font-family:"background-color:#FFFFFF;">(人脸识别,自动驾驶,智能安防,车牌识别,证件识别)</span>。</span><span style="font-family:"background-color:#FFFFFF;">所以基于人工智能的计算视觉行业必然会诞生大量的工作和创业的机会。如何能快速的进入CV领域,同时兼备理论基础和实战能力,就成了大多数学习者关心的事情,而这门课就是因为这个初衷而设计的。<br /> </span> </p> <p style="font-family:"color:#222226;font-size:14px;background-color:#FFFFFF;"> <br /> </p> <p style="font-family:"color:#222226;font-size:14px;background-color:#FFFFFF;"> <span style="font-size:16px;color:#337FE5;"><strong>【讲师介绍】</strong></span> </p> <p style="font-family:"color:#222226;font-size:14px;background-color:#FFFFFF;"> <span style="font-size:16px;color:#337FE5;"><strong>CH<strong><span style="font-family:"color:#222226;font-size:16px;background-color:#FFFFFF;font-weight:700;">ARLIE 老师</span></strong></strong></span> </p> 1、人工智能算法科学家<br /> 2、深圳市海外高层次人才认定(孔雀人才)<br /> 3、美国圣地亚哥国家超算中心博士后<br /> 4、加利福尼亚大学圣地亚哥全奖博士<br /> 5、参与美国自然科学基金(NSF)及加州能源局 (CEC)资助的392MW IVANPAH等智慧电网项目<br /> 6、21篇国际期刊文章(sci收录17篇),总引用接近1000<br /> 7、第一作者发明专利11份<br /> <p> <br /> </p> <p class="ql-long-24357476" style="font-family:"color:#222226;font-size:14px;background-color:#FFFFFF;"> <span style="font-family:"color:#337FE5;"><span><span style="font-size:16px;"><strong>【推荐你学习这门课的理由:</strong></span><span style="color:#E53333;font-size:16px;"><strong>知识体系完整+丰富学习资料】</strong></span></span></span> </p> <p class="ql-long-24357476" style="font-family:"color:#222226;font-size:14px;background-color:#FFFFFF;"> <span class="ql-author-24357476" style="font-family:""></span> </p> <p class="MsoNormal" style="font-family:"color:#222226;font-size:14px;background-color:#FFFFFF;"> 1、本课程总计9大章节,是一门系统入门计算机视觉的课程,未来将持续更新。 </p> <p class="MsoNormal" style="font-family:"color:#222226;font-size:14px;background-color:#FFFFFF;"> <span>2</span>、<span>课程从计算机视觉理论知识出发,理论结合实战,手把手的实战代码实现(霍夫变换与模板匹配,</span><span>AlexNet OCR</span><span>应用</span><span>,VGG</span><span>迁移学习,多标签分类算法工程)</span> </p> <p class="MsoNormal" style="font-family:"color:#222226;font-size:14px;background-color:#FFFFFF;"> <span>3</span>、<span>带你了解最前沿技术,</span><span>各类型算法的优点和缺点,掌握数据增强,</span><span>Batchnormalization, Dropout</span><span>,迁移学习等优化技巧,搭建实用的深度学习应用模型</span> </p> <p class="MsoNormal" style="font-family:"color:#222226;font-size:14px;background-color:#FFFFFF;"> <span>4</span>、学习完后,你将具有深度学习与计算视觉的项目能力,比如大学生学完可以具备独立完成机器视觉类毕业设计的能力,在求职过程中可以体系化的讲解机器视觉核心知识点,初步达到人工智能领域机器视觉工程师的水平 </p> <span style="color:#222226;font-family:PingFangSC-Regular, "font-size:14px;background-color:#FFFFFF;"></span> <p style="font-family:"color:#222226;font-size:14px;background-color:#FFFFFF;"> <br /> </p> <p class="ql-long-24357476" style="font-family:"color:#222226;font-size:14px;background-color:#FFFFFF;"> <strong><span style="color:#337FE5;font-size:16px;">【学完后我将达到什么水平?】</span></strong> </p> <p class="ql-long-24357476"> <span>1、<span style="font-family:"">零基础入门计算视觉,学习掌握并应用从经典图像处理到深度学习分类任务的要点知识</span></span> </p> <p class="ql-long-24357476"> <span>2、<span style="font-family:"">掌握数据增强,迁移学习等优化技巧,搭建实用的深度学习应用模型</span></span> </p> <p class="ql-long-24357476"> <span>3、<span style="font-family:"">学习完课程,可以独立应用多个经典算法和深度学习算法</span></span> </p> <p class="ql-long-24357476"> <span>4、<span style="font-family:"">以</span><span style="font-family:"">大学毕业设计,面试找工作为目标,</span><span style="font-family:"">手把手带大家编程,即使没有太多计算视觉的背景知识也可以循序渐进完成课程,获得实战项目的经验</span></span> </p> <p class="ql-long-24357476"> <br /> </p> <p class="ql-long-24357476"> <span style="color:#337FE5;"><b><span style="background-color:#FFFFFF;color:#337FE5;"><span style="font-size:16px;color:#337FE5;">【面向人群】</span></span></b></span> </p> <p class="ql-long-24357476"> <span>1、对AI感兴趣,想要系统学习计算机视觉的学员</span> </p> <p class="ql-long-24357476"> <span>2、<span style="font-family:"color:#222226;font-size:14px;background-color:#FFFFFF;">需要毕业设计的大学生</span></span> </p> <p class="ql-long-24357476"> <span>3、<span style="font-family:"color:#222226;font-size:14px;background-color:#FFFFFF;">做图像分析或相关数据分析的研究生</span></span> </p> <p class="ql-long-24357476"> <span>4、<span style="font-family:"color:#222226;font-size:14px;background-color:#FFFFFF;">准备面试计算视觉和深度学习岗位的应聘者</span></span> </p> <p class="ql-long-24357476"> <span>5、<span style="font-family:"color:#222226;font-size:14px;background-color:#FFFFFF;">希望在项目中引入计算视觉</span><span style="font-family:"color:#222226;font-size:14px;background-color:#FFFFFF;">/</span><span style="font-family:"color:#222226;font-size:14px;background-color:#FFFFFF;">深度学习技术的发人员</span></span> </p> <p class="ql-long-24357476"> <br /> </p> <p class="ql-long-24357476"> <b><span style="font-family:"font-size:16px;background-color:#FFFFFF;color:#337FE5;"><span style="font-size:16px;color:#337FE5;">【课程知识体系图</span><span style="font-size:16px;color:#337FE5;">】</span></span></b> </p> <p class="ql-long-24357476"> <span><b><img src="https://img-bss.csdnimg.cn/202007140746422581.png" alt="" /></b></span> </p> <p class="ql-long-24357476"> <span><b><br /> </b></span> </p> <p class="ql-long-24357476"> <span style="font-size:16px;color:#337FE5;"><b>【实战项目】</b></span> </p> <p class="ql-long-24357476"> <b><img src="https://img-bss.csdnimg.cn/202007150352244062.png" alt="" /><img src="https://img-bss.csdnimg.cn/202007150517376530.png" alt="" /></b> </p> <p class="ql-long-24357476"> <br /> </p>
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页