picoCTF 密码学方向RSA算法做题记录

news2024/11/19 12:43:03

RSA算法原理:

https://blog.csdn.net/qq_45894840/article/details/128204460?spm=1001.2014.3001.5502

Mind your Ps and Qs

在这里插入图片描述

题目描述:In RSA, a small e value can be problematic, but what about N? Can you decrypt this?

下载题目

在这里插入图片描述

在这里可以看到三个值,c,n和e,关于原理,可以去看我之前写的这个文章

https://blog.csdn.net/qq_45894840/article/details/128204460

python模块安装

pip3 install factordb-pycli
pip3 install gmpy2

现在我们写一个小脚本来破解

from factordb.factordb import FactorDB
import gmpy2

c = 240986837130071017759137533082982207147971245672412893755780400885108149004760496
n = 831416828080417866340504968188990032810316193533653516022175784399720141076262857
e = 65537
//导入c,n,e的值

f = FactorDB(n)   //因为n不大,这里直接分解q和p的值
f.connect()
p, q = f.get_factor_list()  //获取因素列表
ph = (p-1)*(q-1)  //获取φ(n)值,之后计算私钥值
d = gmpy2.invert(e, ph) //有了e值和φ(n)值,可以计算私钥值
plaintext = pow(c, d, n)  //解密
print(bytearray.fromhex(format(plaintext, 'x')).decode())  //将十六进制字符串转换为字节后解密

运行脚本,得到flag值

在这里插入图片描述

picoCTF{sma11_N_n0_g0od_23540368}

Mini RSA

在这里插入图片描述

题目描述:What happens if you have a small exponent? There is a twist though, we padded the plaintext so that (M ** e) is just barely larger than N. Let’s decrypt this:

下载题目

在这里插入图片描述

这里有三个值,n,e和c值,根据题目描述提示M ^ e刚比N大,意思是:

M^3 mod n = c

t值可以写成:

M^3 = tn + c

根据以上推理,可以得出:

M = iroot(tn+c, 3) //iroot是gmpy2模块的一个函数,作用是给a开b次方

现在我们写一个小脚本来获得flag

import gmpy2

n = 1615765684321463054078226051959887884233678317734892901740763321135213636796075462401950274602405095138589898087428337758445013281488966866073355710771864671726991918706558071231266976427184673800225254531695928541272546385146495736420261815693810544589811104967829354461491178200126099661909654163542661541699404839644035177445092988952614918424317082380174383819025585076206641993479326576180793544321194357018916215113009742654408597083724508169216182008449693917227497813165444372201517541788989925461711067825681947947471001390843774746442699739386923285801022685451221261010798837646928092277556198145662924691803032880040492762442561497760689933601781401617086600593482127465655390841361154025890679757514060456103104199255917164678161972735858939464790960448345988941481499050248673128656508055285037090026439683847266536283160142071643015434813473463469733112182328678706702116054036618277506997666534567846763938692335069955755244438415377933440029498378955355877502743215305768814857864433151287
e = 3
c = 1220012318588871886132524757898884422174534558055593713309088304910273991073554732659977133980685370899257850121970812405700793710546674062154237544840177616746805668666317481140872605653768484867292138139949076102907399831998827567645230986345455915692863094364797526497302082734955903755050638155202890599808154521995312832362835648711819155169679435239286935784452613518014043549023137530689967601174246864606495200453313556091158637122956278811935858649498244722557014003601909465057421728834883411992999408157828996722087360414577252630186866387785481057649036414986099181831292644783916873710123009473008639825720434282893177856511819939659625989092206115515005188455003918918879483234969164887705505900695379846159901322053253156096586139847768297521166448931631916220211254417971683366167719596219422776768895460908015773369743067718890024592505393221967098308653507944367482969331133726958321767736855857529350486000867434567743580745186277999637935034821461543527421831665171525793988229518569050
//导入n,e,c的值

for i in range(10000):   //遍历循环,找到m值
    m, t = gmpy2.iroot(i*n + c, e)
    if t:
        print(bytearray.fromhex(format(m, 'x')).decode()) //将十六进制字符串转换为字节后解密
        break

在这里插入图片描述

运行脚本,获得flag

