NSSCTF-Crypto靶场练习---41-46WP

news/2024/5/19 23:44:48 标签: CTF, 学习, 密码学, Crypto, python, 算法

文章目录

  • [CISCN 2022 西南]rsa
  • [HDCTF 2023]爬过小山去看云
  • [LitCTF 2023]md5的破解
  • [CISCN 2023 初赛]Sign_in_passwd
  • [CISCN 2021初赛]rsa
  • [GWCTF 2019]babyRSA

[CISCN 2022 西南]rsa

都是迷惑的东西,别看,注意关键的pow就好。

image-20231213190630112

求 P-1 和 Q-1 的lcm 最小公倍数实际上就是我们要的 phi了。没有难点。

EXP:

python">from Crypto.Util.number import *
from gmpy2 import *

E = 65537
c = 4288727484183191191687364666620023549392656794153112764357730676861570386983002380982803054964588111708662498647767438881892355599604826306427809017097724346976778230464708540600157055782723189971534549543664668430013171469625043063261219462210251726207552819381767396148632877168530609902046293626355744288863460554297860696918890189350721960355460410677203131993419723440382095665713164422367291153108363066159712951217816814873413423853338021627653555202253351957999686659021298525147460016557904084617528199284448056532965033560516083489693334373695545423561715471204868795248569806148395196572046378679014697206
N = 17168634922359080770731181740188997952741812682116912079000170434755630873073792773455352815549564103486063484001457037305375162580861025543369063596825489461609724794798857499401637867986508655873564997664216374116361942711233205374363245780323485119184650145879389879046988234947922412374890843297813248828996855478005656041814919367820336728271583686844991928889831691815821365423570311291064846736832327637944358854661523107817781673029406341843040857813841671405147146887291204140157388049394514390098066284975682117038362207142272098796924412602725857521665773622056312191400612944442008222587867782281556388669
phi = 4292158730589770192682795435047249488185453170529228019750042608688907718268448193363838203887391025871515871000364259326343790645215256385842265899206372365402431198699714374850409466996627163968391249416054093529090485677808301343590811445080871279796162536469847469761747058736980603093722710824453312207182881241846080117790728778291633761198069016865260030288832065807438020772711645648333908622890343009942617559434851450007195025869850769670769715654662127278293639938359741401336592219730356884542179574372134014927006215640945952229142436595334916765255426954857520777553915330597952622785359222832224632624
d = invert(E, phi)
m = pow(c, d, N)
print(long_to_bytes(m))


CTF_2023_27">[HDCTF 2023]爬过小山去看云

image-20231213190801413

希尔密码

image-20231214095617388

这里eightfourtwozeroeightfourtwoonezeroeighteightfourzerotwofourzeroeightfourzeroonezeroonetwofourx 包含了一串数字

翻译后842084210884024084010124 , 只有 02148 云隐密码。

EXP:

python">def de_code(c):
    dic = [chr(i) for i in range(ord("A"), ord("Z") + 1)]
    flag = []
    c2 = [i for i in c.split("0")]
    for i in c2:
        c3 = 0
        for j in i:
            c3 += int(j)
        flag.append(dic[c3 - 1])
    return flag

c = '842084210884024084010124'
print(de_code(c))

# ['N', 'O', 'T', 'F', 'L', 'A', 'G']

CTF_2023md5_61">[LitCTF 2023]md5的破解

image-20231214103751053

md5爆破 少了 13,14,18,34 。

EXP:

python">from Crypto.Util.number import *
from hashlib import md5

enc = b'LitCTF{md5can3derypt213thoughcrsh}'
flag = [0] * 38
key = b'0123456789abcdefghijklmnopqrstuvwxyz'
flag[:13] = enc[:13]
flag[15:18] = enc[13:16]
flag[19:34] = enc[16:31]
flag[35:38] = enc[31:34]
for i in key:
    flag[13] = i
    for j in key:
        flag[14] = j
        for k in key:
            flag[18] = k
            for l in key:
                flag[34] = l
                m = md5(bytes(flag)).hexdigest()
                if m == '496603d6953a15846cd7cc476f146771':
                    print(''.join(chr(x) for x in flag))
