HNCTF

HNCTF

文章目录

  • HNCTF
    • BabyPQ
    • EZmath
    • ez_Classic
    • f=(?*?)
    • MatrixRSA
    • BabyAES
    • Is this Iso?

BabyPQ

nc签到题,跟端口连接拿到n和phin

n= 83364501002320980990436866711482826016646968100023452408725794986955117709931957044024140298920294618304768663854534751412077760350674221847521356272102345381254712050794570004683574576122632462740260326527527634162716815359259765521372569538966103895628425119277838802391890256082977547347452821431878779439
phin= 83364501002320980990436866711482826016646968100023452408725794986955117709931957044024140298920294618304768663854534751412077760350674221847521356272102326775351973643573896078165088371467025260206640820676779767010492435732872190686870516000484337605905958699104861285763636380159411400510953674956394539424

然后解方程得到p,q

from z3 import *
n= 83364501002320980990436866711482826016646968100023452408725794986955117709931957044024140298920294618304768663854534751412077760350674221847521356272102345381254712050794570004683574576122632462740260326527527634162716815359259765521372569538966103895628425119277838802391890256082977547347452821431878779439
phin= 83364501002320980990436866711482826016646968100023452408725794986955117709931957044024140298920294618304768663854534751412077760350674221847521356272102326775351973643573896078165088371467025260206640820676779767010492435732872190686870516000484337605905958699104861285763636380159411400510953674956394539424
p_add_q=n-phin+1
p=Real('p')
q=Real('q')
solve(p*q==n,
    p+q==p_add_q)
print(p)
print(q)

把p输进去,得到flag

EZmath

正好之前写杭师大的题又遇到类似的

N=p2+q2

那么可以用sage中的two_squares(N)函数,求解出p,q,然后rsa解就行

#sage
N = 14131431108308143454435007577716000559419205062698618708133959457011972529354493686093109431184291126255192573090925119389094648901918393503865225710648658
p,q=two_squares(N)
print(p,q)
#python
from Crypto.Util.number import *
from gmpy2 import *

c = 34992437145329058006346797890363070594973075282993832268508442432592383794878795192132088668900695623924153165395583430068203662437982480669703879475321408183026259569199414707773374072930515794134567251046302713509056391105776219609788157691337060835717732824405538669820477381441348146561989805141829340641
N = 14131431108308143454435007577716000559419205062698618708133959457011972529354493686093109431184291126255192573090925119389094648901918393503865225710648658
p = 82560919832754349126354116140838623696638559109075709234619471489244325313113
q = 85528507672457684655471526239900307861713918212607409966382024323034858694833
n = p*q**3
e=65537
phi=(p-1)*(q-1)*q**2
d=invert(e,phi)
m=pow(c,d,n)
print(long_to_bytes(m))
#H&NCTF{D0_Y0u_know_Complex_n3mbers?hahaha}

sage和python是存在一些不一样的

sage中^表示指数级而在python中^表示异或(老是弄混)

ez_Classic

题目:

hint:

I want to see what 2^11 DNA looks like in SageMath! But I heard that after e, which is often met with everyone in RSA, is subtracted by 1, it may be found in the base family.

密文:

𠣔𠧆𣣠𥪕鶪𢻠𥮚𤪍𥮱𤮵𤶋𦚤𡲪𢫐𢷊𡧕𢛠𦒌蒗𣯠𦖎骩𢻠𥮫𤪍𥢦𤮰𤲋𦚽𠚠𡓝𢷊𦙭𡎸𣛒𣋑𠻔𢛠𤺀𦚽𡾤𢳠𤪐𥪦𦚂𡮨𡻉𣃒𤃈𢻠𦖪𦂟𥢳蒿𣫠𦖢骩𣃠𥮣𤪍𥢱𦚰𡮨𠣉𣃠𥚖𥚤𦖏𥖟𥮀蒴𣫠𦚖𡆤𦙴𢂤𢇆𠛏𢋊𢻠𤲢𥢽𦚫𣂼𢗊𠣊𡟎𣛒𢻠𦚝𡮲𢟠𤾊𤲄𥮸𦂑𥂹𤾜𥮪𥢏𤺪𦚻𡖨𢗟𣧚𠟔𦙏𡲴𣃠骔𣻆𦙯𢚡𢋊𠧆𣫠𥢢𦚭𣾶

