长安“战疫”网络安全卫士守护赛_Crypto

math

涉及的知识点:RSA加密未知模数已知p对q的逆元以及q对p的逆元求RSA的模数N

题目描述

题目没有描述,只有已知量c,e,d,pinvq,qinvp

公式推导

已知pinvq,qinvpn,这样我们才能求得 m = c d ( m o d n ) m=c^d(mod~n) m=cd(mod n)

所谓pinvq也就是 p ∗ p i n v q ≡ 1 ( m o d q ) p*pinvq\equiv 1(mod~q) p∗pinvq≡1(mod q)

qinvp就是 q ∗ q i n v p ≡ 1 ( m o d p ) q*qinvp\equiv 1(mod~p) q∗qinvp≡1(mod p)

为了之后方便书写,我们设 x = p i n v q x = pinvq x=pinvq, y = q i n v p y=qinvp y=qinvp

那么同余式转换为

p ∗ x = 1 + k 1 ∗ q p*x=1+k_1*q p∗x=1+k1​∗q, q ∗ y = 1 + k 2 ∗ p q*y=1+k_2*p q∗y=1+k2​∗p

等式两边同时加上 k 2 ∗ p k_2*p k2​∗p​或者 k 1 ∗ q k_1*q k1​∗q

得到

p ∗ x + k 2 ∗ p = 1 + k 1 ∗ q + k 2 ∗ p p*x+k_2*p=1+k_1*q+k_2*p p∗x+k2​∗p=1+k1​∗q+k2​∗p

q ∗ y + k 1 ∗ q = 1 + k 1 ∗ q + k 2 ∗ p q*y+k_1*q=1+k_1*q+k_2*p q∗y+k1​∗q=1+k1​∗q+k2​∗p

那么等式右边都是一样的,连在一起得到

p ∗ ( x + k 2 ) = q ∗ ( y + k 1 ) p*(x+k_2)=q*(y+k_1) p∗(x+k2​)=q∗(y+k1​)

那么由于 p , q p,q p,q都是素数,也就是说彼此是互素的

一定有 p p p是 y + k 1 y+k_1 y+k1​的因数, q q q是 x + k 2 x+k_2 x+k2​的因数

看一看 y + k 1 y+k_1 y+k1​和 x + k 2 x+k_2 x+k2​的范围

由于 p ∗ x ≡ 1 ( m o d q ) p*x\equiv 1(mod~q) p∗x≡1(mod q)​​,也就是在模 q q q​的世界里 x x x​一定小于 q q q​

所以 0 < x < q 0<x<q 0<x<q

由于 q ∗ y = 1 + k 2 ∗ p q*y= 1+k_2*p q∗y=1+k2​∗p​

同理 y y y是小于 p p p的,但是要让等式成立的话,那么要使 0 < k 2 < q 0<k_2<q 0<k2​<q

综上 0 < x + k 2 < 2 ∗ q 0<x+k_2<2*q 0<x+k2​<2∗q

同理 0 < y + k 1 < 2 ∗ p 0<y+k_1<2*p 0<y+k1​<2∗p

这个范围有什么意义呢

联系之前的推出的结果 p p p整除 y + k 1 y+k_1 y+k1​的, q q q是整除 x + k 2 x+k_2 x+k2​的

所以 p , q p,q p,q只有一种可能 p = y + k 1 , q = x + k 2 p=y+k_1,q=x+k_2 p=y+k1​,q=x+k2​

到了这里我们已经用其他的量来表示 p , q p,q p,q了,现在需要知道的是 k 1 , k 2 k_1,k_2 k1​,k2​的值

在 ϕ ( n ) \phi(n) ϕ(n)​的表达式中看看(为什么要用 ϕ ( n ) \phi(n) ϕ(n)呢,因为由于 e , d e,d e,d已知,我们实际上可以爆破出 ϕ ( n ) \phi(n) ϕ(n)的大小)

ϕ ( n ) = ( p − 1 ) ∗ ( q − 1 ) \phi(n)=(p-1)*(q-1) ϕ(n)=(p−1)∗(q−1)