# LitCTF{md5can123dexrypt213thoughcrpsh}

[CISCN 2023 初赛]Sign_in_passwd

image-20231214104000115

base换表解码。

第二行是base64码表,有 %3D,%2F,%2B 是Unicode编码,可以换成

python">'GHI3KLMNJOPQRSTUb=cdefghijklmnopWXYZ/12+406789VaqrstuvwxyzABCDEF5'

EXP:

python">import base64

str = 'j2rXjx8yjd=YRZWyTIuwRdbyQdbqR3R9iZmsScutj2iqj3/tidj1jd=D'

string1 = "GHI3KLMNJOPQRSTUb=cdefghijklmnopWXYZ/12+406789VaqrstuvwxyzABCDEF"  # 替换的表

string2 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"

print(base64.b64decode(str.translate(str.maketrans(string1, string2))))

# flag{8e4b2888-6148-4003-b725-3ff0d93a6ee4}

要把最后一个5去掉。


[CISCN 2021初赛]rsa

image-20231214222059050

新知识点挺好的。

我不知道叫什么。RSA已知高位攻击,这个是已知p高位。要利用到一个叫sage的工具。

简单讲一下,

  • 第一部分是e = 3的小明文攻击,轻轻松松
  • 第二部分是共模攻击,轻轻松松
  • 第三部分是已知高位攻击,用sage。具体原理还在学,只是从网上找了脚本。明天具体学习一下。

sage关键代码:

python">from sage.all import *
n = 113432930155033263769270712825121761080813952100666693606866355917116416984149165507231925180593860836255402950358327422447359200689537217528547623691586008952619063846801829802637448874451228957635707553980210685985215887107300416969549087293746310593988908287181025770739538992559714587375763131132963783147
p4=7117286695925472918001071846973900342640107770214858928188419765628151478620236042882657992902
e = 0x10001
pbits = 512
kbits = pbits - p4.nbits()
print(p4.nbits())
p4 = p4 << kbits
PR.<x> = PolynomialRing(Zmod(n))
f = x + p4
roots = f.small_roots(X=2^kbits, beta=0.4)
if roots:
    p = p4+int(roots[0])
    print ("n: ", n)
    print ("p: ", p)
    print ("q: ", n/p)

要用工具,或者在线网站https://sagecell.sagemath.org/

image-20231214233610813

image-20231214233647164

来源:https://blog.csdn.net/m0_57291352/article/details/120675242

EXP:

python">from Crypto.Util.number import *
from gmpy2 import *
import hashlib

txt = b''
c1 = 19105765285510667553313898813498220212421177527647187802549913914263968945493144633390670605116251064550364704789358830072133349108808799075021540479815182657667763617178044110939458834654922540704196330451979349353031578518479199454480458137984734402248011464467312753683234543319955893
e1 = 3
N1 = 123814470394550598363280518848914546938137731026777975885846733672494493975703069760053867471836249473290828799962586855892685902902050630018312939010564945676699712246249820341712155938398068732866646422826619477180434858148938235662092482058999079105450136181685141895955574548671667320167741641072330259009
for i in range(1000):
    if iroot(i * N1 + c1,e1)[1]:
        m = long_to_bytes(iroot(i * N1 + c1,e1)[0])
        print(m)
        txt += m
        break
