感觉越来越难了这比赛,只作了一个一看就简单的小题,其它看都看不懂。

from Crypto.Util.number import bytes_to_long, getStrongPrimefrom secret import flagassert len(flag) == 255
e = 3
p = getStrongPrime(1024, e=e)
q = getStrongPrime(1024, e=e)
n = p * q
phi = (p - 1) * (q - 1)
d = pow(e, -1, phi)
enc_d = pow(d, e, n)
enc_phi = pow(phi, e, n) #(pq-p-q+1) (p+q+1)**3
enc_flag = pow(bytes_to_long(flag), e, n)
print(f"{n = }")
print(f"{enc_d = }")
print(f"{enc_phi = }")
print(f"{enc_flag = }")

e=3非常小,给了pow(d,e,n),pow(phi,e,n),pow(flag,e,n)

由于所以

enc_d*e^e = (k* +1 )^e%n

k^e * enc_phi = (k*)^e%n

所以明显这是关联信息攻击,可以原来的程序,计算出来都是-1(n-1)

def related_message_attack(c1,c2, di, e,n):from Crypto.Util.number import GCD#展开(x+a)^e的系数,杨辉三角def poly_coef(a, e):assert e >= 0if e == 0:return 1elif e == 1:return [1,1]else:res = [1]coe_prev = poly_coef(a, e-1)for i in range(len(coe_prev)-1):res.append(sum(coe_prev[i:i+2]))res.append(1)return resdef poly_extend(a, e, n,c):coef = poly_coef(a, e)res = [a**i * coef[i] for i in range(len(coef))]res[-1] = res[-1] + cres = [x%n for x in res]return res#化首1def poly_monic(pl,n):from gmpy2 import invertfor p in pl:if p!=0:inv = invert(p,n)breakreturn [int((x*inv)%n) for x in pl]#模运算,这部分写的不是很好,待优化def poly_mod(pl1,pl2,n):from functools import reduceassert len(pl1) == len(pl2)pl1 = poly_monic(pl1,n)pl2 = poly_monic(pl2,n)for i in range(len(pl1)):if pl1[i] > pl2[i]:breakelif pl1[i] < pl2[i]:return poly_mod(pl2,pl1,n)else:return 0idx = -1for i in range(len(pl1)):if pl1[i] == 1:idx = ibreakfor i in range(idx,len(pl2)):if pl2[i] == 1:pl2 = pl2[:idx] + pl2[i:]pl2 += [0]*(len(pl1)-len(pl2))breakres = []for i in range(len(pl1)):if pl2[i] == 0:res.append(pl1[i])else:res.append(pl1[i]-pl2[i])res = [int(x%n) for x in res]g = int(reduce(GCD,res))if g > 1:res = [x//g for x in res]return res#最大公因式def poly_gcd(pl1,pl2,n):while pl2 != 0:pl1,pl2 = pl2, poly_mod(pl1,pl2,n)pl1 = poly_monic(pl1,n)return pl1#x^e-c1#(x+di)^e-c2pl1 = poly_extend(0,e,n,-c1)pl2 = poly_extend(di,e,n,-c2)pl_d = poly_gcd(pl1,pl2,n)#求得(x-m),所以取负数即为mm = n - pl_d[-1]return m

可能是什么不清楚,后来又从网上搜到一个简单点的。

from gmpy2 import invert#这个函数原来是解出phi,但经过测试解出的是-(p+q-1)*2  phi=(p-1)(q-1)=n-(p+q)+1 所以解是p+q-1
def getM2(a,b,c1,c2,n,e):a3 = pow(a,e,n)b3 = pow(b,e,n)first = c1-a3*c2+2*b3first = first % nsecond = e*b*(a3*c2-b3)second = second % nthird = second * invert(first,n)third = third % nfourth = (third+b) * invert(a,n)return fourth % n

这里还有个问题,phi虽然比n小,但k=2时也是比n大的,所以得到的是模n后的,phi=(p-1)(q-1)可以简单看成k(pq-p-q-1) = 2(1-p-q)这样就直接求出p+q然后就很容易得到p,q。

from output import *e = 3
for k in range(1,3):print(k)c1 = enc_d * e**e %n   #ed = k*phi + 1   => c1 = enc_d * e^e = (e*d)^e = (k*phi + 1)^ec2 = enc_phi * k**e %n #                    c2 =         enc_phi * k^e = (k*phi)^e diff = 1vv = getM2(1,diff,c1,c2,n,e)#print(vv)print('p+q:',(n-vv+2)//2)
'''
1
p+q: 8820468529041372002324038698966107072889102452877058887634498287453998997040072501409717546020769209164013911226723405860610209969068954054326071267363333989522789410364093976052951960389244009241995951348719565502276229384027370949790352653647809018302591167162614297744664920674123301610093287714014050868144462711682841900909838516794872905539836775052216863500628808277736583508580182374764197142389283888665469794215298689234712901544771897071199702872440965930331079753495886332933281500351422898210408413640120586805111875614402614790809233447071017020608120170440189652479953915574544657443320286438960533983
2
p+q: 312923382871248014067014925984412146067094621402549185870032327453115760507056850415403142556065116353933188609216161363804133557007400032321485662200928476199152365342526984153017631756765310979024793123971318866032039849942965865364222773233591801819504804711487822035015274359026776976437482432378059626872
'''

现用z3解出来p,q回到rsa的开头。也可以直接用p+q求phi再求d,反正都简单了