= ( ( y − 1 ) + k 1 ) ∗ ( ( x − 1 ) + k 2 ) =((y-1)+k_1)*((x-1)+k_2) =((y−1)+k1​)∗((x−1)+k2​)

= ( y − 1 ) ∗ ( x − 1 ) + k 2 ∗ ( y − 1 ) + k 1 ∗ ( x − 1 ) + k 1 ∗ k 2 =(y-1)*(x-1)+k_2*(y-1)+k_1*(x-1)+k_1*k_2 =(y−1)∗(x−1)+k2​∗(y−1)+k1​∗(x−1)+k1​∗k2​

中心思想是要求 k 1 k_1 k1​​或者 k 2 k_2 k2​​的值,也就是说先求出来一个,另外一个自然也就知道了,所以我们需要用 k 2 k_2 k2​​来表示 k 1 k_1 k1​​

由已知得

p ∗ x = 1 + k 1 ∗ q p*x=1+k_1*q p∗x=1+k1​∗q

将 p , q p,q p,q代换成 x , y , k 1 , k 2 x,y,k_1,k_2 x,y,k1​,k2​

得到 ( y + k 1 ) ∗ x = 1 + k 1 ∗ ( x + k 2 ) (y+k_1)*x=1+k_1*(x+k_2) (y+k1​)∗x=1+k1​∗(x+k2​)

移项得到 x ∗ y = 1 + k 1 ∗ k 2 x*y=1+k_1*k_2 x∗y=1+k1​∗k2​

那么通过这个等式我们就可以用 k 2 k_2 k2​​来表示 k 1 k_1 k1​了

也就是 k 2 = x ∗ y − 1 k 1 k_2=\frac{x*y-1}{k_1} k2​=k1​x∗y−1​

接着刚才的 ϕ ( n ) \phi(n) ϕ(n)展开式

ϕ ( n ) = ( y − 1 ) ∗ ( x − 1 ) + ( y − 1 ) ∗ ( x ∗ y − 1 ) k 1 + k 1 ∗ ( x − 1 ) + x ∗ y − 1 \phi(n)=(y-1)*(x-1)+\frac{(y-1)*(x*y-1)}{k_1}+k_1*(x-1)+x*y-1 ϕ(n)=(y−1)∗(x−1)+k1​(y−1)∗(x∗y−1)​+k1​∗(x−1)+x∗y−1

移项

0 = k 1 ∗ ( x − 1 ) + ( y − 1 ) ∗ ( x − 1 ) + x ∗ y − 1 − ϕ ( n ) + ( y − 1 ) ∗ ( x ∗ y − 1 ) k 1 0=k_1*(x-1)+(y-1)*(x-1)+x*y-1-\phi(n)+\frac{(y-1)*(x*y-1)}{k_1} 0=k1​∗(x−1)+(y−1)∗(x−1)+x∗y−1−ϕ(n)+k1​(y−1)∗(x∗y−1)​

等式两边同时乘以 k 1 k_1 k1​

0 = ( x − 1 ) k 1 2 + k 1 ( ( y − 1 ) ∗ ( x − 1 ) + x ∗ y − 1 − ϕ ( n ) ) + ( y − 1 ) ∗ ( x ∗ y − 1 ) 0=(x-1)k_1^2+k_1((y-1)*(x-1)+x*y-1-\phi(n))+(y-1)*(x*y-1) 0=(x−1)k12​+k1​((y−1)∗(x−1)+x∗y−1−ϕ(n))+(y−1)∗(x∗y−1)

未知量是 k 1 k_1 k1​​,那么这就是一个关于 k 1 k_1 k1​​的一元二次方程,系数均已知( ϕ ( n ) \phi(n) ϕ(n)​​可以爆破出来)

关于 ϕ ( n ) \phi(n) ϕ(n)的爆破可以这样进行

for k in range(3,e):if temp % k == 0:phi_n = temp // k

使用一元二次方程的求根公式可以得到 k 1 k_1 k1​​