c2 = 54995751387258798791895413216172284653407054079765769704170763023830130981480272943338445245689293729308200574217959018462512790523622252479258419498858307898118907076773470253533344877959508766285730509067829684427375759345623701605997067135659404296663877453758701010726561824951602615501078818914410959610
c3 = 91290935267458356541959327381220067466104890455391103989639822855753797805354139741959957951983943146108552762756444475545250343766798220348240377590112854890482375744876016191773471853704014735936608436210153669829454288199838827646402742554134017280213707222338496271289894681312606239512924842845268366950
e2 = 17
e3 = 65537
N2 = 111381961169589927896512557754289420474877632607334685306667977794938824018345795836303161492076539375959731633270626091498843936401996648820451019811592594528673182109109991384472979198906744569181673282663323892346854520052840694924830064546269187849702880332522636682366270177489467478933966884097824069977
e, s, t = gcdext(e2, e3)
c = pow(c2, s, N2) * pow(c3, t, N2) % N2
m = long_to_bytes(iroot(c,e)[0])
print(m)
txt += m
c4 = 59213696442373765895948702611659756779813897653022080905635545636905434038306468935283962686059037461940227618715695875589055593696352594630107082714757036815875497138523738695066811985036315624927897081153190329636864005133757096991035607918106529151451834369442313673849563635248465014289409374291381429646
N3 = 113432930155033263769270712825121761080813952100666693606866355917116416984149165507231925180593860836255402950358327422447359200689537217528547623691586008952619063846801829802637448874451228957635707553980210685985215887107300416969549087293746310593988908287181025770739538992559714587375763131132963783147
p = 11437038763581010263116493983733546014403343859218003707512796706928880848035239990740428334091106443982769386517753703890002478698418549777553268906496423
q = 9918033198963879798362329507637256706010562962487329742400933192721549307087332482107381554368538995776396557446746866861247191248938339640876368268930589
phi = (p-1)*(q-1)
d = invert(e3,phi)
m = long_to_bytes(pow(c4,d,N3))
print(m)
txt += m
print(txt)
print(hashlib.md5(txt).hexdigest())

CTF_2019babyRSA_215">[GWCTF 2019]babyRSA

题目:

python">import hashlib
import sympy
from Crypto.Util.number import *

flag = 'GWHT{******}'
secret = '******'

assert(len(flag) == 38)

half = len(flag) / 2

flag1 = flag[:half]
flag2 = flag[half:]

secret_num = getPrime(1024) * bytes_to_long(secret)

p = sympy.nextprime(secret_num)
q = sympy.nextprime(p)

N = p * q

e = 0x10001

F1 = bytes_to_long(flag1)
F2 = bytes_to_long(flag2)

c1 = F1 + F2
c2 = pow(F1, 3) + pow(F2, 3)
assert(c2 < N)

m1 = pow(c1, e, N)
m2 = pow(c2, e, N)

output = open('secret', 'w')
output.write('N=' + str(N) + '\n')
output.write('m1=' + str(m1) + '\n')
output.write('m2=' + str(m2) + '\n')
output.close()

没有考什么,N可以直接分解,得到p和q。之后可以根据RSA计算出c1和c2.

c1和c2再根据z3就可以算出F1和F2了。

注意的是 z3中用的是Int类型,所以要求的c1和c2也要是int类型,原先 c1 = pow(m1,d,N) 这样得出来的c1是 mpz类型的,所以要用int转换。

EXP:

python">from Crypto.Util.number import *
from gmpy2 import *
from z3 import *
p = 797862863902421984951231350430312260517773269684958456342860983236184129602390919026048496119757187702076499551310794177917920137646835888862706126924088411570997141257159563952725882214181185531209186972351469946269508511312863779123205322378452194261217016552527754513215520329499967108196968833163329724620251096080377747699
q = 797862863902421984951231350430312260517773269684958456342860983236184129602390919026048496119757187702076499551310794177917920137646835888862706126924088411570997141257159563952725882214181185531209186972351469946269508511312863779123205322378452194261217016552527754513215520329499967108196968833163329724620251096080377748737
e = 65537
m1=90009974341452243216986938028371257528604943208941176518717463554774967878152694586469377765296113165659498726012712288670458884373971419842750929287658640266219686646956929872115782173093979742958745121671928568709468526098715927189829600497283118051641107305128852697032053368115181216069626606165503465125725204875578701237789292966211824002761481815276666236869005129138862782476859103086726091860497614883282949955023222414333243193268564781621699870412557822404381213804026685831221430728290755597819259339616650158674713248841654338515199405532003173732520457813901170264713085107077001478083341339002069870585378257051150217511755761491021553239
m2=487443985757405173426628188375657117604235507936967522993257972108872283698305238454465723214226871414276788912058186197039821242912736742824080627680971802511206914394672159240206910735850651999316100014691067295708138639363203596244693995562780286637116394738250774129759021080197323724805414668042318806010652814405078769738548913675466181551005527065309515364950610137206393257148357659666687091662749848560225453826362271704292692847596339533229088038820532086109421158575841077601268713175097874083536249006018948789413238783922845633494023608865256071962856581229890043896939025613600564283391329331452199062858930374565991634191495137939574539546
N = p * q
phi = (p - 1) * (q - 1)
d = invert(e,phi)
c1 = int(pow(m1,d,N))
c2 = int(pow(m2,d,N))
s = Solver()
F1,F2 = Ints('F1 F2')
s.add(F1 + F2 == c1)
s.add(F1**3 + F2**3 == c2)
if s.check()==sat:
    print(s.model())