q = 154492600502310358961290595218855606637686112564658215263043082517847747558415354021955483686653624865913299541093297750308537763576451319637002115896403014960496288119726132921253645065026096509274270374571068515713750554820699528648387417681352310503451804260205255524204258933646537556120166683375680596359
p = 158430782368937655105724330765556539429408508837890970606989244935268012948641496393447658869411491488019889068122863613495595793430948712684483546304525461238656077222800851231763986691739214469750522749400250350318289295122266336715835355552239491316053000451282566510811015425380239420317315749002379030513
phi = (p - 1) * (q - 1)
d = pow(e, -1, phi)
m = pow(enc_flag,e,n)
print(bytes.fromhex(hex(m)[2:]))
#b"HackTM{Have you warmed up? If not, I suggest you consider the case where e=65537, although I don't know if it's solvable. Why did I say that? Because I have to make this flag much longer to avoid solving it just by calculating the cubic root of enc_flag.}"

[HackTM 2023] d-phi-enc相关推荐

  1. [UMDCTF 2023] crypto 部分

    这个小赛只作了8个crypto简单部分,后边5个都不会 pokecomms 密码签到,给了堆字符,细看就两种,每行8组 CHU! 开头,显然是替换成01.然后出来就是flag,这个flag有1364个 ...

  2. [Bucket CTF 2023]

    怎么感觉这比赛越来越难了呢. Crypto TBDLCG 唯一的提示就是题目的名字,对LCG来说它一定会有规律的.登录远程后,它会生成两个0-8的数,猜对得1分,不对对方得1分,赢了就行.试了两次发现 ...

  3. 2023年的深度学习入门指南(14) - 不能只关注模型代码

    2023年的深度学习入门指南(14) - 不能只关注模型代码 最近,有一张大模型的发展树非常流行: 这个图是相当不错的,对于加深对于Transformer模型编码器.解码器作用的理解,模型的开源和闭源 ...

  4. 2023真无线蓝牙耳机推荐:高性价比真无线蓝牙耳机各价位蓝牙耳机推荐!

    2023年了,蓝牙耳机赛道依然很卷!性价比是反映物品可买程度的一种量化的计量方式.现如今,蓝牙耳机市场上主打高性价比的不在少数,而高性价比的东西往往更能精准抓住用户"痛点",从而受 ...

  5. 新手必看:蓝牙耳机什么牌子的好用?2023年蓝牙耳机排名

    上班通勤.健身运动.游戏娱乐都离不开蓝牙耳机,蓝牙耳机市场这几年逐渐饱和,涌现了大量的品牌,蓝牙耳机什么牌子的好用成为热议话题,新手们在挑选时会参考排行榜,小编接下来将盘点2023年蓝牙耳机排名. ● ...

  6. 2023年有哪些值得推荐的蓝牙耳机?小米|南卡|JBL等等高性价比蓝牙耳机推荐

    蓝牙耳机可以说是现代人能够入手最优惠的.最常用的数码产品了,无论身处何处,我们都能够看到蓝牙耳机,音乐能够心情愉悦的,似乎都能从歌曲中得到共鸣,为了能够随时随地听歌,蓝牙耳机肯定必不可少,如今耳机市场 ...

  7. 2023 年openEuler 社区技术委员会增选,新增2位委员

    openEuler 技术委员会于 12 月 4 日举行了 2023 年技术委员会增选. 社区通过推举产生了候选人,在选举过程中,经过候选人自我陈述.提问答辩.现任委员投票等环节,来自 Intel 的田 ...

  8. [DASCTF Apr.2023 X SU战队2023开局之战] crypto复现

    感觉突然啥都不会了,后来拿到官方WP,也没整明白,这官方的WP没有代码只讲了些道理,复现一下也不容易. 1,easySign 这是个自制的签名题. from secret import r, t fr ...

  9. 【CTF WriteUp】2023数字中国创新大赛网络数据安全赛道决赛WP(1)

    2023数字中国创新大赛网络数据安全赛道决赛WP(1) 比赛感想 不多说了,还是菜,各种不会,还得学 数据安全题目 Crypto-ddddmm import os from Crypto.Util.n ...

最新文章

  1. libnet apply method
  2. C语言程序练习-L1-023 输出GPLT (20分)
  3. 各种流行深度学习构架的性能对比
  4. 阿里云HBase携X-Pack再进化,重新赋能轻量级大数据平台
  5. 图像增强_Keras 常用的图像增强方式
  6. WPF在代码中创建DataTemplate时候的异常
  7. 嵌入式操作系统_一个C++版的嵌入式操作系统
  8. java集合输入存储_Java练习IO流使用Properties集合存储数据并...
  9. 【渝粤教育】国家开放大学2018年秋季 2632T城市轨道交通客运组织 参考试题
  10. Google Exoplayer之全面认识
  11. html5中按钮点击事件,javascript按钮点击事件
  12. 商业智能BI推动制造业智能化转型
  13. Excel如何批量生成条形码?
  14. SpringCloud--鸿鹄Cloud分布式微服务云系统
  15. C# word类库 光标移动
  16. python安装mysqldb报错
  17. 模数转换器ADC的常用术语和主要技术s指标(完)
  18. 华为防火墙VRRP双机热备的配置
  19. 插值、拟合和逼近的对比
  20. idea 创建module 没有src

热门文章

  1. 鹅厂也对元宇宙下手了
  2. 电脑Tab键有什么功能?6个实用功能总结!
  3. html5实现银联海购商品分类列表
  4. 跟低效说拜拜,教你一键创建多个SOLIDWORKS 工程图
  5. Fama—French五因子模型在中国股票市场适用吗?
  6. 点分治(树分治)详解
  7. html 搜索框输入法闪退,惊喜!我终于找到了一款真正不闪退的第三方输入法!...
  8. 框架CAS实现SSO单点登录功能
  9. java字符串分割split你用对了吗
  10. WordPress自定义登录和注册页面样式并且添加验证码