picoCTF{e_sh0u1d_b3_lArg3r_a166c1e3}

Dachshund Attacks

在这里插入图片描述

题目描述:What if d is too small? Connect with nc mercury.picoctf.net 41508

在这里插入图片描述

可以得到e,n和c的值,根据题目提示,Wiener’s attack是一个针对RSA密码的攻击

https://en.wikipedia.org/wiki/Wiener%27s_attack

直接用rsactftool脚本跑

https://github.com/RsaCtfTool/RsaCtfTool
python3 RsaCtfTool.py -n 73858245204393269120598772974257218874289179816258533748548954836353808000542909731398449660121424717248079724923923284922221800385870164798744402737063530114487159042350959711492581286948377310386675916734743955708759421607349585475823504183537132290212235481788134354234151518170214048887523664730897405647 -e 40185337488228965483088768689361237580655397969352079774015797079626751211817603607155962600219370112069853693506378621129705581863959239984871073674637310005220323695488701830477574210150173980203084059519439551150923764323395592278383658383525721471839777239932693638775164411928659371101425091253226312809 --uncipher 11279019002658132246395680583012680197641520463055015905954159065596263829466315684813964601637222796742820040947867106250604831640789683230174556440623073026811900236014477245382133062014821631152893829897692611106964558955134460480794092202226246351625569961925929573208935964302390747204250124554416009841 --attack wiener

在这里插入图片描述

得到flag

picoCTF{proving_wiener_1146084}

No Padding, No Problem

在这里插入图片描述

题目描述:Oracles can be your best friend, they will decrypt anything, except the flag’s ciphertext. How will you break it? Connect with nc mercury.picoctf.net 33780

在这里插入图片描述

可以得到n,e和c值,他可以帮我们解密一些东西,除了这个密文

在这里插入图片描述

根据题目提示,未填充的RSA是同态加密

https://en.wikipedia.org/wiki/Homomorphic_encryption

在这里插入图片描述

意思是:

encrypt(m1) * encrypt(m2) = ((m1^e) * (m2^e)) mod n = (m1 * m2)^e mod n = encrypt(m1 * m2)

我们写一个小脚本,对它进行加密,然后让服务器给我们解密

n = 51257263015582188197648371474129549390905726426257438448153816359702362365658508334422660676137191608574589301862860723036048910648313371474365316649888203989162930646519011433136231329260451213231902920703710354241532734042339059649207865410951756937740333312020743615116676965217774179610963694893894058993
e = 65537
c = 4630900525813217788908324506108030714601444705261980401094718094759603138876572869225585464832937171107712654868912146981974620187638194979958086597403998901460677636640013168017847942623819676132193036153903064536382635689292213133256195449181769142311263486211152780709880862212814932262615707105931438936


x = pow(2, e, n)
print(c * x)

运行脚本,得到加密后的值

在这里插入图片描述

根据官方文档,c * x = encrypt(m) * encrypt(2) = encrypt(m * 2),现在我们去服务器上解密

在这里插入图片描述

得到了m * 2的值,将这个值除以2得到m

m = 580550060391700078946913236734911770139931497702556153513487440893406629034802718534645538074938502890769425795379846471930 // 2

print(bytearray.fromhex(format(m, 'x')).decode())

运行脚本,得到flag

在这里插入图片描述

picoCTF{m4yb3_Th0se_m3s54g3s_4r3_difurrent_5052620}

Scrambled: RSA

在这里插入图片描述

题目描述:Description
Hmmm I wonder if you have learned your lesson… Let’s see if you understand RSA and how the encryption works. Connect with nc mercury.picoctf.net 50075

连接之后,它会问你一些很基础的问题

在这里插入图片描述

给了你q和p值,叫我们求n值,并且还问我们n值能求出来吗

n = pq
q = 60413
p = 76753
n = p*q

print(n)
//4636878989

在这里插入图片描述

成功通过第一关,第二关给了我们p和n值,需要求q值

q = n // p
p = 54269
n = 5051846941
q = n // p

print(q)
//93089

在这里插入图片描述

toitent(n)=(p-1)(q-1)

第三关给了我们e和n值,叫我们求p和q的值,因为条件不够(没有t的值),这里选n

在这里插入图片描述