F1 = 1590956290598033029862556611630426044507841845
F2 = 1141553212031156130619789508463772513350070909
flag = b''
flag += long_to_bytes(F1) + long_to_bytes(F2)
print(flag)

http://www.niftyadmin.cn/n/5264461.html

相关文章

CSS新手入门笔记整理:CSS多列布局

列数&#xff1a;column-count 语法 column-count: 取值; 属性值 说明 auto 列数由column-width属性决定&#xff08;默认值&#xff09; n&#xff08;正整数&#xff09; 自动划分为n列 列宽&#xff1a;column-width 语法 column-width: 取值; 属性值 说明 auto…

机器人视觉

视觉控制结合视觉处理和运动控制 关注两个应用 &#xff1a; 目标跟踪object tracking 和 人体跟踪&#xff08;跟随&#xff09; person following 坐标系: 相机坐标系 右手坐标系 相机正前方为 z轴正方向 水平方向为 x轴 垂直方向为 y轴 1. 目标跟…

Web安全-SQL注入常用函数(二)

★★实战前置声明★★ 文章中涉及的程序(方法)可能带有攻击性&#xff0c;仅供安全研究与学习之用&#xff0c;读者将其信息做其他用途&#xff0c;由用户承担全部法律及连带责任&#xff0c;文章作者不承担任何法律及连带责任。 1、MySQL数据库构成 初始化安装MySQL数据库后(…

STM32系统滴答定时器SysTick实现精确ms和us延时

时间记录&#xff1a;2023/12/11 一、时间的计算 STM32F103C8T6单片机为例&#xff0c;系统时钟为72MHz&#xff0c;则一个时钟周期为(1/72M)秒&#xff0c;即1/72us 二、寄存器介绍 &#xff08;1&#xff09;CTRL控制及状态寄存器 位段名称描述16COUNTFLAG当计数到0时,该位置…

代码阅读次数多于编写次数

代码阅读次数多于编写次数 维护者 > 作者 如今这已是程序员的共识&#xff0c;提醒我们初次编写代码不应该为了追求方便而牺牲将来阅读和修改此段代码的人。 “代码的阅读次数多于编写次数”传达的意思是&#xff0c;通过保持代码简单、编写测试和文档等方式来降低维护代…

【SpringBoot】Spring Boot 单体应用升级 Spring Cloud 微服务

Spring Cloud 是在 Spring Boot 之上构建的一套微服务生态体系&#xff0c;包括服务发现、配置中心、限流降级、分布式事务、异步消息等&#xff0c;因此通过增加依赖、注解等简单的四步即可完成 Spring Boot 应用到 Spring Cloud 升级。 Spring Boot 应用升级为 Spring Cloud…

Ansible介绍与安装

Ansible目前是运维自动化工具中最简单、容易上手的一款优秀软件&#xff0c;能够用来管理各种资源。用户可以使用Ansible自动部署应用程序&#xff0c;以此实现IT基础架构的全面部署。例如&#xff0c;借助于Ansible&#xff0c;我们可以轻松地对服务器进行初始化配置、安全基线…

云原生架构总结-读书笔记

云原生架构进阶实战-读书笔记 云原生概念 云原生&#xff08;Cloud Native&#xff09;概念是由Pivotal的Matt Stine在2013年首次提出的。这个概念得到了社区的不断完善&#xff0c;内容越来越丰富&#xff0c;目前已经**包括了DevOps&#xff08;Development和Operations的组…