一开始看到密文还以为是啥古典加密,搜了一下生僻字方面的,无解

主要看到hint(提示真的很有用,但是我讨厌英文,下次多盯盯提示)

首先题目告诉我们就是古典密码,提示中But I heard that after e, which is often met with everyone in RSA, is subtracted by 1, it may be found in the base family。正常·RSA常用的e是65537,那么65537-1=65536,它可能在base家族中能被找到(好明显的提示啊,想不到/(ㄒoㄒ)/~~)

所以是base65536(好偏的加密,没见过)

Base65536 Decoding Tool Online Free (better-converter.com)

解得:

ԂƃಕԪhਚՍıյŋǤખФʧՓࠌޗOൎߩeਫՍĦҰŋƽࠀݎʧmญҰѬԈࠀȽङঐĦԂਕɘҪȺਪߟڳҿOഢߩeણՍıҰਕɂખФЏߟπմOഖऋtचƛπʜਢƽҫ༪ʟʂΑҰਝಕࡊɄƸՑڹʜɪՏҪȻਏߟڳԁOഖઔeƸoࡠʜƃഢҭඹ

奇怪的字符,肯定也是一种加密,再次看到提示2^11=2048,所以是base2048(这谁想得到,摔桌(╯▔皿▔)╯)

Encode and Decode Base2048 Online Tool | Nerdmosis

解得:

GAC & GCT CTA GTC CTT { CTA AGT AAA CAG CAG AGA AAG & AGT _ AAG CAC CGA ATT CAT TTC _ AGT CAG _ CAG TTC _ AGA ATC CAT TCG CAC ACA CAG CAT @ ATC ACG }

这里就很明显了,DNA的核苷酸序列,有一个DNA加密,拿脚本解密即可

f=(?*?)

首先根据hint:e=65537猜测是rsa加密

然后密文:ve9MPTSrRrq89z+I5EMXZg1uBvHoFWBGuzxhSpIwu9XMxE4H2f2O3l+VBt4wR+MmPJlS9axvH9dCn1KqFUgOIzf4gbMq0MPtRRp+PvfUZWGrJLpxcTjsdml2SS5+My4NIY/VbvqgeH2qVA==

很明显进行了base64加密,进行解密即可

再看到file1和file2,题目是f=(?*?),那么应该是根据这两个文件求到n,或者p,q(到这里一切都没有问题)

but怎么根据这两个文件求就是问题了

真的很难想到,是根据文件中的数字的末尾一位进行拼接,得到二进制数(摔桌╰(‵□′)╯)

这样得到p和q,正常rsa解密即可

import base64
from Crypto.Util.number import *
e = 65537
c = 've9MPTSrRrq89z+I5EMXZg1uBvHoFWBGuzxhSpIwu9XMxE4H2f2O3l+VBt4wR+MmPJlS9axvH9dCn1KqFUgOIzf4gbMq0MPtRRp+PvfUZWGrJLpxcTjsdml2SS5+My4NIY/VbvqgeH2qVA=='
c = bytes_to_long(base64.b64decode(c))
q = ''
p = ''
with open('file1.txt') as f:
    for i in f.readlines():
        if i.strip()[-1] == '1':
            p += '1' 
        else:
            p += '0'

with open('file2.txt') as f:
    for i in f.readlines():
        if i.strip()[-1] == '1':
            q += '1' 
        else:
            q += '0'