来到第四关,这里给了我们q和p的值,叫我们求toitent(n)的值

totient(n) = (p – 1) * (q – 1)
def totient(p, q):
    return (p - 1)*(q - 1)
 
q = 66347
p = 12611

print(totient(q, p))
//836623060

在这里插入图片描述

成功通过第四关,第五关给了我们plaintest和e,n的值,叫我们加密,直接加密即可

def encryption(plaintext, e, n):
    return (plaintext**e) % n
plaintext = 6357294171489311547190987615544575133581967886499484091352661406414044440475205342882841236357665973431462491355089413710392273380203038793241564304774271529108729717
e = 3
n = 29129463609326322559521123136222078780585451208149138547799121083622333250646678767769126248182207478527881025116332742616201890576280859777513414460842754045651093593251726785499360828237897586278068419875517543013545369871704159718105354690802726645710699029936754265654381929650494383622583174075805797766685192325859982797796060391271817578087472948205626257717479858369754502615173773514087437504532994142632207906501079835037052797306690891600559321673928943158514646572885986881016569647357891598545880304236145548059520898133142087545369179876065657214225826997676844000054327141666320553082128424707948750331

print(encryption(plaintext,e, n)) 
//256931246631782714357241556582441991993437399854161372646318659020994329843524306570818293602492485385337029697819837182169818816821461486018802894936801257629375428544752970630870631166355711254848465862207765051226282541748174535990314552471546936536330397892907207943448897073772015986097770443616540466471245438117157152783246654401668267323136450122287983612851171545784168132230208726238881861407976917850248110805724300421712827401063963117423718797887144760360749619552577176382615108244813

在这里插入图片描述

第六关给了我们c,n和e值,叫我们解密我们不知道p和q值,这里选n

在这里插入图片描述

第七关给了我们q、p和e值,需要计算出d值

d ≡ e^−1 (mod φ(n))
from Crypto.Util.number import inverse

q = 92092076805892533739724722602668675840671093008520241548191914215399824020372076186460768206814914423802230398410980218741906960527104568970225804374404612617736579286959865287226538692911376507934256844456333236362669879347073756238894784951597211105734179388300051579994253565459304743059533646753003894559
p = 97846775312392801037224396977012615848433199640105786119757047098757998273009741128821931277074555731813289423891389911801250326299324018557072727051765547115514791337578758859803890173153277252326496062476389498019821358465433398338364421624871010292162533041884897182597065662521825095949253625730631876637
e = 65537

print(inverse(e, (p-1)*(q-1)))
//1405046269503207469140791548403639533127416416214210694972085079171787580463776820425965898174272870486015739516125786182821637006600742140682552321645503743280670839819078749092730110549881891271317396450158021688253989767145578723458252769465545504142139663476747479225923933192421405464414574786272963741656223941750084051228611576708609346787101088759062724389874160693008783334605903142528824559223515203978707969795087506678894006628296743079886244349469131831225757926844843554897638786146036869572653204735650843186722732736888918789379054050122205253165705085538743651258400390580971043144644984654914856729

在这里插入图片描述

第八关给了p,c,e和n的值,叫我们求明文的值,我们写个小脚本直接跑

from Crypto.Util.number import inverse
p = 153143042272527868798412612417204434156935146874282990942386694020462861918068684561281763577034706600608387699148071015194725533394126069826857182428660427818277378724977554365910231524827258160904493774748749088477328204812171935987088715261127321911849092207070653272176072509933245978935455542420691737433
ciphertext = 18031488536864379496089550017272599246134435121343229164236671388038630752847645738968455413067773166115234039247540029174331743781203512108626594601293283737392240326020888417252388602914051828980913478927759934805755030493894728974208520271926698905550119698686762813722190657005740866343113838228101687566611695952746931293926696289378849403873881699852860519784750763227733530168282209363348322874740823803639617797763626570478847423136936562441423318948695084910283653593619962163665200322516949205854709192890808315604698217238383629613355109164122397545332736734824591444665706810731112586202816816647839648399
e = 65537
n = 23952937352643527451379227516428377705004894508566304313177880191662177061878993798938496818120987817049538365206671401938265663712351239785237507341311858383628932183083145614696585411921662992078376103990806989257289472590902167457302888198293135333083734504191910953238278860923153746261500759411620299864395158783509535039259714359526738924736952759753503357614939203434092075676169179112452620687731670534906069845965633455748606649062394293289967059348143206600765820021392608270528856238306849191113241355842396325210132358046616312901337987464473799040762271876389031455051640937681745409057246190498795697239

