2023 HDCTF --- Crypto wp

news2024/12/23 14:32:24

文章目录

      • Normal_Rsa
      • Normal_Rsa(revenge)
      • 爬过小山去看云
      • Math_Rsa

Normal_Rsa

题目:

from Crypto.Util.number import *
#from shin import flag


m=bytes_to_long(b'HDCTF{****************}')
e=65537
p=getPrime(256)
#q=getPrime(512)
q=6704006258427795304220450411280948926213189680360135534636452074716135019217911134480777251273836898349926894302122011679095979445240343891749741039976761
r=getPrime(512)
n=p*q*r
P=pow(p,2,n)
Q=pow(q,2,n)
c=pow(m,e,n)
print(f"P = {P}")
print(f"Q = {Q}")
print(f"n = {n}")
print(f"c = {c}")

P = 6773247693445539441213578786581644136043035242620265251725630106817272212428325283262417364786451280269516220237289567904055371962564710888510272312707201
Q = 44943699913039047357456835559925378512493523252980366265686899925123157887149890185055864945749408514100461655676474535153113631214288057465776668291975220848776401405531599573114898492452990847774628035552581539370236080368457643523158920565504112005843410442573511095306233906498204203659537135943420051121
n = 4785613888465991171479248142015453309149548888755453367991501772592797686075465426815591528773123474962122102667475893532087343900904799831474817826058951265607078893487357878501280782935653048309499430170214015422492927323961394806106719569168457890040223027119115392961801582406287167644266319898276785787730947633037300317098453409851410936140488150390919951503767522517809035474567
c = 2247027561636791381460194811205520085150851211795956750955965051548230844233212462525163107917067768507367576366327035846089534916090521357212722275045521111077106695721780943857231570836500588468487620819893688830570842176795906808347617421353983094639290979158413935035603633331786978227439155042365130799647385116773171906670409535157184391352888875130028955334874727206292146950544

出题人忘记删除代码中的flag,后面上的revenge难度降低了很多。
经计算e和phi(主要是q-1)不互素且为e自身,进而演变为一个有限域开方问题。但是e为65537有点大,直接在GF(q)上不好开,用AMM算法的话会快很多


import random
import math
import libnum
import time
from Crypto.Util.number import bytes_to_long, long_to_bytes

# 设置模数
def GF(a):
    global p
    p = a


# 乘法取模
def g(a, b):
    global p
    return pow(a, b, p)