p = int(p,2)
q = int(q,2)
n = p * q
phi = (p - 1) * (q - 1)
d = inverse(e,phi)
print(long_to_bytes(pow(c,d,n)))
# H&NCTF{Y0u_s@cce3d3d_in_finding_the_meaning_0f_these_d0cuments}

MatrixRSA

题目:

from Crypto.Util.number import *
import os

flag = b"H&NCTF{??????????????}" + os.urandom(73)

p = getPrime(56)
q = getPrime(56)
n = p * q

part = [bytes_to_long(flag[13*i:13*(i+1)]) for i in range(9)]

M = Matrix(Zmod(n),[
    [part[3*i+j] for j in range(3)] for i in range(3)
])

e = 65537
C = M ** e
print(f"n = {n}")
print(f"C = {list(C)}")

"""
n = 3923490775575970082729688460890203
C = [(1419745904325460721019899475870191, 2134514837568225691829001907289833, 3332081654357483038861367332497335), (3254631729141395759002362491926143, 3250208857960841513899196820302274, 1434051158630647158098636495711534), (2819200914668344580736577444355697, 2521674659019518795372093086263363, 2850623959410175705367927817534010)]
"""

解题分析:

这是一道矩阵RSA,之前都没见过这种

它把明文m填充之后,进行切片,构成一个3*3的矩阵,再在得到的M矩阵基础上乘上e次方

这方面的文章好少啊,但是我还是找到了一篇

『CTF』模 p 非奇异矩阵的群阶的计算 | CN-SEC 中文网

矩阵上的RSA,n是不大的,可以直接分解,主要还是求d的问题

这里我们求d需要通过求模p和模q的群阶,然后相乘得到模n的群阶(类似于phi),以此来求出d,还原出原矩阵,从而得到flag

根据矩阵的大小,确定阶

在这里插入图片描述

根据上图,有:模p的三阶矩阵群的阶为p(p-1)(p+1)(p^2+p+1)

解密代码:

from Crypto.Util.number import *
from gmpy2 import *

n = 3923490775575970082729688460890203
c = [(1419745904325460721019899475870191, 2134514837568225691829001907289833, 3332081654357483038861367332497335), (3254631729141395759002362491926143, 3250208857960841513899196820302274, 1434051158630647158098636495711534), (2819200914668344580736577444355697, 2521674659019518795372093086263363, 2850623959410175705367927817534010)]
e = 65537
p=56891773340056609
q=68964114585148667

#order_p = p*(p-1)*(p+1)*(p^2+p+1)
#order_q = q*(q-1)*(q+1)*(q^2+q+1)
#order = order_p * order_q即phi

phi=p*(p-1)*(p+1)*(p^2+p+1) * q*(q-1)*(q+1)*(q^2+q+1)
d=invert(e,phi)

C=Matrix(Zmod(n),3,3,c)#创建3*3的矩阵
M=C ** d

flag = b""
for i in range(3):
    for j in range(3):
        m = int(M[i,j])
        flag += long_to_bytes(m)
        
print(flag)
#H&NCTF{58bff5c1-4d5f-4010-a84c-8fbe0c0f50e8}

除此之外,还可以套用复数rsa中phi=(p2-1)(q2-1)来求(好像是题目数据的问题)

BabyAES

题目:

from Crypto.Cipher import AES
from Crypto.Util.Padding import pad
from secret import flag
import time
import random

flag = pad(flag,16)
assert b"H&NCTF" in flag

seed = int(time.time())
random.seed(seed)
key = random.randbytes(16)
iv = random.randbytes(16)
aes = AES.new(key,AES.MODE_CBC,iv)
cipher = aes.encrypt(flag)

print(f"cipher = {cipher}")

"""
cipher = b'\x96H_hz\xe7)\x0c\x15\x91c\x9bt\xa4\xe5\xacwch\x92e\xd1\x0c\x9f\x8fH\x05\x9f\x1d\x92\x81\xcc\xe0\x98\x8b\xda\x89\xcf\x92\x01a\xe1B\xfb\x97\xdc\x0cG'
"""