r = (p-1)*(n//p-1)
d = inverse(e,r)
m = pow(ciphertext, d, n)

print(m)
//14311663942709674867122208214901970650496788151239520971623411712977120586163535880168563325

在这里插入图片描述

然后它说,这个明文就是flag,我们转换即可

m = 14311663942709674867122208214901970650496788151239520971623411712977120586163535880168563325
print(bytearray.fromhex(format(m, 'x')).decode())

在这里插入图片描述

得到flag

picoCTF{wA8_th4t$_ill3aGal..ode01e4bb}

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

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

相关文章

初级软件测试面试会问什么 掌握好这两几个方法,还怕拿捏不住hr?

初级软件测试工程师大多为新入门的小白,在经历面试时,往往也是最忐忑的一部分人,为此,我特为大家整理了一些初级软件测试面试会问的问题,帮助你们在面试时能够从容不迫的回答出hr的问题,拿下offer&#xff…

Python实现PSO粒子群优化卷积神经网络CNN分类模型项目实战

说明:这是一个机器学习实战项目(附带数据代码文档视频讲解),如需数据代码文档视频讲解可以直接到文章最后获取 1.项目背景 PSO是粒子群优化算法(Particle Swarm Optimization)的英文缩写,是一种…

ESB产品UI升级总结

一款好的产品需要不断地打磨才能变得更完整、更稳定。企业服务总线ESB产品作为数通畅联的核心产品,为了能够更好地迎合客户的需求,实现更好的视觉效果和体验感,需要不断地迭代升级。 本次升级主要是针对整体页面进行优化以及对部分功能进行修…

【C++】vector迭代器失效与深浅拷贝问题

vector迭代器失效与深浅拷贝问题 文章目录vector迭代器失效与深浅拷贝问题一、vector迭代器失效问题1. insert迭代器失效1.1.扩容导致野指针1.2.迭代器指向位置意义改变1.3.windows下VS中标准库和Linux下g中标准库对insert迭代器失效的处理2. erase迭代器失效2.1.迭代器失效指向…

UniMSE(2022)统一的多模态情感分析与情感识别(多层融合和对比学习)

论文题目(Title):UniMSE: Towards Unified Multimodal Sentiment Analysis and Emotion Recognition 研究问题(Question):短情绪emotions和长情绪sentiments的分析和识别 研究动机(Motivation…

JAVA之 Maven进阶 分模块开发与设计 依赖管理 聚合 继承 属性 多环境配置与应用 私服

分模块开发意义 我们先创建一个模块并设计相应的内容,pom文件中会有该模块的信息 然后运用maven的install运行,下载该模块的jar到本地仓库 然后需要用到该模块的时候 我们在另一个模块的pom中导入创建的模块坐标就可以了 依赖管理 依赖具有传递性 直…

北京智汇云舟科技数字孪生三大创新应用场景

目前,数字孪生技术正在通过各种行业以无数不同的方式被使用,以产生一些惊人的效果。世界各地不同行业的公司正在采用数字孪生系统来改进从流程到供应链管理、从设施管理到满足能源和可持续发展目标的方方面面。今天我们将重点从轨道交通、学校、能源水利…

NeurIPS 2022-10大主题、50篇论文总结

2672篇主要论文,63场研讨会,7场受邀演讲,包括语言模型、脑启发研究、扩散模型、图神经网络……NeurIPS包含了世界级的AI研究见解,本文将对NeurIPS 2022做一个全面的总结。 第36届Neural Information Processing Systems Conferenc…

“美亚杯”第二届中国电子数据取证大赛答案解析(团体赛)

1. 根据所提供的文件,在映像文件的采集过程中,曾使用那一种的写入保护设备? A)软件写入保护设备 B)WiebeTech写入保护设备 C)EPOS写入保护器 D)Tableau取证工具SATA / IDE Bridge IEEE 1394…

