NewStarCTF 2023 公开赛道 WEEK2|Crypto

news2024/11/20 4:53:45

目录

T1.滴啤

T2.不止一个pi

T3.halfcandecode

T4.Rotate Xor

T5.broadcast

T6.partial decrypt


T1.滴啤

    下载题目附件,我们获得到以下代码。

from Crypto.Util.number import *
import gmpy2
from flag import flag
def gen_prime(number):
    p = getPrime(number//2)
    q = getPrime(number//2)
    return p,q

m = bytes_to_long(flag.encode())
p,q = gen_prime(1024)
print(p*q)
e = 65537
d = gmpy2.invert(e,(p-1)*(q-1))
print(d%(p-1))
print(pow(m,e,p*q))
# n = 93172788492926438327710592564562854206438712390394636149385608321800134934361353794206624031396988124455847768883785503795521389178814791213054124361007887496351504099772757164211666778414800698976335767027868761735533195880182982358937211282541379697714874313863354097646233575265223978310932841461535936931
# d1 = 307467153394842898333761625034462907680907310539113349710634557900919735848784017007186630645110812431448648273172817619775466967145608769260573615221635
# c = 52777705692327501332528487168340175436832109866218597778822262268417075157567880409483079452903528883040715097136293765188858187142103081639134055997552543213589467751037524482578093572244313928030341356359989531451789166815462417484822009937089058352982739611755717666799278271494933382716633553199739292089

     观察代码得到,这是一道DP泄露题。面对DP泄露题的破解关注点就在于对于各个数学关系的利用。大体证明流程如下。

      d_{1}=d+k_{1}(p-1),de=1+k_{2}\Phi (n)那么,我们可以获得

      d_{1}*e=de+k_{1}(p-1)=1+k_{2}((p-1)*(q-1))+k_{1}(p-1),我们提取出(p-1)。那么上述式子可以简化为:d_{1}e=1+x(p-1)。于是我们可以通过爆破x来获取得到(p-1),继而得到p。值得一提的是,因为x=(k_{2}(q-1)+k_{1})=\frac{d_{1}e-1}{p-1}。可知x应当满足x<e。因此破译脚本如下。

d1 = 307467153394842898333761625034462907680907310539113349710634557900919735848784017007186630645110812431448648273172817619775466967145608769260573615221635
n = 93172788492926438327710592564562854206438712390394636149385608321800134934361353794206624031396988124455847768883785503795521389178814791213054124361007887496351504099772757164211666778414800698976335767027868761735533195880182982358937211282541379697714874313863354097646233575265223978310932841461535936931
e = 65537

d1e = d1*e
for x in range(e):
    p = (d1e-1)//x + 1
    if (isPrime(p) and isPrime(n // p)):
        print("p = %d" % p)
        print("q = %d" % (n//p))
        break
# 运行上述代码获取(p,q)得到
p = 11468682317608320448548512020423218884851236431873575184966338657457357272806919819351161191000926189140495197426822395189086385102915060848622773489345643
q = 8124105796345459853548244027030096714175206734963482980448160704449968633993583782011947055608004745382787277674755027832520361002441996364399502642927017
phi = (p-1)*(q-1)
d = primefac.modinv(e, phi)


c = 52777705692327501332528487168340175436832109866218597778822262268417075157567880409483079452903528883040715097136293765188858187142103081639134055997552543213589467751037524482578093572244313928030341356359989531451789166815462417484822009937089058352982739611755717666799278271494933382716633553199739292089

m = pow(c, d, n)
print(long_to_bytes(m))

#最终获取flag:flag{cd5ff82d-989c-4fbf-9543-3f98ab567546}

 T2.不止一个pi

    加密附件如下:

from flag import flag
from Crypto.Util.number import *
import gmpy2
p = getPrime(1024)
q = getPrime(1024)
n = p**3*q**2
print("q = ",q)
print("p = ",p)
m = bytes_to_long(flag.encode())
c = pow(m,65537,n)
print("c = ",c)

# q =  115478867870347527660680329271012852043845868401928361076102779938370270670897498759391844282137149013845956612257534640259997979275610235395706473965973203544920469416283181677660262509481282536465796731401967694683575843183509430017972506752901270887444490905891490955975762524187534052478173966117471143713
# p =  171790960371317244087615913047696670778115765201883835525456016207966048658582417842936925149582378305610304505530997833147251832289276125084339614808085356814202236463900384335878760177630501950384919794386619363394169016560485152083893183420911295712446925318391793822371390439655160077212739260871923935217
# c =  4459183928324369762397671605317600157512712503694330767938490496225669985050002776253470841193156951087663107866714426230222002399666306287642591077990897883174134404896800482234781531592939043551832049756571987010173667074168282355520711905659013076509353523088583347373358980842707686611157050425584598825151399870268083867269912139634929397957514376826145870752116583185351576051776627208882377413433140577461314504762388617595282085102271510792305560608934353515552201553674287954987323321512852114353266359364282603487098916608302944694600227628787791876600901537888110093703612414836676571562487005330299996908873589228072982641114844761980143047920770114535924959765518365614709272297666231481655857243004072049094078525569460293381479558148506346966064906164209362147313371962567040047084516510135054571080612077333228195608109065475260832580192321853906138811139036658485688320161530131239854003996457871663456850196483520239675981391047452381998620386899101820782421605287708727667663038905378115235163773867508258208867367314108701855709002634592329976912239956212490788262396106230191754680813790425433763427315230330459349320412354189010684525105318610102936715203529222491642807382215023468936755584632849348996666528981269240867612068382243822300418856599418223875522408986596925018975565057696218423036459144392625166761522424721268971676010427096379610266649911939139451989246194525553533699831110568146220347603627745407449761792135898110139743498767543521297525802809254842518002190381508964357001211353997061417710783337

    很容易知道这道题考察的是欧拉函数。所以解密脚本如下:

q =  115478867870347527660680329271012852043845868401928361076102779938370270670897498759391844282137149013845956612257534640259997979275610235395706473965973203544920469416283181677660262509481282536465796731401967694683575843183509430017972506752901270887444490905891490955975762524187534052478173966117471143713
p =  171790960371317244087615913047696670778115765201883835525456016207966048658582417842936925149582378305610304505530997833147251832289276125084339614808085356814202236463900384335878760177630501950384919794386619363394169016560485152083893183420911295712446925318391793822371390439655160077212739260871923935217
c =  4459183928324369762397671605317600157512712503694330767938490496225669985050002776253470841193156951087663107866714426230222002399666306287642591077990897883174134404896800482234781531592939043551832049756571987010173667074168282355520711905659013076509353523088583347373358980842707686611157050425584598825151399870268083867269912139634929397957514376826145870752116583185351576051776627208882377413433140577461314504762388617595282085102271510792305560608934353515552201553674287954987323321512852114353266359364282603487098916608302944694600227628787791876600901537888110093703612414836676571562487005330299996908873589228072982641114844761980143047920770114535924959765518365614709272297666231481655857243004072049094078525569460293381479558148506346966064906164209362147313371962567040047084516510135054571080612077333228195608109065475260832580192321853906138811139036658485688320161530131239854003996457871663456850196483520239675981391047452381998620386899101820782421605287708727667663038905378115235163773867508258208867367314108701855709002634592329976912239956212490788262396106230191754680813790425433763427315230330459349320412354189010684525105318610102936715203529222491642807382215023468936755584632849348996666528981269240867612068382243822300418856599418223875522408986596925018975565057696218423036459144392625166761522424721268971676010427096379610266649911939139451989246194525553533699831110568146220347603627745407449761792135898110139743498767543521297525802809254842518002190381508964357001211353997061417710783337

e = 65537
phi = (p**3 - p**2)*(q**2 - q)
d = primefac.modinv(e, phi)
n = p**3*q**2
m = pow(c,d,n)
print(long_to_bytes(m))
#最终获取flag:flag{bu_zhi_yige_p1dsaf}

T3.halfcandecode

from Crypto.Util.number import *
import gmpy2
from flag import flag
import os
from hashlib import md5

def gen_prime(number):
    p = getPrime(number // 2)
    q = gmpy2.next_prime(p)
    return p * q

def md5_hash(m):
    return md5(m.encode()).hexdigest()
e = 65537
n = gen_prime(1024)
m1 = bytes_to_long(flag[:len(flag) // 2].encode() + os.urandom(8))
c1 = pow(m1, e, n)
m2 = flag[len(flag) // 2:]
with open("out.txt","w") as f:
    f.write(str(n) + '\n')
    f.write(str(c1) + '\n')
    for t in m2:
        f.write(str(md5_hash(t))+'\n')

      根据加密过程,我们知道这里应该采取费马费解法,所以我们可以把n丢到yafu中去,可以获取得到两个因子

P155 = 10631151190024160908870967192522097752991652918777416177941351782447314225123009693276679810786266997133099934443701772661928189884235742113123409596993841
P155 = 10631151190024160908870967192522097752991652918777416177941351782447314225123009693276679810786266997133099934443701772661928189884235742113123409596993409

     知道(p,q)后,我们就可以破解RSA了。接下来我们只需要用MD5在线工具破解下半段密文即可。

T4.Rotate Xor

from secret import flag
from os import urandom
from pwn import xor
from Cryptodome.Util.number import *
k1 = getPrime(64)
k2 = getPrime(64)
ROUND = 12
ciphertext = xor(flag, long_to_bytes(k1))
def round_rotate_left(num, step):
    return ((num) << step | num >> (64-step)) & 0xffffffffffffffff
def encrypt_key(key):
    
    for _ in range(ROUND):
        key = round_rotate_left(key, 3) ^ k2
    
    return key
print('ciphertext =', ciphertext)
print('enc_k1 =', encrypt_key(k1))
print('k2 =', k2)

# ciphertext = b'\x8dSyy\xd2\xce\xe2\xd2\x98\x0fth\x9a\xc6\x8e\xbc\xde`zl\xc0\x85\xe0\xe4\xdfQlc'
# enc_k1 = 7318833940520128665
# k2 = 9982833494309156947

     这段就较为简单了,只需要根据代码写出逆过程即可。但是这里有一个小技巧,可以借用原来的代码设计,也就是右移3位等价于左移64-3位

T5.broadcast

    这道题给出了一个靶机信息。在靶机中获取(n,c,e)。获取一组发现难以解密,所以考虑靶机特性,因为是对同一个明文加密,所以我们可以截获到多组信息。因此可以使用广播攻击(见题,如果关注到题目含义就能很快反应,笔者是崩溃的过程中提出为什么给我这么恶心的靶机才意识到的)。 

    因为懒得重新获取17组信息,所以我们只给出破解脚本

def broadcast_attack(data, e):
    def gcdext(a, b):
        x, lastx = 0, 1
        y, lasty = 1, 0
        while b:
            a, (q, b) = b, divmod(a, b)
            x, lastx = lastx - x*q, x
            y, lasty = lasty - y*q, y
        return (a, lastx, lasty)
    
    def chinese_remainder_theorem(items):
        N = 1
        for _n, _c in items:
            N *= _n
        
        result = 0
        for _n, _c in items:
            m = N // _n
            r, s, d = gcdext(_n, m)
            if r != 1:
                N = N // n
                continue
            result += _c*d*m
        return (result % N, N)
    
    x, n = chinese_remainder_theorem(data)
    m = gmpy2.iroot(x, e)[0]
    print(m)
    return m

T6.partial decrypt

from secret import flag
from Crypto.Util.number import *

m = bytes_to_long(flag)
e = 65537
p = getPrime(512)
q = getPrime(512)

n = p*q 

c = pow(m,e,n)

dp = inverse(e, (p-1))
dq = inverse(e, (q-1))
m1 = pow(c,dp, p)
m2 = pow(c,dq, q)
q_inv = inverse(q, p)
h = (q_inv*(m1-m2)) % p
print('m2 =', m2)
print('h =', h)
print('q =', q)

# m2 = 4816725107096625408335954912986735584642230604517017890897348901815741632668751378729851753037917164989698483856004115922538576470127778342121497852554884
# h  = 4180720137090447835816240697100630525624574275
# q  = 7325294399829061614283539157853382831627804571792179477843187097003503398904074108324900986946175657737035770512213530293277111992799331251231223710406931

        这道题是一道魔改题,但是不是很难。好好分析还是挺简单的,因为只需要搞清楚h是什么就可以了。

        dp=1+k_{1}(p-1),dq=1+k_{2}(q-1),m1=m (mod p),m2=m (mod q)因为h=(q_inv*(m1-m2))。所以h=(q_inv*(k_{3}p-k_{4}q))(mod p)=-k_{4}(modp),但是k4大小我们未知,其的正负都有可能。但是看到题目只解一半,也就说m > q,即k4 < 0, 所以h就是我们要求取的系数。

m = m2 + h*q
print(long_to_bytes(m))

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1081482.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【java基础学习】之环境变量的配置

java环境变量的配置 第一步&#xff1a;打开电脑->属性->高级系统设置 第二步&#xff1a;点开环境变量 第三步&#xff1a;找到path&#xff08;windows系统执行命令时要搜寻的路径&#xff09; 将按照的bin路径放到新增到path下面&#xff1a; 运行cmd&#xff0c;然…

切换至root用户时,命令提示符颜色为白色,如何修改?

当我切换至root用户时&#xff0c;发现命令提示符里的内容全部为白色&#xff0c;如图所示&#xff1a; 这让人看着不愉快&#xff0c;上网先搜索下解决方案&#xff1a;【切换到 root 账户字体全是白的&#xff0c;怎么改颜色啊】- 百度贴吧&#xff0c;但是这个解决方案只是…

Spring 环境安装配置

Spring 环境安装配置 目录 Spring 环境安装配置 第1步 - 安装Java开发工具包&#xff08;JDK&#xff09;&#xff1a; 步骤2 - 安装Apache通用日志API&#xff1a; 第3步 - 安装Eclipse集成开发环境 第4步 - 安装Spring框架库 本教程将指导您如何准备开发环境并使用 Spring …

【算法-动态规划】不同路径

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kuan 的首页,持续学…

python sqlalchemy(ORM)- 01 简单使用

[doc] 简介 sqlalchemy 是python操作sql数据库的工具&#xff0c;是一个对象关系映射的框架&#xff1b;在python中提供高效、高性能的数据库访问&#xff0c;企业级的数据持久化模式&#xff1b;pypi 地址sqlalchemy官网 sqlalchemy架构 sql操作是独立于ORM操作的&#xf…

选择智慧公厕解决方案,开创智慧城市公共厕所新时代

在城市建设和发展中&#xff0c;公厕作为一个不可或缺的城市基础设施&#xff0c;直接关系到城市形象的提升和居民生活品质的改善。然而&#xff0c;传统的公厕存在着管理不便、卫生状况差、设施陈旧等问题。为了解决这些困扰着城市发展的难题&#xff0c;智慧公厕源头厂家广州…

ABB机器人的MoveL和MoveJ运动指令基本功能介绍

ABB机器人的MoveL和MoveJ运动指令基本功能介绍 MoveL指令 该指令是一种线性的运动指令&#xff0c;通过该指令可以使机器人工具末端TCP点以恒定的速度直线移动到目标点位置。 运动的特点&#xff1a;  路径确定且唯一&#xff1b;  始终是直线 应用场景&#xff1a;弧焊…

chatglm.cpp使用手记

chatglm.cpp AI搭建 1.环境准备2 githup下载项目3 安装加载和量化拥抱面模型所需的软件包4 准备编译环境5 开始编译项目6 模型转换7 CLI 验证8 web 验证9 api验证10 遗留问题 1.环境准备 cat /etc/os-release NAME"Ubuntu" VERSION"20.04 LTS (Focal Fossa)&qu…

新手教程!制作电子期刊的必备网站

随着数字时代的到来&#xff0c;电子期刊已经成为一种重要的阅读方式。无论是为了学习、工作还是娱乐&#xff0c;电子期刊都以其方便、快捷、多样化的特点&#xff0c;越来越受到人们的欢迎。 对于想要制作电子期刊的新手来说&#xff0c;首先需要找到一些专业的工具来制作电子…

构建图像金字塔:探索 OpenCV 的尺度变换技术

构建图像金字塔&#xff1a;探索 OpenCV 的尺度变换技术 引言什么是图像金字塔&#xff1f;为什么需要图像金字塔&#xff1f;构建高斯金字塔构建拉普拉斯金字塔图像金字塔的应用示例&#xff1a;在不同尺度下检测图像中的边缘 结论 引言 在计算机视觉领域&#xff0c;图像金字…

关于链表指针的深刻理解

以下列代码为例 //终于给我搞清楚指针的指向究竟是怎么看的了// 按编号对职工记录进行递增排序 void sortById(List* list) {Employee* p, * q, * tail NULL;// tail 变量则是一个边界指针&#xff0c;初始值为 NULL。while (list->head->next ! tail) // tail 变量则是…

elasticsearch(ES)分布式搜索引擎03——(RestClient查询文档,ES旅游案例实战)

目录 3.RestClient查询文档3.1.快速入门3.1.1.发起查询请求3.1.2.解析响应3.1.3.完整代码3.1.4.小结 3.2.match查询3.3.精确查询3.4.布尔查询3.5.排序、分页3.6.高亮3.6.1.高亮请求构建3.6.2.高亮结果解析 4.旅游案例4.1.酒店搜索和分页4.1.1.需求分析4.1.2.定义实体类4.1.3.定…

本地安装多个node版本,gvnm来安装切换使用。vue2和vue3对node版本要求不一样

首先&#xff0c;本地下载安装gvnm https://github.com/Kenshin/gnvm.。 里面有安装使用方式。 使用gvnm 来管理切换本地node 版本。 2&#xff0c;切换为高版本node,或是在vue2项目package.json 启动打包的时候 配置修改。就无需再切换低版本node 来启动vue2项目了 "s…

(视频教程)Complexheatmap做热图之设置不一样的注释效果

热图我们号的热图系列已经写的很完善了&#xff0c;也写过其他的热图&#xff0c;随便在公众号检索关键词”热图“就有很多&#xff0c;这里就不再列举了。要是一般的热图设置什么的网上也是一大堆&#xff0c;我们也没有写的必要。这里要写的这个热图主要是为了解决一个问题&a…

安卓-APP启动优化技术方案汇总

应用有三种启动状态&#xff1a;冷启动、温启动或热启动。每种状态都会影响应用向用户显示所需的时间。在冷启动中&#xff0c;应用从头开始启动。在另外两种状态中&#xff0c;系统需要将后台运行的应用带入前台。 我们建议您始终在假定冷启动的基础上进行优化。这样做也可以…

探索 Redis 与 MySQL 的双写问题

在日常的应用开发中&#xff0c;我们经常会遇到需要使用多种不同类型的数据库管理系统来满足各种业务需求。其中最典型的就是Redis和MySQL的组合使用。 这两者拥有各自的优点&#xff0c;例如Redis为高性能的内存数据库提供了极快的读写速度&#xff0c;而MySQL则是非常强大的…

生活中的视音频技术

生活中的视音频技术 平时我们打开电脑中自己存电影的目录的话&#xff0c;一般都会如下图所示&#xff0c;一大堆五花八门的电影。&#xff08;其实专业的影视爱好者一概会把影视文件分门别类的&#xff0c;但我比较懒&#xff0c;一股脑把电影放在了一起&#xff09; 因为下载…

避坑:不要在调试版本中的修改程序逻辑

作为一名开发者&#xff0c;我想&#xff0c;你最不希望发生的事情之一是&#xff1a;当你调试一个Bug的时候&#xff0c;Bug就消失了&#xff0c;但直接运行的时候&#xff0c;Bug又出现了。 通过 #ifdef DEBUG 技法&#xff0c;可以将额外的调试代码放置到程序中。毕竟&…

单目标应用:墨西哥蝾螈优化算法(Mexican Axolotl Optimization,MAO)求解微电网优化MATLAB

一、微网系统运行优化模型 微电网优化模型介绍&#xff1a; 微电网多目标优化调度模型简介_IT猿手的博客-CSDN博客 二、墨西哥蝾螈优化算法MAO 墨西哥蝾螈优化算法&#xff08;Mexican Axolotl Optimization&#xff0c;MAO&#xff09;由Yenny Villuendas-Rey 1等人于2021…

10.11作业

多继承代码实现沙发床 #include <iostream>using namespace std;class Sofa {private:int h;public:Sofa() {cout << "Sofa无参构造" << endl;}Sofa(int h): h(h) {cout << "Sofa有参构造" << endl;}Sofa(const Sofa& …