解题分析:

AES的CBC模式加密,key和iv都是随机数产生的

随机数的种子是一个时间的 Unix 时间戳(以秒为单位),并将其转换为整数

时间戳,是从1970年1月1日(UTC/GMT的午夜)开始所经过的秒数(不考虑闰秒),用于表示一个时间点

正常来说,我们可以从时间戳的开始时间一直到目前的时间进行爆破,但是爆破不出来

我们看到文件的创建时间是:2020/8/21 7:57:34

试一下这个时间,成功解密(因为正好随机数的种子就是这个时间戳)

在这里插入图片描述

解密代码:

from datetime import *
from Crypto.Cipher import AES
import time
import random
# 指定时间
# given_time = datetime(2024, 5, 13, 9, 0, 0)
given_time = datetime(2020, 8, 21, 7, 57, 34)
# 转换为时间戳
seed=int(given_time.timestamp())

cipher = b'\x96H_hz\xe7)\x0c\x15\x91c\x9bt\xa4\xe5\xacwch\x92e\xd1\x0c\x9f\x8fH\x05\x9f\x1d\x92\x81\xcc\xe0\x98\x8b\xda\x89\xcf\x92\x01a\xe1B\xfb\x97\xdc\x0cG'

while 1:
    random.seed(seed)
    key = random.randbytes(16)
    iv = random.randbytes(16)
    aes = AES.new(key, AES.MODE_CBC, iv)
    flag = aes.decrypt(cipher)
    if b'H&NCTF' in flag:
        print(flag)
        break
    seed -= 1
#H&NCTF{b1c11bd5-2bfc-404e-a795-a08a002aeb87}

python时间戳的转换:

given_time = datetime(年, 月, 日, 小时, 分钟, 秒)
# 转换为时间戳
seed=int(given_time.timestamp())

Is this Iso?

题目:

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

def nextPrime(p):
    while(not isPrime(p)):
        p += 1
    return p


#part1 gen Fp and init supersingular curve
while(1):
    p = 2^randint(150,200)*3^randint(100,150)*5^randint(50,100)-1
    if(isPrime(p)):
        break

F.<i> = GF(p^2, modulus = x^2 + 1)
E = EllipticCurve(j=F(1728))
assert E.is_supersingular()


#part2 find a random supersingular E
ways = [2,3,5]
for i in range(20):
    P = E(0).division_points(choice(ways))[1:]
    shuffle(P)
    phi = E.isogeny(P[0])
    E = phi.codomain()


#part3 gen E1 E2 E3
E1 = E

deg1 = 2
P = E1(0).division_points(deg1)[1:]
shuffle(P)
phi1 = E1.isogeny(P[0])
E2 = phi1.codomain()

deg2 = choice(ways)
P = E2(0).division_points(deg2)[1:]
shuffle(P)
phi2 = E2.isogeny(P[0])
E3 = phi2.codomain()


#part4 leak
j1 = E1.j_invariant()
j2 = E2.j_invariant()
j3 = E3.j_invariant()

m = bytes_to_long(flag)
n = getPrime(int(j3[0]).bit_length())*nextPrime(int(j3[0]))

print("p =",p)
print("deg1 =",deg1)
print("deg2 =",deg2)
print("leak1 =",j1[0] >> 400 << 400)
print("leak2 =",j1[1] >> 5 << 5)
print("leak3 =",j2[0] >> 5 << 5)
print("leak4 =",j2[1] >> 400 << 400)
print("n =",n)
print("cipher =",pow(m,65537,n))

有点复杂,还在努力中

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

211大学计算机专业不考408,新增的交叉专业却考408!南京农业大学计算机考研考情分析!