那么 k 2 = x ∗ y − 1 k 1 k_2=\frac{x*y-1}{k_1} k2​=k1​x∗y−1​

所以求得 p = y + k 1 p=y+k_1 p=y+k1​, q = x + k 2 q=x+k_2 q=x+k2​

那么 n = p ∗ q n = p*q n=p∗q

到这里推导就结束了,然后就是正常的RSA解密了

代码实现

from Crypto.Util.number import *
import gmpy2
from tqdm import tqdmpinvq = 0x63367a2b947c21d5051144d2d40572e366e19e3539a3074a433a92161465543157854669134c03642a12d304d2d9036e6458fe4c850c772c19c4eb3f567902b3
qinvp = 0x79388eb6c541fffefc9cfb083f3662655651502d81ccc00ecde17a75f316bc97a8d888286f21b1235bde1f35efe13f8b3edb739c8f28e6e6043cb29569aa0e7b
cipher = 0x5a1e001edd22964dd501eac6071091027db7665e5355426e1fa0c6360accbc013c7a36da88797de1960a6e9f1cf9ad9b8fd837b76fea7e11eac30a898c7a8b6d8c8989db07c2d80b14487a167c0064442e1fb9fd657a519cac5651457d64223baa30d8b7689d22f5f3795659ba50fb808b1863b344d8a8753b60bb4188b5e386
e = 0x10005
d = 0xae285803302de933cfc181bd4b9ab2ae09d1991509cb165aa1650bef78a8b23548bb17175f10cddffcde1a1cf36417cc080a622a1f8c64deb6d16667851942375670c50c5a32796545784f0bbcfdf2c0629a3d4f8e1a8a683f2aa63971f8e126c2ef75e08f56d16e1ec492cf9d26e730eae4d1a3fecbbb5db81e74d5195f49f1x = pinvq
y = qinvp
temp = e * d - 1
for k in tqdm(range(3,e)):if temp % k == 0:phi_n = temp // k# print(k)a = x - 1b = (x - 1) * (y - 1) + x * y - 1 - phi_nc = (x * y - 1) * (y - 1)Delta = b ** 2 - 4 * a * cif gmpy2.is_square(Delta):result1 = (-b + gmpy2.isqrt(Delta)) // (2 * a)result2 = (-b - gmpy2.isqrt(Delta)) // (2 * a)temp1,temp2 = result1,result2if (x * y - 1) % temp1 == 0:k1,k2 = temp1,(x * y - 1) // temp1elif (x * y - 1) % temp2 == 0:k1,k2 = temp2,(x * y - 1) // temp2q = x + k2p = y + k1n = p * qm = pow(cipher,d,n)flag = bytes.decode(long_to_bytes(m))print(flag)breakelse:continue

参考文章

write-up/README.md at master · pcw109550/write-up (github.com)

LinearEquations

知识点:LCG变种

题目描述

from Crypto.Util.number import*
from secret import flag
assert flag[:5] == b'cazy{'
assert flag[-1:] == b'}'
flag = flag[5:-1]
assert(len(flag) == 24)class my_LCG:def __init__(self, seed1 , seed2):self.state = [seed1,seed2]self.n = getPrime(64)while 1:self.a = bytes_to_long(flag[:8])self.b = bytes_to_long(flag[8:16])self.c = bytes_to_long(flag[16:])if self.a < self.n and self.b < self.n and self.c < self.n:breakdef next(self):new = (self.a * self.state[-1] + self.b * self.state[-2] + self.c) % self.nself.state.append( new )return newdef main():lcg = my_LCG(getRandomInteger(64),getRandomInteger(64))print("data = " + str([lcg.next() for _ in range(5)]))print("n = " + str(lcg.n))if __name__ == "__main__":main() # data = [2626199569775466793, 8922951687182166500, 454458498974504742, 7289424376539417914, 8673638837300855396]
# n = 10104483468358610819

程序分析

把flag分成了三段,也就是对应着三个密文,self.a,self.b,self.c

加密过程是线性同余生成器的变种,线性同余生成器_百度百科 (baidu.com)

总的来说就是不断继续递归