def AMM(x, e, p):
    GF(p)
    y = random.randint(1, p - 1)
    while g(y, (p - 1) // e) == 1:
        y = random.randint(1, p - 1)
        print(y)
    # p-1 = e^t*s
    t = 1
    s = 0
    while p % e == 0:
        t += 1
        print(t)
    s = p // (e ** t)
    # s|ralpha-1
    k = 1
    while ((s * k + 1) % e != 0):
        k += 1
    alpha = (s * k + 1) // e
    # 计算a = y^s b = x^s h =1
    # h为e次非剩余部分的积
    a = g(y, (e ** (t - 1)) * s)
    b = g(x, e * alpha - 1)
    c = g(y, s)
    h = 1
    #
    for i in range(1, t - 1):
        d = g(b, e ** (t - 1 - i))
        if d == 1:
            j = 0
        else:
            j = -math.log(d, a)
        b = b * (g(g(c, e), j))
        h = h * g(c, j)
        c = g(c, e)
    # return (g(x, alpha * h)) % p
    root = (g(x, alpha * h)) % p
    roots = set()
    for i in range(e):
        mp2 = root * g(a, i) % p
        # assert(g(mp2, e) == x)
        roots.add(mp2)
    return roots



e = 65537

q = 6704006258427795304220450411280948926213189680360135534636452074716135019217911134480777251273836898349926894302122011679095979445240343891749741039976761
c = 2247027561636791381460194811205520085150851211795956750955965051548230844233212462525163107917067768507367576366327035846089534916090521357212722275045521111077106695721780943857231570836500588468487620819893688830570842176795906808347617421353983094639290979158413935035603633331786978227439155042365130799647385116773171906670409535157184391352888875130028955334874727206292146950544

mps = AMM(c, e, q)
for mpp in mps:
    solution = str(long_to_bytes(mpp))
    if 'HDCTF' in solution:
        print(solution)

flag:

HDCTF{0b3663ed-67e4-44e2-aee7-7c2d8665b63c}

Normal_Rsa(revenge)

题目:

from Crypto.Util.number import *
#from shin import flag


m=bytes_to_long(b'HDCTF{******}')
e=65537
p=getPrime(256)
q=getPrime(512)
r=getPrime(512)
n=p*q*r
P=pow(p,2,n)
Q=pow(q,2,n)
c=pow(m,e,n)
print(f"P = {P}")
print(f"Q = {Q}")
print(f"n = {n}")
print(f"c = {c}")

P = 8760210374362848654680470219309962250697808334943036049450523139299289451311563307524647192830909610600414977679146980314602124963105772780782771611415961
Q = 112922164039059900199889201785103245191294292153751065719557417134111270255457254419542226991791126571932603494783040069250074265447784962930254787907978286600866688977261723388531394128477338117384319760669476853506179783674957791710109694089037373611516089267817074863685247440204926676748540110584172821401
n = 12260605124589736699896772236316146708681543140877060257859757789407603137409427771651536724218984023652680193208019939451539427781667333168267801603484921516526297136507792965087544395912271944257535087877112172195116066600141520444466165090654943192437314974202605817650874838887065260835145310202223862370942385079960284761150198033810408432423049423155161537072427702512211122538749
c = 7072137651389218220368861685871400051412849006784353415843217734634414633151439071501997728907026771187082554241548140511778339825678295970901188560688120351732774013575439738988314665372544333857252548895896968938603508567509519521067106462947341820462381584577074292318137318996958312889307024181925808817792124688476198837079551204388055776209441429996815747449815546163371300963785


已知 n = p ∗ q ∗ r , P ≡ p 2   m o d   n , Q ≡ q 2   m o d   n n = p*q*r,P \equiv p^2 \space mod \space n,Q \equiv q^2 \space mod \space n n=pqrPp2 mod n,Qq2 mod n
显然p与q的2次方之后,其大小仍然小于n
那么分别对P,Q开方即可得到p,q。则,r = n//p//q

from Crypto.Util.number import *
import gmpy2


P = 8760210374362848654680470219309962250697808334943036049450523139299289451311563307524647192830909610600414977679146980314602124963105772780782771611415961
Q = 112922164039059900199889201785103245191294292153751065719557417134111270255457254419542226991791126571932603494783040069250074265447784962930254787907978286600866688977261723388531394128477338117384319760669476853506179783674957791710109694089037373611516089267817074863685247440204926676748540110584172821401
n = 12260605124589736699896772236316146708681543140877060257859757789407603137409427771651536724218984023652680193208019939451539427781667333168267801603484921516526297136507792965087544395912271944257535087877112172195116066600141520444466165090654943192437314974202605817650874838887065260835145310202223862370942385079960284761150198033810408432423049423155161537072427702512211122538749
c = 7072137651389218220368861685871400051412849006784353415843217734634414633151439071501997728907026771187082554241548140511778339825678295970901188560688120351732774013575439738988314665372544333857252548895896968938603508567509519521067106462947341820462381584577074292318137318996958312889307024181925808817792124688476198837079551204388055776209441429996815747449815546163371300963785
e = 65537
p = gmpy2.iroot(P,2)[0]
q = gmpy2.iroot(Q,2)[0]
r = n//p//q
phi = (p-1)*(q-1)*(r-1)
d = gmpy2.invert(e,phi)
m = pow(c,d,n)
flag = long_to_bytes(m)
print(flag)
#HDCTF{08c66aa2-f8ea-49a2-a84f-ab9c7999ebb2}

爬过小山去看云

题目:

密文:ymyvzjtxswwktetpyvpfmvcdgywktetpyvpfuedfnzdjsiujvpwktetpyvnzdjpfkjssvacdgywktetpyvnzdjqtincduedfpfkjssne
在山的那头,有3个人,4只鸟,19只羊,11朵云

先hill解密得到
在这里插入图片描述

YOURPINISEIGHTFOURTWOZEROEIGHTFOURTWOONEZEROEIGHTEIGHTFOURZEROTWOFOURZEROEIGHTFOURZEROONEZEROONETWOFOURX

将英文转为对应数字

842084210884024084010124

一眼顶针,云影密码

直接上脚本

yun_dict = {
    1: 'A',
    2: 'B',
    3: 'C',
    4: 'D',
    5: 'E',
    6: 'F',
    7: 'G',
    8: 'H',
    9: 'I',
    10: 'J',
    11: 'K',
    12: 'L',
    13: 'M',
    14: 'N',
    15: 'O',
    16: 'P',
    17: 'Q',
    18: 'R',
    19: 'S',
    20: 'T',
    21: 'U',
    22: 'V',
    23: 'W',
    24: 'X',
    25: 'Y',
    26: 'Z'
}


def yun_decode():
    enc = input("请输入云影密码密文:")
    plus = []
    result = []

    list = enc.split('0')
    for j in list:
        z = 0
        for i in j:
            z = z + int(i)
        plus.append(z)
    for i in plus:
        result.append(yun_dict[i])

    print("结果为:"+"".join(result))

yun_decode()

run一下脚本,得到flag
在这里插入图片描述

Math_Rsa

题目:

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


m=bytes_to_long(flag)
r=getPrime(1024)
assert r%4==3
p=getPrime(1024)
assert pow(p,(r-1)//2,r)==1
q=getPrime(1024)
e=65537
n=p*q
a=pow(p,2,r)
c=pow(m,e,n)
print(f"n = {n}")
print(f"r = {r}")
print(f"a = {a}")
print(f"c = {c}")

n = 14859096721972571275113983218934367817755893152876205380485481243331724183921836088288081702352994668073737901001999266644597320501510110156000004121260529706467596723314403262665291609405901413014268847623323618322794733633701355018297180967414569196496398340411723555826597629318524966741762029358820546567319749619243298957600716201084388836601266780686983787343862081546627427588380349419143512429889606408316907950943872684371787773262968532322073585449855893701828146080616188277162144464353498105939650706920663343245426376506714689749161228876988380824497513873436735960950355105802057279581583149036118078489
r = 145491538843334216714386412684012043545621410855800637571278502175614814648745218194962227539529331856802087217944496965842507972546292280972112841086902373612910345469921148426463042254195665018427080500677258981687116985855921771781242636077989465778056018747012467840003841693555272437071000936268768887299
a = 55964525692779548127584763434439890529728374088765597880759713360575037841170692647451851107865577004136603179246290669488558901413896713187831298964947047118465139235438896930729550228171700578741565927677764309135314910544565108363708736408337172674125506890098872891915897539306377840936658277631020650625
c = 12162333845365222333317364738458290101496436746496440837075952494841057738832092422679700884737328562151621948812616422038905426346860411550178061478808128855882459082137077477841624706988356642870940724988156263550796637806555269282505420720558849717265491643392140727605508756229066139493821648882251876933345101043468528015921111395602873356915520599085461538265894970248065772191748271175288506787110428723281590819815819036931155215189564342305674107662339977581410206210870725691314524812137801739246685784657364132180368529788767503223017329025740936590291109954677092128550252945936759891497673970553062223608

已知 a ≡ p 2   m o d   r , p r − 1 2   m o d   r ≡ 1   m o d   r a \equiv p^2 \space mod \space r,p^{\frac{r-1}{2}} \space mod \space r \equiv 1 \space mod \space r ap2 mod r,p2r1 mod r1 mod r
由于r是一个大素数,而 p 2   m o d   r p^2 \space mod \space r p2 mod r是易计算的,所以我们利用第一个同余式构建一个在模r下的一元多项式环,然后求解p。
可能会存在多个符合条件的p,我们简单判断一下其bit长度是否是1024以及是否是素数即可找到想要的p。

#sage
from Crypto.Util.number import *
import gmpy2
n = 14859096721972571275113983218934367817755893152876205380485481243331724183921836088288081702352994668073737901001999266644597320501510110156000004121260529706467596723314403262665291609405901413014268847623323618322794733633701355018297180967414569196496398340411723555826597629318524966741762029358820546567319749619243298957600716201084388836601266780686983787343862081546627427588380349419143512429889606408316907950943872684371787773262968532322073585449855893701828146080616188277162144464353498105939650706920663343245426376506714689749161228876988380824497513873436735960950355105802057279581583149036118078489
r = 145491538843334216714386412684012043545621410855800637571278502175614814648745218194962227539529331856802087217944496965842507972546292280972112841086902373612910345469921148426463042254195665018427080500677258981687116985855921771781242636077989465778056018747012467840003841693555272437071000936268768887299
a = 55964525692779548127584763434439890529728374088765597880759713360575037841170692647451851107865577004136603179246290669488558901413896713187831298964947047118465139235438896930729550228171700578741565927677764309135314910544565108363708736408337172674125506890098872891915897539306377840936658277631020650625
c = 12162333845365222333317364738458290101496436746496440837075952494841057738832092422679700884737328562151621948812616422038905426346860411550178061478808128855882459082137077477841624706988356642870940724988156263550796637806555269282505420720558849717265491643392140727605508756229066139493821648882251876933345101043468528015921111395602873356915520599085461538265894970248065772191748271175288506787110428723281590819815819036931155215189564342305674107662339977581410206210870725691314524812137801739246685784657364132180368529788767503223017329025740936590291109954677092128550252945936759891497673970553062223608
e = 65537

R.<x> = Zmod(r)[]
f = x^2-a
f = f.monic()
res = f.roots()
for i in res:
    p = int(i[0])
    if p.bit_length()==1024 and isPrime(p)==1:
            print(p)
            break
q = n//p
phi =(p-1)*(q-1)
d = gmpy2.invert(e,phi)
m = pow(c,d,n)
flag = long_to_bytes(int(m))
print(flag)
#HDCTF{0ce04f81-516b-4132-81a2-b0b7166e03ad}

【无法挽留的很多人和事,那么能够留下来的,那就尽量都留下,长长久久,关起门来,仔细藏好,不为人知。】

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

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

相关文章

Revit砌体排砖的几种方法对比

方法简介 传统砌体深化排砖是绘图者使用CAD 软件通过二维想象进行排布&#xff0c;在墙面转角、两面或多面墙相互咬砌的位置&#xff0c;门窗洞口过梁的位置&#xff0c;构造柱等位置由于二维图形的局限性很难观察出排布是否合理。然而复杂区域砌体排布若出错…

这个假期有这些游戏就不怕无聊了

1、塞尔达传说旷野之息 Switch端的优秀游戏体验不容错过&#xff01; 人气王《塞尔达传说》&#xff01; 被玩家誉为“唯一让人长大后有种回到童年的感觉的作品”。 豆瓣网友写道&#xff1a;“在雨夜&#xff0c;我在寺庙里看到了一条白龙划过天空&#xff0c;在岩壁上看到了…

花2个半月吃透这份软件测试核心知识,成功从外包上岸到京东

朋友小故事 受到疫情影响我从过完年从2月份开始学习的一份测试经手册&#xff0c;4月初我成功从我们一个小三线的公司跳槽到了腾讯&#xff0c;虽然等级不高&#xff0c;但是涨薪还是涨了8K&#xff0c;而且去一个大公司多学点东西&#xff0c;对自己的成长还是有好处的。 虽然…

零基础学java——【基础语法】基本输入、输出语句,变量,运算符

目录 变量 数据类型 基本数据类型一览表 声明和初始化 基本的输出、输出语句 输出语句 补充“”的使用 输入语句Scanner 使用步骤 代码演示 运算符 有些内容可能会与c语言作比较 内容借鉴了韩顺平老师的java课堂笔记&#xff08;b站课&#xff09; 变量 数据类型 基本…

云原生技术架构分析+实战【docker篇】

云原生技术架构分析实战 1 云平台推荐与基础操作 ①云平台推荐 国内&#xff1a;阿里云&#xff08;ECS&#xff09;、华为云、腾讯云、青云、百度云等国外&#xff1a;亚马逊AWS、微软Azure等 ②公有云、私有云区别 公有云&#xff1a;第三方云服务厂商提供和运营&#x…

程序员如何提高代码能力?

前言 作为一名程序员&#xff0c;自己的本质工作就是做程序开发&#xff0c;那么程序开发的时候最直接的体现就是代码&#xff0c;检验一个程序员技术水平的一个核心环节就是开发时候的代码能力。众所周知&#xff0c;程序开发的水平提升是一个循序渐进的过程&#xff0c;每一位…

C语言——线索二叉树(前序、中序、后序-附代码)

一、什么是线索二叉树 线索二叉树&#xff08;Threaded Binary Tree&#xff09;是一种特殊的二叉树&#xff0c;通过将空指针改为线索&#xff08;即前驱或后继指针&#xff09;的方式&#xff0c;将二叉树中的空闲指针利用起来&#xff0c;从而实现对二叉树的高效遍历和查找。…

go源码解读-sync.pool

go version 1.19.7 sync.pool 是go 内置的对象池技术&#xff0c; 管理临时对象&#xff0c;这些对象可以单独保存和检索&#xff0c; 减少GC次数 特点&#xff1a;1、 池不可以指定大小 2、 Get 没有的话会新生成一个对象 3、对象的周期取决于GC的周期 从go doc可以看到sync.p…

13、MDK分散加载方式管理多块内存

MDK分散加载: 默认情况下是通过MDK的option选项设置Flash和RAM大小&#xff0c;这种情况下所有的管理工作都是编译来处理的&#xff0c; MDK自动生成的分散加载文件&#xff1a;H7_ProjectTest.sct ; ************************************************************* ; *…

Java_异常

Java_异常 1.什么是异常 ​ 生活中的异常&#xff1a;感冒发烧、电脑蓝屏、手机死机等。 ​ 程序中的异常&#xff1a;磁盘空间不足、网络连接中断、被加载的资源不存在等。 ​ 程序异常解决办法&#xff1a;针对程序中非正常情况&#xff0c;Java语言引入了异常&#xff0…

【C++】类和对象(1)

文章目录 前言浅浅了解一、面向过程和面向对象二、 类和对象的关系三、创建类和对象 逐步深入一、类的访问限定符二、 封装三、类的作用域四、类对象模型五、this指针 前言 浅浅了解 一、面向过程和面向对象 C语言是面向过程的&#xff0c;关注的是过程&#xff0c;分析出求解…

智能汽车开启中央计算革命,全场景智能“车芯”强势崛起

伴随着汽车跨域融合时代的到来&#xff0c;智能汽车芯片正处于快速迭代期&#xff0c;同时牌桌上的玩家也在加速挪换位置。 一方面&#xff0c;包括丰田、大众集团等在内的全球汽车制造商正在进入芯片平台的切换周期&#xff0c;加速推动汽车芯片市场格局的改变。 另一方面&a…

Ubuntu22.04部署eurekaserver集群

Ubuntu22.04部署eurekaserver集群 为了更好的浏览体验&#xff0c;欢迎光顾勤奋的凯尔森同学个人博客http://www.huerpu.cc:7000 每次都启动eureka的项目&#xff0c;太繁琐了&#xff0c;我们把eureka部署到Ubuntu&#xff0c;就可以愉快的玩耍了。 1 配置文件设置 准备了…

设计模式 -- 观察者模式

前言 月是一轮明镜,晶莹剔透,代表着一张白纸(啥也不懂) 央是一片海洋,海乃百川,代表着一块海绵(吸纳万物) 泽是一柄利剑,千锤百炼,代表着千百锤炼(输入输出) 月央泽,学习的一种过程,从白纸->吸收各种知识->不断输入输出变成自己的内容 希望大家一起坚持这个过程,也同…

淘宝天猫数据分析:2023年健康养生三大品类数据分析

随着人们健康意识的不断增强&#xff0c;越来越多的年轻人都开始加入养生大军的队伍中&#xff0c;我国的健康养生产业也迎来了发展机遇。 在天猫平台上&#xff0c;养生茶、养生壶和滋补养生原料是养生市场的几大重点类目&#xff0c;接下来&#xff0c;结合鲸参谋电商数据分析…

Docker 相关概念

1、Docker是什么&#xff1f; 如何确保应用能够在这些环境中运行和通过质量检测&#xff1f;并且在部署过程中不出现令人头疼的版本、配置问题&#xff0c;也无需重新编写代码和进行故障修复&#xff1f; 答案就是使用容器。Docker之所以发展如此迅速&#xff0c;也是因为它对…

电脑硬盘分区合并怎么操作?分享2个方法!

案例&#xff1a;电脑硬盘怎么分区&#xff1f; 【我把我的电脑硬盘分成了多个区域&#xff0c;这样可以方便存储和管理数据。现在我需要调整分区&#xff0c;对分区进行合并&#xff0c;但我不知道该如何操作&#xff0c;有没有小伙伴知道&#xff1f;】 在使用电脑的过程中…

4核8G云服务器4c8g或4h8g指的是什么?

4核8G云服务器什么意思&#xff1f;4c8g或4h8g代表CPU内存配置&#xff0c;4c8g是指4核CPU、8G内存&#xff0c;准确来讲由于是云服务器&#xff0c;4核指的是4核vCPU&#xff0c;4核8G就是指云服务器CPU内存配置。云服务器不只是CPU内存&#xff0c;还有公网带宽和系统盘&…

经典 Learned Index 结构设计及其应用

引言 学习索引是一种新型的索引结构&#xff0c;可以帮助数据库更快地查找数据。学习索引的诞生可以追溯到 2017 年&#xff0c;由 Google Brain 团队的 Kraska 等人在论文[1]中首次提出,探讨了使用神经网络替代传统数据结构&#xff08;如 B-Tree&#xff09;来构建索引的可行…

appuploader 常规使用登录方法

转载&#xff1a;登录appuploader 目录 登录appuploader 常规使用登录方法 双击appuploader.exe 启动appuploader 点击底部的未登录&#xff0c;弹出登录框 在登录框内输入apple开发者账号 如果没有apple开发者账号&#xff0c;只是普通的apple账号&#xff0c;请勾选上未…