南京农业大学信息科技学院可追溯至1981年成立的计算中心和1985年筹建的农业图书情报专业。1987年设立了农业图书情报系&#xff0c;1993 年农业图书情报系更名为信息管理系&#xff0c;本科专业名称也于1999年更名为信息管理与信息系统专业。1994年计算中心开始招收计算机应用专…

SpringBootTest测试框架四

dubbo调用mock 同理,为了实现dubbo的mock,也是要在dubbo调用的过程中添加拦截器 dubbo原始的执行拦截器 Proxy.getProxy(interfaces).newInstance(new InvokerInvocationHandler(invoker)) 这里代码写死了,没办法了,只能将整个JavassistProxyFactory 替换掉 public class J…

Nvidia Orin/Jetson +GMSL/RLINC/VbyOne/FPDLink 同轴AI多相机同步车载视觉解决方案

在本次演讲中&#xff0c;介绍了多相机同步技术在自主机器中的应用情况&#xff0c;围绕无人配送小车、控制器视觉传感器方案升级、人形机器人三个典型案例中如何为客户提供高效的多相机同步解决方案进行了详细的讲解&#xff0c;并进一步介绍如何通过创新的多相机同步技术&…

Facebook的心灵之镜:探寻数字社交的灵魂深处

在当今数字化时代&#xff0c;社交媒体已经成为了人们生活的一部分&#xff0c;而Facebook作为其中的佼佼者&#xff0c;更是承载了数以亿计的用户情感和交流。然而&#xff0c;Facebook不仅仅是一个简单的社交平台&#xff0c;它更像是一面心灵之镜&#xff0c;反映着数字社交…

TS(TypeScript)中Array数组无法调出使用includes方法,显示红色警告

解决方法 打开tsconfig.json文件&#xff0c;添加"lib": ["es7", "dom"]即可。 如下图所示。

基于Qt的网上购物系统的设计与实现

企鹅&#xff1a;2583550535 代码和论文都有 第1章 绪论... 1 1.1 项目背景... 1 1.2 国内外研究现状... 1 1.3 项目开发意义... 3 1.4 报告主要内容... 3 第2章 关键技术介绍... 4 2.1 后端开发技术... 4 2.1.1 C. 4 2.1.2 Qt框架... 4 2.1.3 MySQL数据库... 5 2.2 …

Java开发大厂面试第20讲:什么是分布式锁?Redi 怎样实现的分布式锁?

“锁”是我们实际工作和面试中无法避开的话题之一&#xff0c;正确使用锁可以保证高并发环境下程序的正确执行&#xff0c;也就是说只有使用锁才能保证多人同时访问时程序不会出现问题。 我们本课时的面试题是&#xff0c;什么是分布式锁&#xff1f;如何实现分布式锁&#xf…

DSP开发入门

视频&#xff1a; 创龙TI 最新DSP CPU核心架构 C66x 以及 KeyStone I 架构 DSP TMS320C6655/57以及TMS320C6678视频教程全集_哔哩哔哩_bilibili 2024年硬汉科技手把手教您学DSP28335视频教程持续更新中_哔哩哔哩_bilibili DSP芯片介绍 DSP选型 TI的DSP 分为三大系列&#…

comfyui电商场景工作流总结

eSheep(内测中) - 一站式的AIGC社区eSheep.com 是国内知名的AIGC在线画图网站,提供海量模型,并支持在线AI画图。用户会上传自己的AIGC作品到网站上,进行交流。eSheep让AIGC更轻松,让更多人在AIGC中找到快乐https://www.esheep.com/apphttps://openart.ai/workflows/all

单链表OJ题(课堂总结)

1.链表的带环问题 上图就是一个典型的带环链表 1.1如何判读链表是否带环&#xff1f; 最常见的方法就是利用快慢指针&#xff0c;快指针追加慢指针&#xff0c;当二者相等的时候即可判断链表带环 其实现的代码如下&#xff1a; bool hasCycle(struct ListNode*head) { s…

万博智云×华为云 | HyperBDR云容灾上架,开启联营联运新篇章