看一下next()函数的加密过程有两个系数,self.state[-1],self.state[-2]

new = (self.a * self.state[-1] + self.b * self.state[-2] + self.c) % self.n

这两个系数最初是seed1,seed2充当的,是未知量,也无法推出,也没有必要退出

因为ta加密了5轮,每轮结束之后,得到的结果new加入self.state,这里的new就是data

而我们已知data,也就是每组加密之后的结果,所以在加密两轮之后,

new = (self.a * self.state[-1] + self.b * self.state[-2] + self.c) % self.n

这个等式里的所有量除了self.a,self.b,self.c需要求,其他的量都已知

总共加密了5轮,那么除去前面两轮加密过程中我们有一个或者两个系数未知,剩下3轮所有系数和等式左边的结果都已知,也就是三个未知量,三个方程,可以解。那么剩下的就是解方程组

注意这个方程组是在模self.n的世界里面进行的,所以在进行求方程组之前我们需要对数据进行模初始化(也可以直接在涉及除法的时候写在inverse_mod()且在结果之后模self.n),self.n是已知的

d a t a 3 = d a t a 2 ∗ a + d a t a 1 ∗ b + c ( m o d n ) data3 = data2*a+data1*b+c(mod~n) data3=data2∗a+data1∗b+c(mod n)

d a t a 4 = d a t a 3 ∗ a + d a t a 2 ∗ b + c ( m o d n ) data4=data3*a+data2*b+c(mod~n) data4=data3∗a+data2∗b+c(mod n)

d a t a 5 = d a t a 4 ∗ a + d a t a 3 ∗ b + c ( m o d n ) data5=data4*a+data3*b+c(mod~n) data5=data4∗a+data3∗b+c(mod n)

联立方程求a,b,c

代码实现

sage: data = [2626199569775466793, 8922951687182166500, 454458498974504742, 7289424376539417914, 8673638837300855396]
....: n = 10104483468358610819
....: d1 = mod(data[0],n)
....: d2 = mod(data[1],n)
....: d3 = mod(data[2],n)
....: d4 = mod(data[3],n)
....: d5 = mod(data[4],n)
#这里注释的公式运行出来是错误的,似乎因为在模运算中不能有两个及以上的"/",保险一点建议大家用inverse_mod()来表达除法
....: # b = ((d4 - d3)*(d4 - d2) - (d5 - d3)*(d3 - d2))/((d3 - d2)*(d4 - d2)) / (((d2 - d1)*(d5 - d3) - (d3 - d1)*(d3 - d2))/((d3 -d2)*(d5 - d3)))
....: # print(b)
sage: b = ((d4 - d3)^2 - (d5 - d4)*(d3 - d2)) / ((d2 - d1)*(d4 - d3) - (d3 - d2)^2)
....: print(b)
....: a = ((d4 - d3)*(d3 - d2) - b*(d2 - d1)*(d3 - d2)) / (d3 - d2)^2
....: print(a)
....: c = d3 - d2*a - d1*b
....: print(c)
8175498372211240502
5490290802446982981
6859390560180138873

得到的a,b,c进行long_to_bytes()即可

其他

其他的密码题难度不大

可以参考这篇文章(11条消息) 2022 长安“战疫”网络安全卫士守护赛 WriteUp_是Mumuzi的博客-CSDN博客