内容完美!阿里技术官21年新肝出了一份MySQL笔记+面试题

目录 共有12个章节的内容,看大标题就知道全部都是MySQL的重要知识! 内容过多,没有办法全部展示 部分内容截图 Mysql权限 MySql数据类型 锁 业务设计 索引与执行计划 MySQL面试笔记 面试笔记分为6章,分别是MySQL基础篇、MySQL索引…

【脚本项目源码】Python制作多功能音乐播放器,打造专属你的音乐播放器

前言 本文给大家分享的是如何通过利用Python实现多功能音乐播放器,废话不多直接开整~ 开发工具 Python版本: 3.6 相关模块: os模块 sys模块 time模块 random模块 PyQt5模块 环境搭建 安装Python并添加到环境变量,pip安…

Pro_12丨为股指而战

量化策略开发,高质量社群,交易思路分享等相关内容 『正文』 ˇ 大家好,今天我们分享2022年度最后一期策略——股指专属策略。本期策略是2022年专门为股指而开发的专属策略,算是我个人对明年的一厢情愿吧! 该策略由超…

剑指Serverless, 入围Forrester Wave, 6.5 LTS 预览,TiDB 多元数据生态再升级 | PingCAP DevCon 2022

2022 年 12 月 1 日 - 3 日,由 PingCAP 主办的年度数据技术盛会 PingCAP DevCon 2022 在线上成功举行。本届 DevCon 以 "去发现,去挑战" 为主题,邀请了多位行业意见领袖、专家学者和 70 多位来自全球的技术大咖聚焦云原生、HTAP、S…

打造家居建材企业核心竞争力,数商云SCM管理系统高效高质满足企业采购需求

随着消费水平的提高和消费观念的升级,中国房地产市场从增量时代走向存量时代,作为家居建材家装业的上游,房地产行业的变动影响着家居建材行业的发展。当前家居建材行业正处于调整分化、转型升级的关键时期,也是创新动力最强的时期…

Docker-数据卷(Data Volumes)dockerfile

目录 一,宿主机与容器之间的文件拷贝 1.1 容器中怎么上传项目(文件) 1.2 从宿主机拷贝文件到容器 1.3 从容器中拷贝文件到宿主机 二 数据卷 三 数据卷容器 四 Dockerfile Dockerfile制作增强版 自定义centos 具备vim以及ifconfig Dock…

nodejs+vue农产品进销存管理系统

摘 要 I ABSTRACT II 目 录 II 第1章 绪论 1 1.1背景及意义 1 1.2 国内外研究概况 1 1.3 研究的内容 1 第2章 相关技术 2 2.5 MySQL数据库 3 第3章 系统分析 4 3.1 需求分析 4 3.2 系统可行性分析 4 3.2.1技术可行性:技术背…

Python进阶学习

Python进阶学习 参考资料: AILearning菜鸟教程python之platform模块 python-version: 3.9 使用Jupyter进行练习 一、sys模块 import sys命令行参数 sys.argv 显示传入的参数: %%writefile print_args.py import sys print(sys.argv)Writing print_a…

达摩院开源低成本大规模分类框架FFC CVPR论文深入解读

一、论文&代码 论文链接:An Efficient Training Approach for Very Large Scale Face Recognition 应用&代码: https://modelscope.cn/models/damo/cv_ir50_face-recognition_arcface/summary https://modelscope.cn/models/damo/cv_resnet_f…

使用ONNXRuntime部署阿里达摩院开源DAMO-YOLO目标检测,一共包含27个onnx模型(代码开源)...

2022点击蓝字 关注我们关注并星标从此不迷路计算机视觉研究院学习群|扫码在主页获取加入方式获取代码|关注并回复“onnx部署”01概述ONNXRuntime是微软推出的一款推理框架,用户可以非常便利的用其运行一个onnx模型。ONNXRuntime支持多种运行后…

深入理解 equals() 方法以及与 == 的区别

当使用 判断两个变量是否相等时 如果两个变量是基本类型的变量,且都是数值类型,只要两个变量的数值相等,则返回 true 对于两个引用类型变量, 比较的是变量(栈)内存中存放的对象的(堆)内存地址,用来判断两个对象的地址…