日前&#xff0c;万博智云HyperBDR云容灾正式入驻华为云云商店&#xff0c;成为华为云基础软件领域联营联运合作伙伴。通过联营联运&#xff0c;双方将进一步加深在产品、解决方案、渠道拓展等多方面的强强联合&#xff0c;为企业提供更加安全、高效的数据保护解决方案&#xf…

全面解析Java.lang.ClassCastException异常

全面解析Java.lang.ClassCastException异常 全面解析Java.lang.ClassCastException异常&#xff1a;解决方案与最佳实践 &#x1f680;&#x1f4da;摘要引言1. 什么是Java.lang.ClassCastException&#xff1f;代码示例 2. 报错原因2.1 类型不兼容2.2 泛型类型擦除2.3 接口和实…

HTTP -- HTTP概述

HTTP概述 HTTP使用的是可靠的数据传输协议。 web内容都是存储在web服务器上的&#xff0c;web服务器所使用的是http协议&#xff0c;故被称为http服务器。 web服务器是web资源的宿主&#xff0c;web资源是web内容的源头。 因特网上有数以千种的数据类型&#xff0c;http仔细的…

文心智能体之情感领航员:你的智能情感导师

文章目录 引言情感领航员的诞生与定位情感领航员的优势与特点专业性个性化便捷性隐私保护 如何创建自己的智能体创建方式智能体名称和设定基础配置角色与目标指导原则限制澄清个性化 高级配置保存 /发布流量数据分析智能体调优 总结 引言 在现代社会中&#xff0c;情感问题的普…

Docker拉取镜像报错:x509: certificate has expired or is not yet v..

太久没有使用docker进行镜像拉取&#xff0c;今天使用docker-compose拉取mongo发现报错&#xff08;如下图&#xff09;&#xff1a; 报错信息翻译&#xff1a;证书已过期或尚未有效。 解决办法&#xff1a; 1.一般都是证书问题或者系统时间问题导致&#xff0c;可以先执行 da…

电子画册制作技巧,从零基础到专业人士

电子画册作为一种新兴的视觉传达形式&#xff0c;正越来越受到大众的喜爱。从设计新手到专业人士&#xff0c;如何快速掌握电子画册的制作技巧&#xff0c;提升自己的创作水平呢&#xff1f; 一、明确设计目的和定位 制作电子画册前&#xff0c;首先要明确其设计目的和定位。画…

腾盾科创无人机亮相第二十四届新疆农机博览会引发观展热潮

5月25日&#xff0c;第二十四届新疆农业机械博览会、2024“一带一路”智慧农业大会&#xff08;以下简称新疆农机博览会&#xff09;在新疆国际会展中心开幕。展会现场多种农牧业的新装备、新技术集中亮相&#xff0c;其中首次在新疆农机博览会上亮相的腾盾科创无人机产品引发观…

Linux - crond任务调度、at定时任务

1 crontab 进行-定时任务的设置 1&#xff09;概述&#xff1a; 任务调度&#xff1a;是指系统在某个时间执行的特定的命令或程序。 任务调度分类&#xff1a; 系统工作&#xff1a;有些重要的工作必须周而复始地执行。如病毒扫描等个别用户工作&#xff1a;个别用户可能希…

【机器学习300问】101、1x1卷积有什么作用?

卷积神经网络最重要的操作就是卷积层的卷积操作&#xff0c;之前文章中介绍过&#xff0c;卷积核filter往往都是3x3或者5x5什么的&#xff0c;但有一种非常特殊的卷积——1x1卷积。他在CNN中扮演着非常重要的角色。 一、通道维度的降维/升维 这是1x1卷积最显著的作用之一。通过…

GIS 交通线网可视化:优化城市交通管理与规划

图扑 GIS 交通线网可视化可帮助城市规划和交通管理部门做出更精准的决策&#xff0c;提升出行效率和城市整体交通秩序。