长安“战疫”网络安全卫士守护赛_crypto_复现相关推荐

  1. 2021长安“战疫”网络安全卫士守护赛 misc部分writeup

    2021长安"战疫"网络安全卫士守护赛 misc部分writeup 八卦迷宫 朴实无华的取证 西安加油 ez_Encrypt 一百多名,我觉得还行欸,多亏了队里的crypto手 八 ...

  2. 长安“战疫”网络安全卫士守护赛部分wp

    摘要:长安"战疫"网络安全卫士守护赛部分wp            然后就是朴实无华的取证那个题 不知道是大小写的原因还是啥交不上,无字天书卡到最后那个长得好像摩斯密码的地方,收获 ...

  3. 长安“战疫”网络安全卫士守护赛writeup

    长安"战疫"网络安全卫士守护赛writeup misc 八卦迷宫 得到flag cazy{zhanchangyangchangzhanyanghechangshanshananzh ...

  4. 2022 长安“战疫”网络安全卫士守护赛 WriteUp

    麻薯星的zyz想要生猴子!!!麻薯星的zyz想要生猴子!!!麻薯星的zyz想要生猴子!!! 队友第一轮做了俩Web之后就摆烂了 寄 总体来说长安战疫基本大部分题都偏向入门,适合大一新生练练手 少部分多 ...

  5. 长安“战疫”网络安全卫士守护赛部分writeup

    解题过程 题目一 八卦迷宫 用画图工具手工连接,然后将路上的图表和字相对应 按顺序打出,然后根据题目要求换成全拼,加上图片里的前缀cazy{}提交 flag为: cazy{zhanchangyangc ...

  6. 长安“战疫”网络安全卫士守护赛crypto

    cry1 题目如下,就是一个脚本: from Crypto.Util.number import* from secret import flag,keyassert len(key) <= 5 ...

  7. 长安“战疫”网络安全卫士守护赛 WriteUp

    1.RCE_No_Para 参考一篇比较详细的bloghttps://skysec.top/2019/03/29/PHP-Parametric-Function-RCE/#%E6%B3%951%EF% ...

  8. 2021---长安“战疫”网络安全卫士守护赛 Writeup

    文章目录 Misc 八gua迷宫 无字天书 西安加油 steg binary Crypto no_cry_no_bb no_cry_no_can no_math_no_cry Reverse comb ...

  9. 长安战疫网络安全卫士守护赛 Shiro?

    赛题:Shiro? 需要准备的环境: 反弹shell需要准备VPS.JNDI-Injection-Exploit工具启动rmi和ldap服务 JNDI-Injection-Exploit 需要jdk. ...

最新文章

  1. 工作流引擎在视频网站架构中的应用
  2. c 全局变量多线程调用_c语言局部变量 静态局部变量 全局变量与静态全局变量...
  3. Java并行编程中的“可调用”与“可运行”任务
  4. oracle报错对象不存在
  5. 阿里云端安装mysql
  6. Ubuntu 远程使用ssh 开启服务器终端的方法
  7. xxx.app已损坏,打不开.你应该将它移到废纸篓-已解决
  8. Atitit 董事会主席董事长之道 attilax著 艾龙著 1. 董事会主席 会长董事长 1 1.1. 董事会职责 1 1.2. 董事长职权 2 1.3. 议事规则 2 1.4. 联系职位简称 3
  9. python爬取酷狗音乐付费音乐包_一篇文章教会你使用Python网络爬虫下载酷狗音乐...
  10. 国际科学数据服务平台nbsp;-nbsp;csdb
  11. pyhive 安装测试及问题解决
  12. 单片机编程语言——C语言(1)
  13. java excel 取消科学计数法_java使用poi解析或处理excel的时候,如何防止数字变成科学计数法的形式...
  14. 【接口测试实战(三)】接口测试用例的编写
  15. oracle 挖掘日志,使用Oracle的Logminer工具进行日志挖掘
  16. JUnit测试提示java.lang.Exception: No runnable methods
  17. 状态码中400错误和405错误怎么解决
  18. 乐谱学习软件:iReal Pro for Mac
  19. SQL注入之order by注入与limit注入
  20. 英美团队发现神秘信号:金星上可能存在生命?

热门文章

  1. 关于MYSQL无法启动(错误1053)
  2. Manager isn‘t available; ‘auth.User‘ has been swapped for ‘mm.UserInfo‘
  3. 好看的立体正方形标题
  4. 爬取猫眼top100的电影图片,名称,时间,评分等信息
  5. js动态给table表格的行添加删除线
  6. 硬链接和软链接区别总结
  7. Linux添加软件分类(GNOME桌面)
  8. mac 配置 ndk 环境变量
  9. Layui实现图片上传回显和删除
  10. Mysql执行计划和Mysql优化